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.cpp@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 | #include "LED7segX4.h" |
AkinoriHashimoto | 0:51d1da4a6b6a | 2 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 3 | LED7segX4::LED7segX4(BusOut &portDig, BusOut &portSeg) |
AkinoriHashimoto | 0:51d1da4a6b6a | 4 | : _portDig(portDig), _portSeg(portSeg) |
AkinoriHashimoto | 0:51d1da4a6b6a | 5 | { |
AkinoriHashimoto | 0:51d1da4a6b6a | 6 | return; |
AkinoriHashimoto | 0:51d1da4a6b6a | 7 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 8 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 9 | LED7segX4::~LED7segX4() |
AkinoriHashimoto | 0:51d1da4a6b6a | 10 | { |
AkinoriHashimoto | 0:51d1da4a6b6a | 11 | return; |
AkinoriHashimoto | 0:51d1da4a6b6a | 12 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 13 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 14 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 15 | void LED7segX4::init(bool revDig, bool revSeg, int timePeriod, int duty) |
AkinoriHashimoto | 0:51d1da4a6b6a | 16 | { |
AkinoriHashimoto | 0:51d1da4a6b6a | 17 | for(int i= 0; i < 5; i++) |
AkinoriHashimoto | 0:51d1da4a6b6a | 18 | _seg7[i]= NULL; |
AkinoriHashimoto | 0:51d1da4a6b6a | 19 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 20 | init_def7seg(); |
AkinoriHashimoto | 0:51d1da4a6b6a | 21 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 22 | this->setReverse(revDig, revSeg); |
AkinoriHashimoto | 0:51d1da4a6b6a | 23 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 24 | this->setPWM(timePeriod, duty); |
AkinoriHashimoto | 0:51d1da4a6b6a | 25 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 26 | return; |
AkinoriHashimoto | 0:51d1da4a6b6a | 27 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 28 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 29 | void LED7segX4::setReverse(bool dig, bool seg) |
AkinoriHashimoto | 0:51d1da4a6b6a | 30 | { |
AkinoriHashimoto | 0:51d1da4a6b6a | 31 | _revDig= dig; |
AkinoriHashimoto | 0:51d1da4a6b6a | 32 | _revSeg= seg; |
AkinoriHashimoto | 0:51d1da4a6b6a | 33 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 34 | return; |
AkinoriHashimoto | 0:51d1da4a6b6a | 35 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 36 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 37 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 38 | void LED7segX4::init_def7seg() |
AkinoriHashimoto | 0:51d1da4a6b6a | 39 | { |
AkinoriHashimoto | 0:51d1da4a6b6a | 40 | _def7seg[0]= 0x3F; // 0 |
AkinoriHashimoto | 0:51d1da4a6b6a | 41 | _def7seg[1]= 0x06; |
AkinoriHashimoto | 0:51d1da4a6b6a | 42 | _def7seg[2]= 0x5B; |
AkinoriHashimoto | 0:51d1da4a6b6a | 43 | _def7seg[3]= 0x4F; |
AkinoriHashimoto | 0:51d1da4a6b6a | 44 | _def7seg[4]= 0x66; |
AkinoriHashimoto | 0:51d1da4a6b6a | 45 | _def7seg[5]= 0x6D; |
AkinoriHashimoto | 0:51d1da4a6b6a | 46 | _def7seg[6]= 0x7D; |
AkinoriHashimoto | 0:51d1da4a6b6a | 47 | _def7seg[7]= 0x27; |
AkinoriHashimoto | 0:51d1da4a6b6a | 48 | _def7seg[8]= 0x7F; |
AkinoriHashimoto | 1:e89aae394d29 | 49 | _def7seg[9]= 0x6F; // 9 |
AkinoriHashimoto | 0:51d1da4a6b6a | 50 | _def7seg[10]= 0x77; // A |
AkinoriHashimoto | 0:51d1da4a6b6a | 51 | _def7seg[11]= 0x7C; // b |
AkinoriHashimoto | 0:51d1da4a6b6a | 52 | _def7seg[12]= 0x39; // C |
AkinoriHashimoto | 0:51d1da4a6b6a | 53 | _def7seg[13]= 0x5E; // d |
AkinoriHashimoto | 0:51d1da4a6b6a | 54 | _def7seg[14]= 0x79; // E |
AkinoriHashimoto | 0:51d1da4a6b6a | 55 | _def7seg[15]= 0x71; // F |
AkinoriHashimoto | 0:51d1da4a6b6a | 56 | _def7seg[16]= 0x00; |
AkinoriHashimoto | 0:51d1da4a6b6a | 57 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 58 | return; |
AkinoriHashimoto | 0:51d1da4a6b6a | 59 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 60 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 61 | void LED7segX4::OnSet() |
AkinoriHashimoto | 0:51d1da4a6b6a | 62 | { |
AkinoriHashimoto | 0:51d1da4a6b6a | 63 | static char tmp; |
AkinoriHashimoto | 0:51d1da4a6b6a | 64 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 65 | if(++_currentDigit >= 4) |
AkinoriHashimoto | 0:51d1da4a6b6a | 66 | _currentDigit= 0; |
AkinoriHashimoto | 0:51d1da4a6b6a | 67 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 68 | // ** SELECT DIGIT. |
AkinoriHashimoto | 0:51d1da4a6b6a | 69 | tmp= 0b1000 >> _currentDigit; |
AkinoriHashimoto | 0:51d1da4a6b6a | 70 | if(_revDig) |
AkinoriHashimoto | 0:51d1da4a6b6a | 71 | tmp ^= 0xff; |
AkinoriHashimoto | 0:51d1da4a6b6a | 72 | _portDig = tmp; // set BusOut |
AkinoriHashimoto | 0:51d1da4a6b6a | 73 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 74 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 75 | // ** SET current PATTERN of 7SEG. |
AkinoriHashimoto | 0:51d1da4a6b6a | 76 | tmp= _seg7[_currentDigit]; // 0-9, a-f, 16(NULL) |
AkinoriHashimoto | 0:51d1da4a6b6a | 77 | tmp= _def7seg[tmp]; // ex. 6:0x7D |
AkinoriHashimoto | 0:51d1da4a6b6a | 78 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 79 | // -- set DP |
AkinoriHashimoto | 0:51d1da4a6b6a | 80 | if(_dp & (0b0001 << _currentDigit) ) |
AkinoriHashimoto | 0:51d1da4a6b6a | 81 | tmp |= 0x80; // DP: b7 |
AkinoriHashimoto | 0:51d1da4a6b6a | 82 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 83 | if(_revSeg) |
AkinoriHashimoto | 0:51d1da4a6b6a | 84 | tmp ^= 0xff; |
AkinoriHashimoto | 0:51d1da4a6b6a | 85 | _portSeg= tmp; // set Bus |
AkinoriHashimoto | 0:51d1da4a6b6a | 86 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 87 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 88 | // *** Atach TimeOut for Modulated Brightness *** |
AkinoriHashimoto | 0:51d1da4a6b6a | 89 | if(_dutySec != -1) |
AkinoriHashimoto | 0:51d1da4a6b6a | 90 | timeout.attach(this, &LED7segX4::OffSet, _dutySec); |
AkinoriHashimoto | 0:51d1da4a6b6a | 91 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 92 | return; |
AkinoriHashimoto | 0:51d1da4a6b6a | 93 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 94 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 95 | void LED7segX4::OffSet() |
AkinoriHashimoto | 0:51d1da4a6b6a | 96 | { |
AkinoriHashimoto | 0:51d1da4a6b6a | 97 | static char tmp; |
AkinoriHashimoto | 0:51d1da4a6b6a | 98 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 99 | tmp= 0b0000; |
AkinoriHashimoto | 0:51d1da4a6b6a | 100 | if(_revDig) |
AkinoriHashimoto | 0:51d1da4a6b6a | 101 | tmp ^= 0xff; |
AkinoriHashimoto | 0:51d1da4a6b6a | 102 | _portDig = tmp; // set BusOut |
AkinoriHashimoto | 0:51d1da4a6b6a | 103 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 104 | tmp= 0x00; |
AkinoriHashimoto | 0:51d1da4a6b6a | 105 | if(_revSeg) |
AkinoriHashimoto | 0:51d1da4a6b6a | 106 | tmp= 0xff; |
AkinoriHashimoto | 0:51d1da4a6b6a | 107 | _portSeg= tmp; // set BusOut |
AkinoriHashimoto | 0:51d1da4a6b6a | 108 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 109 | return; |
AkinoriHashimoto | 0:51d1da4a6b6a | 110 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 111 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 112 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 113 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 114 | // ********************************************** |
AkinoriHashimoto | 0:51d1da4a6b6a | 115 | // Public Interface Set Function |
AkinoriHashimoto | 0:51d1da4a6b6a | 116 | // ********************************************** |
AkinoriHashimoto | 0:51d1da4a6b6a | 117 | void LED7segX4::set7seg(char chr[]) |
AkinoriHashimoto | 0:51d1da4a6b6a | 118 | { |
AkinoriHashimoto | 0:51d1da4a6b6a | 119 | // 0~3 REVERCE |
AkinoriHashimoto | 0:51d1da4a6b6a | 120 | for(int i= 0; i < 4; i++) |
AkinoriHashimoto | 0:51d1da4a6b6a | 121 | _seg7[i]= chr[3-i]; |
AkinoriHashimoto | 0:51d1da4a6b6a | 122 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 123 | return; |
AkinoriHashimoto | 0:51d1da4a6b6a | 124 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 125 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 126 | void LED7segX4::setDP(char chr) |
AkinoriHashimoto | 0:51d1da4a6b6a | 127 | { |
AkinoriHashimoto | 0:51d1da4a6b6a | 128 | _dp= chr; |
AkinoriHashimoto | 0:51d1da4a6b6a | 129 | return; |
AkinoriHashimoto | 0:51d1da4a6b6a | 130 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 131 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 132 | void LED7segX4::setPWM(int timePeriod, int duty) |
AkinoriHashimoto | 0:51d1da4a6b6a | 133 | { |
AkinoriHashimoto | 0:51d1da4a6b6a | 134 | if(duty <= 0){ |
AkinoriHashimoto | 0:51d1da4a6b6a | 135 | ticker.detach(); // detach |
AkinoriHashimoto | 0:51d1da4a6b6a | 136 | this->OffSet(); |
AkinoriHashimoto | 0:51d1da4a6b6a | 137 | return; |
AkinoriHashimoto | 0:51d1da4a6b6a | 138 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 139 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 140 | _dutySec= timePeriod* 1e-6* (duty / 100.0); |
AkinoriHashimoto | 0:51d1da4a6b6a | 141 | if(duty >= 100) |
AkinoriHashimoto | 0:51d1da4a6b6a | 142 | _dutySec= -1; |
AkinoriHashimoto | 0:51d1da4a6b6a | 143 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 144 | ticker.attach(this, &LED7segX4::OnSet, timePeriod* 1e-6); |
AkinoriHashimoto | 0:51d1da4a6b6a | 145 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 146 | return; |
AkinoriHashimoto | 0:51d1da4a6b6a | 147 | } |
AkinoriHashimoto | 0:51d1da4a6b6a | 148 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 149 | |
AkinoriHashimoto | 0:51d1da4a6b6a | 150 | // EOF |