Dynamic Lighting Lib. of 7Seg-LED (add DP) x4. Features: - Unified Anode/Cathode and NPN/PNP sw. - Non-use wait(); Useing Interrupt Timer. - Modulates Brightness with PWM. - Display Hex. - Using BusOut(s) of Digits(4) and Segments(8). - Sinmple Interface of Class.
LED7segX4.h@1:e89aae394d29, 2018-04-18 (annotated)
- Committer:
- AkinoriHashimoto
- Date:
- Wed Apr 18 09:18:11 2018 +0000
- Revision:
- 1:e89aae394d29
- Parent:
- 0:51d1da4a6b6a
change seg '9'.; d-seg added. (0x67 -> 0x6F)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AkinoriHashimoto | 0:51d1da4a6b6a | 1 | /** |
AkinoriHashimoto | 0:51d1da4a6b6a | 2 | * Dynamic Lighting Lib. of 7Seg-LED (add DP) x4. |
AkinoriHashimoto | 0:51d1da4a6b6a | 3 | * |
AkinoriHashimoto | 0:51d1da4a6b6a | 4 | * Features: |
AkinoriHashimoto | 0:51d1da4a6b6a | 5 | * - Unified Anode/Cathode common 7Segs, and NPN/PNP switchings. |
AkinoriHashimoto | 0:51d1da4a6b6a | 6 | * - Using BusOut(s) of Digits(0-3) and Segments(A-G,DP). |
AkinoriHashimoto | 1:e89aae394d29 | 7 | * - Simple Interface of Class. |
AkinoriHashimoto | 0:51d1da4a6b6a | 8 | * - Non-use wait(); Useing Interrupt Timer: Ticker and Timeut. |
AkinoriHashimoto | 0:51d1da4a6b6a | 9 | * - Modulates Brightness; You Can Control of Periodic-Time and Duty. |
AkinoriHashimoto | 0:51d1da4a6b6a | 10 | * - Display Hex(0-9,A-F) of 4 Digit; Using char[4]. |
AkinoriHashimoto | 0:51d1da4a6b6a | 11 | */ |
AkinoriHashimoto | 0:51d1da4a6b6a | 12 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 13 | /** @code |
AkinoriHashimoto | 0:51d1da4a6b6a | 14 | #include "mbed.h" |
AkinoriHashimoto | 0:51d1da4a6b6a | 15 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 16 | #include "LED7segX4.h" |
AkinoriHashimoto | 0:51d1da4a6b6a | 17 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 18 | // port make. |
AkinoriHashimoto | 0:51d1da4a6b6a | 19 | BusOut pDgit(p21, p22, p23, p24); // D1, D2, D3, D4 |
AkinoriHashimoto | 0:51d1da4a6b6a | 20 | BusOut pSeg(p11, p12, p13, p14, p15, p16, p17, p18); // A, B, C, D, E, F, G, DP |
AkinoriHashimoto | 0:51d1da4a6b6a | 21 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 22 | // Make instance of 7Seg-class. |
AkinoriHashimoto | 0:51d1da4a6b6a | 23 | LED7segX4 led7seg(pDgit, pSeg); |
AkinoriHashimoto | 0:51d1da4a6b6a | 24 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 25 | // for Operation check. |
AkinoriHashimoto | 0:51d1da4a6b6a | 26 | DigitalOut myled(LED1); |
AkinoriHashimoto | 0:51d1da4a6b6a | 27 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 28 | int main() { |
AkinoriHashimoto | 0:51d1da4a6b6a | 29 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 30 | char val[4]; |
AkinoriHashimoto | 0:51d1da4a6b6a | 31 | char dp; |
AkinoriHashimoto | 0:51d1da4a6b6a | 32 | int duty; |
AkinoriHashimoto | 0:51d1da4a6b6a | 33 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 34 | // In this case: Anode Common, PNP swiching for Dig-common, |
AkinoriHashimoto | 0:51d1da4a6b6a | 35 | // and sink port(BusOut) for seg. |
AkinoriHashimoto | 0:51d1da4a6b6a | 36 | led7seg.init(true, true, 1000, 40); |
AkinoriHashimoto | 0:51d1da4a6b6a | 37 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 38 | val[0]= 0; |
AkinoriHashimoto | 0:51d1da4a6b6a | 39 | val[1]= 0; |
AkinoriHashimoto | 0:51d1da4a6b6a | 40 | val[2]= 0; |
AkinoriHashimoto | 0:51d1da4a6b6a | 41 | val[3]= 0; |
AkinoriHashimoto | 0:51d1da4a6b6a | 42 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 43 | led7seg.set7seg(val); |
AkinoriHashimoto | 0:51d1da4a6b6a | 44 | led7seg.setDP(0b0001); |
AkinoriHashimoto | 0:51d1da4a6b6a | 45 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 46 | while(true) { |
AkinoriHashimoto | 0:51d1da4a6b6a | 47 | myled = !myled; |
AkinoriHashimoto | 0:51d1da4a6b6a | 48 | wait_ms(30); |
AkinoriHashimoto | 0:51d1da4a6b6a | 49 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 50 | if(++duty > 100) |
AkinoriHashimoto | 0:51d1da4a6b6a | 51 | duty= 30; |
AkinoriHashimoto | 0:51d1da4a6b6a | 52 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 53 | val[3] += 1; |
AkinoriHashimoto | 0:51d1da4a6b6a | 54 | for(int i= 0; i < 3; i++){ |
AkinoriHashimoto | 0:51d1da4a6b6a | 55 | if(val[3-i] > 15){ |
AkinoriHashimoto | 0:51d1da4a6b6a | 56 | if(i < 3){ |
AkinoriHashimoto | 0:51d1da4a6b6a | 57 | val[3-i]= 0; |
AkinoriHashimoto | 0:51d1da4a6b6a | 58 | val[2-i] += 1; |
AkinoriHashimoto | 0:51d1da4a6b6a | 59 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 60 | dp += 1; |
AkinoriHashimoto | 0:51d1da4a6b6a | 61 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 62 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 63 | if(val[0]==15 && val[1]==15 && val[2]==15 && val[3]==15){ |
AkinoriHashimoto | 0:51d1da4a6b6a | 64 | // = FFFF |
AkinoriHashimoto | 0:51d1da4a6b6a | 65 | val[0]= 0; |
AkinoriHashimoto | 0:51d1da4a6b6a | 66 | val[1]= 0; |
AkinoriHashimoto | 0:51d1da4a6b6a | 67 | val[2]= 0; |
AkinoriHashimoto | 0:51d1da4a6b6a | 68 | val[3]= 0; |
AkinoriHashimoto | 0:51d1da4a6b6a | 69 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 70 | if(dp > 0b1111) |
AkinoriHashimoto | 0:51d1da4a6b6a | 71 | dp= 0; |
AkinoriHashimoto | 0:51d1da4a6b6a | 72 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 73 | led7seg.set7seg(val); |
AkinoriHashimoto | 0:51d1da4a6b6a | 74 | led7seg.setDP(dp); |
AkinoriHashimoto | 0:51d1da4a6b6a | 75 | led7seg.setPWM(1000, duty); |
AkinoriHashimoto | 0:51d1da4a6b6a | 76 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 77 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 78 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 79 | return 0; |
AkinoriHashimoto | 0:51d1da4a6b6a | 80 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 81 | * @endcode |
AkinoriHashimoto | 0:51d1da4a6b6a | 82 | */ |
AkinoriHashimoto | 0:51d1da4a6b6a | 83 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 84 | #pragma once |
AkinoriHashimoto | 0:51d1da4a6b6a | 85 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 86 | #include "mbed.h" |
AkinoriHashimoto | 0:51d1da4a6b6a | 87 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 88 | class LED7segX4{ |
AkinoriHashimoto | 0:51d1da4a6b6a | 89 | public: |
AkinoriHashimoto | 0:51d1da4a6b6a | 90 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 91 | /** Constructor |
AkinoriHashimoto | 0:51d1da4a6b6a | 92 | * @param BusOut; _portDig: Bus4 of Digit(3~0) |
AkinoriHashimoto | 0:51d1da4a6b6a | 93 | * @param BusOut; _portSeg: Bus8 of Segment(a~g+dp) |
AkinoriHashimoto | 0:51d1da4a6b6a | 94 | */ |
AkinoriHashimoto | 0:51d1da4a6b6a | 95 | LED7segX4(BusOut &portDig, BusOut &portSeg); |
AkinoriHashimoto | 0:51d1da4a6b6a | 96 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 97 | ~LED7segX4(); |
AkinoriHashimoto | 0:51d1da4a6b6a | 98 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 99 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 100 | /** Initialize |
AkinoriHashimoto | 0:51d1da4a6b6a | 101 | * @param bool; dig: Reverce(H/L) Digit(3~0) |
AkinoriHashimoto | 0:51d1da4a6b6a | 102 | * @param bool; seg: Reverce(H/L) Segment(a~g+dp) |
AkinoriHashimoto | 0:51d1da4a6b6a | 103 | * @param int; timePeriod[us]: time of priend in PWM. |
AkinoriHashimoto | 0:51d1da4a6b6a | 104 | * @param int; duty[%]: duty of PWM. |
AkinoriHashimoto | 0:51d1da4a6b6a | 105 | */ |
AkinoriHashimoto | 0:51d1da4a6b6a | 106 | void init(bool revDig= false, bool revSeg= false, int timePeriod= 1000, int duty= 80); |
AkinoriHashimoto | 0:51d1da4a6b6a | 107 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 108 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 109 | /** set seg TYPE; |
AkinoriHashimoto | 0:51d1da4a6b6a | 110 | * @param bool; dig: Digit(3~0) |
AkinoriHashimoto | 0:51d1da4a6b6a | 111 | * @param bool; seg: Segment(a~g+dp) |
AkinoriHashimoto | 0:51d1da4a6b6a | 112 | */ |
AkinoriHashimoto | 0:51d1da4a6b6a | 113 | void setReverse(bool dig, bool seg); |
AkinoriHashimoto | 0:51d1da4a6b6a | 114 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 115 | /** Set 7seg. |
AkinoriHashimoto | 0:51d1da4a6b6a | 116 | * @param chr[4]; D3~D1, 0x00(0)~0x15(F) and 0x16(OFF/NULL). |
AkinoriHashimoto | 0:51d1da4a6b6a | 117 | */ |
AkinoriHashimoto | 0:51d1da4a6b6a | 118 | void set7seg(char chr[]); |
AkinoriHashimoto | 0:51d1da4a6b6a | 119 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 120 | /** Set DotPoint. |
AkinoriHashimoto | 0:51d1da4a6b6a | 121 | * @param chr; 0b0000~0b1111, bit0~3; TRUE=1. |
AkinoriHashimoto | 0:51d1da4a6b6a | 122 | */ |
AkinoriHashimoto | 0:51d1da4a6b6a | 123 | void setDP(char chr); |
AkinoriHashimoto | 0:51d1da4a6b6a | 124 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 125 | /** Set PWM (Britness). |
AkinoriHashimoto | 0:51d1da4a6b6a | 126 | * @param int; periodic time [us]. "for Each Digit." |
AkinoriHashimoto | 0:51d1da4a6b6a | 127 | * @param int; duty ratio;1~100[%] in timePeriod. |
AkinoriHashimoto | 0:51d1da4a6b6a | 128 | * ex) In case of 1,000us and 60%, |
AkinoriHashimoto | 0:51d1da4a6b6a | 129 | */ |
AkinoriHashimoto | 0:51d1da4a6b6a | 130 | void setPWM(int timePeriod, int duty); |
AkinoriHashimoto | 0:51d1da4a6b6a | 131 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 132 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 133 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 134 | private: |
AkinoriHashimoto | 0:51d1da4a6b6a | 135 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 136 | // ********************** Variable ****************************** |
AkinoriHashimoto | 0:51d1da4a6b6a | 137 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 138 | // pin/port set |
AkinoriHashimoto | 0:51d1da4a6b6a | 139 | BusOut &_portDig; |
AkinoriHashimoto | 0:51d1da4a6b6a | 140 | BusOut &_portSeg; |
AkinoriHashimoto | 0:51d1da4a6b6a | 141 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 142 | // TimerIRQ 4 PWM |
AkinoriHashimoto | 0:51d1da4a6b6a | 143 | Ticker ticker; // Duty : Bright |
AkinoriHashimoto | 0:51d1da4a6b6a | 144 | Timeout timeout; // Duty : OFF |
AkinoriHashimoto | 0:51d1da4a6b6a | 145 | float _dutySec; // Duty(Bright) Time-width [s], in 1 period. |
AkinoriHashimoto | 0:51d1da4a6b6a | 146 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 147 | // Define |
AkinoriHashimoto | 0:51d1da4a6b6a | 148 | char _def7seg[17]; // Define Segment; 0~f + 16:OFF(Null) |
AkinoriHashimoto | 0:51d1da4a6b6a | 149 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 150 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 151 | // Local Hold Val |
AkinoriHashimoto | 0:51d1da4a6b6a | 152 | char _seg7[5]; // 4+Null ex) 2.3E5 -> 2, 3, 14, 5 |
AkinoriHashimoto | 0:51d1da4a6b6a | 153 | char _dp; // 0b0000~0b1111; ex) 12.3E. -> 0b0101 |
AkinoriHashimoto | 0:51d1da4a6b6a | 154 | bool _revDig; // REVERSE H/L 4 Transistor swDigit |
AkinoriHashimoto | 0:51d1da4a6b6a | 155 | bool _revSeg; // AND swSeg |
AkinoriHashimoto | 0:51d1da4a6b6a | 156 | int _currentDigit; // current digit-Num (0~3). This shifts in timeperiod of PWM. |
AkinoriHashimoto | 0:51d1da4a6b6a | 157 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 158 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 159 | // ********************** Internal Function ********************* |
AkinoriHashimoto | 0:51d1da4a6b6a | 160 | void init_def7seg(); // Set/Define of seg pattern. |
AkinoriHashimoto | 0:51d1da4a6b6a | 161 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 162 | // For DUTY of PWM. ON(Shift) and OFF. |
AkinoriHashimoto | 0:51d1da4a6b6a | 163 | void OnSet(); |
AkinoriHashimoto | 0:51d1da4a6b6a | 164 | void OffSet(); |
AkinoriHashimoto | 0:51d1da4a6b6a | 165 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 166 | }; |
AkinoriHashimoto | 0:51d1da4a6b6a | 167 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 168 | // EOF |