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.

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?

UserRevisionLine numberNew 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