6 x 7 segment display library for PCA9637 driven breakout board

Dependents:   FTSE100 InternetDispBoB digitalThermometer Counter ... more

Files at this revision

API Documentation at this revision

Comitter:
d_worrall
Date:
Fri Jul 01 16:28:56 2011 +0000
Parent:
11:5e97be74f4d1
Child:
13:38780808dc2f
Commit message:
version7

Changed in this revision

dispBoB.cpp Show annotated file Show diff for this revision Revisions of this file
dispBoB.h Show annotated file Show diff for this revision Revisions of this file
--- 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
     }
 }
 
--- a/dispBoB.h	Fri Jul 01 08:28:28 2011 +0000
+++ b/dispBoB.h	Fri Jul 01 16:28:56 2011 +0000
@@ -39,7 +39,12 @@
     */
     dispBoB(PinName sda, PinName scl, PinName en);
     
-    //output control
+    //Output control
+    
+    /** Initialise device
+    *
+    */
+    void init(void);
     /** Clear screen
     *
     */
@@ -85,7 +90,6 @@
     PCA9635 _pca;
     DigitalOut _en;
     char _cursor; 
-    char _pos;
 };
 
 #endif