6 x 7 segment display library for PCA9637 driven breakout board
Dependents: FTSE100 InternetDispBoB digitalThermometer Counter ... more
Diff: dispBoB.cpp
- Revision:
- 12:2235c72db927
- Parent:
- 11:5e97be74f4d1
- Child:
- 13:38780808dc2f
--- a/dispBoB.cpp Fri Jul 01 08:28:28 2011 +0000 +++ b/dispBoB.cpp Fri Jul 01 16:28:56 2011 +0000 @@ -6,26 +6,27 @@ #include "PCA9635.h" #include "dispBoB.h" + static const char loc[] = {0x02, 0x02, 0x04, 0x04, 0x10, 0x10, 0x12, 0x12}; static const short dispL[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x1008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0xC006, 0x600C, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x0000, + 0x0000, 0x1008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0xC006, 0x600C, 0x0000, 0x0000, 0x0000, 0x0001, 0x1000, 0x0000, 0xE00E, 0x2008, 0xC00D, 0x600D, 0x200B, 0x6007, 0xE007, 0x200E, 0xE00F, 0x600F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0xF001, 0xE003, 0xC001, 0xE009, 0xC007, 0x8007, 0x600F, 0xA003, 0x8000, 0x6008, 0xA007, 0x3008, 0xA005, 0xA001, 0xE001, - 0x800F, 0x300F, 0x8001, 0x6007, 0xC003, 0xE000, 0xE000, 0xE004, 0xA00B, 0x600B, 0xC00D, 0xC006, 0x0000, 0x600C, 0x0000, 0x4000, + 0x0000, 0xE00D, 0xE003, 0xC001, 0xE009, 0xC007, 0x8007, 0x600F, 0xA003, 0x8000, 0x6008, 0xA007, 0xC002, 0xA005, 0xA001, 0xE001, + 0x800F, 0x200F, 0x8001, 0x6007, 0xC003, 0xE000, 0xE000, 0xE004, 0xA00B, 0x600B, 0xC00D, 0xC006, 0x0000, 0x600C, 0x0000, 0x4000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC006, 0x0000, 0x600C, 0x0000, 0x0000 }; static const short dispR[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0C60, 0x06C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, + 0x0000, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0C60, 0x06C0, 0x0000, 0x0000, 0x0000, 0x0010, 0x0100, 0x0000, 0x0EE0, 0x0280, 0x0CD0, 0x06D0, 0x02B0, 0x0670, 0x0E70, 0x02E0, 0x0EF0, 0x06F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0F10, 0x0E30, 0x0C10, 0x0E90, 0x0C70, 0x0870, 0x06F0, 0x0A30, 0x0800, 0x0680, 0x0A70, 0x0380, 0x0A50, 0x0A10, 0x0E10, - 0x08F0, 0x03F0, 0x0810, 0x0670, 0x0C30, 0x0E00, 0x0E00, 0x0E40, 0x0AB0, 0x06B0, 0x0CD0, 0x0C60, 0x0000, 0x06C0, 0x0000, 0x0400, + 0x0000, 0x0ED0, 0x0E30, 0x0C10, 0x0E90, 0x0C70, 0x0870, 0x06F0, 0x0A30, 0x0800, 0x0680, 0x0A70, 0x0C20, 0x0A50, 0x0A10, 0x0E10, + 0x08F0, 0x02F0, 0x0810, 0x0670, 0x0C30, 0x0E00, 0x0E00, 0x0E40, 0x0AB0, 0x06B0, 0x0CD0, 0x0C60, 0x0000, 0x06C0, 0x0000, 0x0400, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0000, 0x06C0, 0x0000, 0x0000 }; @@ -34,13 +35,17 @@ string nullArray = " "; dispBoB::dispBoB(PinName sda, PinName scl, PinName en): _pca(sda, scl), _en(en) { + init(); +} +void dispBoB::init(void){ //initiate - call this whenever the system needs to be reset _en = 0; _pca.init(loc[0]); } -void dispBoB::cls(void){ +void dispBoB::cls(void){ //clear screen and screen buffers for(int j = 0; j < 8; j++){ locate(j); + element[j] = 0x0000; _pca.bus(0x0000); } locate(0); @@ -49,24 +54,47 @@ void dispBoB::locate(char pos){ _pca.setAddress(loc[pos]); _cursor = pos; - _pos = pos; } int dispBoB::_putc(int c){ - if(_pos>5) return -1; + if(_cursor>6){ + _cursor++; + return -1; //skip if exceeds display size allow extra '.' in 6th >> to place in 5th + } - if(_cursor & 1){ - element[_cursor] = dispR[toupper(c)]; + if(c=='.'){ //choose not to print a '.' outside the display bounds + if(_cursor>6){ + _cursor++; + return -1; + } + if((_cursor==0)&&((element[_cursor]&0x1000)==0x1000)) element[_cursor] = 0x0000; + if(_cursor!=0) _cursor--; + if(((element[_cursor]&0x1000)==0x1000)||((element[_cursor]&0x0100)==0x0100)){ + _cursor++; + element[_cursor]=0x0000; + } + } else { + if(_cursor>5){ //for non '.' chars at end of line, flag up overflow and don't print + _cursor++; + return -1; + } + element[_cursor]=0x0000; //reset an element before pasting a char other than '.' + } + + if(_cursor & 1){ //look up char >> element conversion and paste to display + element[_cursor] |= dispR[toupper(c)]; } else { - element[_cursor] = dispL[toupper(c)]; + element[_cursor] |= dispL[toupper(c)]; } int i = _cursor/2; - ppair[i] = element[(2*i)] + element[(2*i)+1]; - _pca.bus(ppair[i]); + ppair[i] = element[(2*i)] + element[(2*i)+1]; //combine left and right elements into a form readable by the PCA9635 + + _pca.setAddress(loc[_cursor]); //set location to paste to + bus(ppair[i]); //sned data tp PCA9635 - locate(_pos+1); - + locate(_cursor+1); //allow cursor to be in element[6], decision of what to do + //is made at the start of the putc() algo. depending on char. return c; } @@ -75,15 +103,19 @@ } void dispBoB::scroll(string str, float speed){ - char buffer[6]; - str.insert(0, nullArray); + char buffer[12]; //instantiate a 12 element buffer array + str.insert(0, nullArray); //paste 6 zeros at either end of string str.insert(str.length(), nullArray); - for(int k = 0; k < str.length(); k++){ - str.copy(buffer, 6, k); - locate(0); - printf("%s", buffer); - wait(speed); + for(int k = 0; k < str.length(); k++){ + str.copy(buffer, 12, k); //mask a 12 element buffer starting at k + locate(0); //locate to position 0 + printf("%s", buffer); //print buffer to display + if((element[0]&0x1000)==0x1000){ //if position zero has two characters i.e. char + '.' + if(element[0]!=0x1000)k++; //then treat as one + else; + } + wait(speed); //hold frame for duration of speed x milliseconds } }