Mateusz Grzywacz / LED7segmDual4094
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LED7segmDual4094.cpp Source File

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 }