Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
LED7segmDual4094.cpp
00001 #include "mbed.h" 00002 #include "LED7segmDual4094.h" 00003 00004 signed char LED7segmDual4094::digitORascii2char (char input, bool dot) { 00005 signed char return7seg = 0; 00006 switch (input) { 00007 case 0: 00008 case '0': 00009 case 'O': 00010 return7seg = 0b00111111; 00011 break; 00012 case '1': 00013 case 1: 00014 return7seg = 0b00000110; 00015 break; 00016 case '2': 00017 case 2: 00018 case 'z': 00019 case 'Z': 00020 return7seg = 0b01011011; 00021 break; 00022 case 3: 00023 case '3': 00024 return7seg = 0b01001111; 00025 break; 00026 case 4: 00027 case '4': 00028 return7seg = 0b01100110; 00029 break; 00030 case 5: 00031 case '5': 00032 return7seg = 0b01101101; 00033 break; 00034 case 6: 00035 case '6': 00036 return7seg = 0b01111100; 00037 break; 00038 case 7: 00039 case '7': 00040 return7seg = 0b00000111; 00041 break; 00042 case 8: 00043 case '8': 00044 return7seg = 0b01111111; 00045 break; 00046 case 9: 00047 case '9': 00048 return7seg = 0b01100111; 00049 break; 00050 case 'a': 00051 case 'A': 00052 return7seg = 0b01110111; 00053 break; 00054 case 'b': 00055 case 'B': 00056 return7seg = 0b01111100; 00057 break; 00058 case 'c': 00059 return7seg = 0b01011000; 00060 break; 00061 case 'C': 00062 return7seg = 0b00111001; 00063 break; 00064 case 'd': 00065 case 'D': 00066 return7seg = 0b01011110; 00067 break; 00068 case 'e': 00069 return7seg = 0b01111011; 00070 break; 00071 case 'E': 00072 return7seg = 0b01111001; 00073 break; 00074 case 'f': 00075 case 'F': 00076 return7seg = 0b01110001; 00077 break; 00078 case 'g': 00079 return7seg = 0b01101111; 00080 case 'G': 00081 return7seg = 0b00111101; 00082 break; 00083 case 'h': 00084 return7seg = 0b01110100; 00085 break; 00086 case 'H': 00087 return7seg = 0b01110110; 00088 break; 00089 case 'i': 00090 return7seg = 0b00010000; 00091 break; 00092 case 'I': 00093 return7seg = 0b00110000; 00094 break; 00095 case 'j': 00096 return7seg = 0b00001111; 00097 break; 00098 case 'J': 00099 return7seg = 0b00011111; 00100 break; 00101 case 'k': 00102 return7seg = 0b01111000; 00103 break; 00104 case 'l': 00105 return7seg = 0b00110000; 00106 break; 00107 case 'L': 00108 return7seg = 0b00111000; 00109 break; 00110 case 'm': 00111 case 'n': 00112 return7seg = 0b01010100; 00113 break; 00114 case 'N': 00115 case 'M': 00116 return7seg = 0b00110111; 00117 break; 00118 case 'o': 00119 return7seg = 0b01011100; 00120 break; 00121 case 'p': 00122 case 'P': 00123 return7seg = 0b01110011; 00124 break; 00125 case 'r': 00126 case 'R': 00127 return7seg = 0b01010000; 00128 break; 00129 case 's': 00130 case 'S': 00131 return7seg = 0b01101101; 00132 break; 00133 case 'q': 00134 case 'Q': 00135 return7seg = 0b01100111; 00136 break; 00137 case 't': 00138 case 'T': 00139 return7seg = 0b01111000; 00140 break; 00141 case 'u': 00142 return7seg = 0b00011100; 00143 break; 00144 case 'U': 00145 return7seg = 0b00111110; 00146 break; 00147 case 'v': 00148 case 'V': 00149 return7seg = 0b00111100; 00150 break; 00151 case 'w': 00152 case 'W': 00153 return7seg = 0b01001001; 00154 break; 00155 case 'x': 00156 case 'X': 00157 return7seg = 0b01110110; 00158 break; 00159 case 'y': 00160 case 'Y': 00161 return7seg = 0b01101110; 00162 break; 00163 case ' ': 00164 return7seg = 0b00000000; 00165 break; 00166 default: 00167 return7seg = -1; 00168 break; 00169 } 00170 if (dot) return7seg |= (1 << 7); 00171 // else clearing the dot ? 00172 return return7seg; 00173 } 00174 00175 LED7segmDual4094::LED7segmDual4094(PinName data, PinName clock, PinName strobe, char numOfSegments): _data(data), _clock(clock), _strobe(strobe) { 00176 whichSegmMux = 0; 00177 _numOfSegments = numOfSegments; 00178 fb = new char [_numOfSegments]; 00179 _anodesBitMask = new unsigned int[_numOfSegments]; 00180 for (unsigned int i = 0; i < numOfSegments; i++) 00181 _anodesBitMask[i] = ( 1 << i ); 00182 } 00183 void LED7segmDual4094::setAnodesBitMask(unsigned int *tab) { 00184 for (char i = 0; i < _numOfSegments; i++) 00185 _anodesBitMask[i] = tab[i]; 00186 }; 00187 void LED7segmDual4094::draw(void){ // a version with no arguments is for internal (i.e. private) use only. the other one is exposed publicly. 00188 if (_anodesActiveState) 00189 load = 0; 00190 else load = ~0; 00191 for (char i = 0; i < 8; i++) { 00192 if ((fb[whichSegmMux] >> i) & 0x1) load |= 1 << ( 8 + i); 00193 else load &= ~(1 << (8+i)); 00194 } 00195 if (!_anodesActiveState) { 00196 load &= ~_anodesBitMask[(_numOfSegments-1) - whichSegmMux]; 00197 /*for (int i = 0; i < _numOfSegments; i++) 00198 if (whichSegmMux != (_numOfSegments - 1) - i) // when ""if(whichSegmMux != i)"" then reverse direction of printing. 00199 load |= _anodesBitMask[i]; 00200 //load &= ~(_anodesBitMask[(_numOfSegments-1) - whichSegmMux]); 00201 */ 00202 } else 00203 load |= 1 << (_numOfSegments - whichSegmMux); // sets a bit indicating which segment to light up (connect kathode (or anode, I mean positive rail)) 00204 send4094(load); 00205 if (++whichSegmMux > (_numOfSegments - 1)) whichSegmMux = 0; 00206 } 00207 /* void LED7segmDual4094::draw(char *tab) { 00208 // whichSegmMux equals 0 on start thanks to the header file. || which segment for multiplexing 00209 if (_anodesActiveState) 00210 load = 0; 00211 else load = ~0; 00212 for (char i = 0; i < 8; i++) { 00213 if ((tab[whichSegmMux] >> i) & 0x1) load |= 1 << ( 8 + i); 00214 else load &= ~(1 << (8+i)); 00215 } 00216 if (!_anodesActiveState) { 00217 load &= ~_anodesBitMask[(_numOfSegments-1) - whichSegmMux]; 00218 //for (int i = 0; i < _numOfSegments; i++) 00219 // if (whichSegmMux != (_numOfSegments - 1) - i) // when ""if(whichSegmMux != i)"" then reverse direction of printing. 00220 // load |= _anodesBitMask[i]; 00221 //load &= ~(_anodesBitMask[(_numOfSegments-1) - whichSegmMux]); 00222 // 00223 } else 00224 load |= 1 << (_numOfSegments - whichSegmMux); // sets a bit indicating which segment to light up (connect kathode (or anode, I mean positive rail)) 00225 send4094(load); 00226 if (++whichSegmMux > (_numOfSegments - 1)) whichSegmMux = 0; 00227 } 00228 */ 00229 00230 void LED7segmDual4094::send4094(unsigned short _load) { // this shit is straight from the datasheet, just loading these 16bits to two daisy-chained 4094 shift registers 00231 _strobe = 0; 00232 for (signed char _i = 15; _i >= 0; _i--) { 00233 _data = (_load >> _i) & 0x1 ; 00234 _clock = 0; 00235 _clock = 1; 00236 } 00237 _strobe = 1; 00238 } 00239 00240 void LED7segmDual4094::setAnodesActiveState(bool state) { 00241 _anodesActiveState = state; 00242 }
Generated on Tue Jul 12 2022 17:45:04 by
1.7.2