Princeton PT6964 LED controller supports 4 Digits @ 13 Segments, 5 Digits @ 12 Segments, 6 Digits @ 11 Segments or 7 Digits @ 10 Segments. Also supports a scanned keyboard of upto 20 keys. SPI bus interface.

Dependents:   mbed_PT6964

Princeton PT6964 LED controller supports 4 Digits @ 13 Segments, 5 Digits @ 12 Segments, 6 Digits @ 11 Segments or 7 Digits @ 10 Segments. Also supports a scanned keyboard of upto 20 keys. SPI bus interface.

See Component page here.

Revision:
1:1adf993a3e34
Parent:
0:27f32a087e5a
Child:
2:eaf2f5d1af34
diff -r 27f32a087e5a -r 1adf993a3e34 PT6964.cpp
--- a/PT6964.cpp	Sat Nov 21 16:43:15 2015 +0000
+++ b/PT6964.cpp	Sat Jan 09 13:40:06 2016 +0000
@@ -1,5 +1,7 @@
 /* mbed PT6964 Library, for PT6964 LED controller
  * Copyright (c) 2015, v01: WH, Initial version
+ *               2015, v02: WH, rename Digit/Grid 
+ *               2016, v03: WH, updated Icon handling, UDCs and _putc() 
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -277,40 +279,43 @@
     return _columns;
 }
 
-    
+
 /** Clear the screen and locate to 0
-  */
-void PT6964_DVD538A::cls() {
-  
-#if(0)
-  //clear local buffer (including Icons)
-  for (int idx = 0; idx < DVD538A_NR_GRIDS; idx++) {
-    _displaybuffer[(idx<<1)]     = 0x00;  
-    _displaybuffer[(idx<<1) + 1] = 0x00;      
+  * @param bool clrAll Clear Icons also (default = false)
+  */ 
+void PT6964_DVD538A::cls(bool clrAll) {  
+
+  if (clrAll) {
+    //clear local buffer (including Icons)
+    for (int idx=0; idx < (DVD538A_NR_GRIDS << 1); idx++) {
+      _displaybuffer[idx] = 0x00;  
+    }
+  }  
+  else {
+    //clear local buffer (preserving Icons)
+    for (int idx=0; idx < DVD538A_NR_GRIDS; idx++) {
+      _displaybuffer[(idx<<1)]     = _displaybuffer[(idx<<1)]     & MASK_ICON_GRID[idx][0];  
+      _displaybuffer[(idx<<1) + 1] = _displaybuffer[(idx<<1) + 1] & MASK_ICON_GRID[idx][1];
+    }  
   }
-#else
-  //clear local buffer (preserving Icons)
-  for (int idx = DVD538A_DIG1_IDX; idx < (DVD538A_DIG1_IDX + DVD538A_NR_DIGITS); idx++) {    
-    _displaybuffer[(idx<<1)]     = _displaybuffer[(idx<<1)]     & LO(S_ICON_MSK);  
-    _displaybuffer[(idx<<1) + 1] = _displaybuffer[(idx<<1) + 1] & HI(S_ICON_MSK);      
-  }
-#endif  
 
   writeData(_displaybuffer, (DVD538A_NR_GRIDS*2));
 
   _column = 0;   
-}    
+}     
+
 
 /** Set Icon
   *
-  * @param Icon icon Enums Icon has Grid position encoded in 16 MSBs, Icon pattern encoded in 16 LSBs
+  * @param Icon icon Enums Icon has Grid position encoded in 8 MSBs, Icon pattern encoded in 16 LSBs
   * @return none
   */
 void PT6964_DVD538A::setIcon(Icon icon) {
   int addr, icn;
 
-   icn =         icon  & 0xFFFF;
-  addr = ((icon >> 16) & 0xFFFF) - 1; 
+   icn =        icon  & 0xFFFF;
+  addr = (icon >> 24) & 0xFF; 
+  addr = (addr - 1) << 1;     
     
   //Save char...and set bits for icon to write
   _displaybuffer[addr]   = _displaybuffer[addr]   | LO(icn);      
@@ -320,15 +325,16 @@
 
 /** Clr Icon
   *
-  * @param Icon icon Enums Icon has Grid position encoded in 16 MSBs, Icon pattern encoded in 16 LSBs
+  * @param Icon icon Enums Icon has Grid position encoded in 8 MSBs, Icon pattern encoded in 16 LSBs
   * @return none
   */
 void PT6964_DVD538A::clrIcon(Icon icon) {
   int addr, icn;
 
-   icn =         icon  & 0xFFFF;
-  addr = ((icon >> 16) & 0xFFFF) - 1; 
-    
+  icn =        icon  & 0xFFFF;
+  addr = (icon >> 24) & 0xFF; 
+  addr = (addr - 1) << 1;     
+
   //Save char...and clr bits for icon to write
   _displaybuffer[addr]   = _displaybuffer[addr]   & ~LO(icn);      
   _displaybuffer[addr+1] = _displaybuffer[addr+1] & ~HI(icn);      
@@ -349,90 +355,77 @@
   }
   // Mask out Icon bits?
 
-  _UDC_16S[udc_idx][0] = LO(udc_data);
-  _UDC_16S[udc_idx][1] = HI(udc_data);
+  _UDC_7S[udc_idx] = udc_data;
 }
 
+
 /** Write a single character (Stream implementation)
   */
 int PT6964_DVD538A::_putc(int value) {
-  int addr;
+    int addr;
+    bool validChar = false;
+    short pattern  = 0x0000;
     
     if ((value == '\n') || (value == '\r')) {
       //No character to write
+      validChar = false;
       
       //Update Cursor      
       _column = 0;
+    } 
+    else if (value == '-') {
+      //No character to write
+      validChar = true;
+      pattern = C7_MIN;         
     }
     else if ((value >= 0) && (value < DVD538A_NR_UDC)) {
       //Character to write
-      addr = (DVD538A_DIG1_IDX + ((DVD538A_NR_DIGITS - 1) - _column)) << 1; 
-      
-      //Save icons...and set bits for character to write
-      _displaybuffer[addr]   = (_displaybuffer[addr]   & LO(S_ICON_MSK)) | _UDC_16S[value][0];      
-      _displaybuffer[addr+1] = (_displaybuffer[addr+1] & HI(S_ICON_MSK)) | _UDC_16S[value][1];      
-      writeData(_displaybuffer, (DVD538A_NR_GRIDS*2));
-               
-      //Update Cursor
-      _column++;
-      if (_column > (DVD538A_NR_DIGITS - 1)) {
-        _column = 0;
-      }          
+      validChar = true;
+      pattern = _UDC_7S[value];
     }  
     else if ((value >= (int)'0') && (value <= (int) '9')) {   
       //Character to write
-      value = value - (int) '0';
-      addr = (DVD538A_DIG1_IDX + ((DVD538A_NR_DIGITS - 1) - _column)) << 1; 
-      
+      validChar = true;
+      pattern = FONT_7S[value - (int) '0'];
+    }
+    else if ((value >= (int) 'A') && (value <= (int) 'F')) {   
+      //Character to write
+      validChar = true;
+      pattern = FONT_7S[10 + value - (int) 'A'];
+    }
+    else if ((value >= (int) 'a') && (value <= (int) 'f')) {   
+      //Character to write
+      validChar = true;
+      pattern = FONT_7S[10 + value - (int) 'a'];
+    } //else
+
+    if (validChar) {
+      //Character to write
+ 
+      //Translate between _column and displaybuffer entries
+      //_column == 0 => Grid5 => addr = 8
+      //_column == 1 => Grid4 => addr = 6
+      //_column == 2 => Grid3 => addr = 4
+      //_column == 3 => Grid4 => addr = 2            
+      addr = (4 - _column) << 1;
+
       //Save icons...and set bits for character to write
-      _displaybuffer[addr]   = (_displaybuffer[addr]   & LO(S_ICON_MSK)) | FONT_7S[value][0];      
-      _displaybuffer[addr+1] = (_displaybuffer[addr+1] & HI(S_ICON_MSK)) | FONT_7S[value][1];      
+      _displaybuffer[addr]   = (_displaybuffer[addr]   & MASK_ICON_GRID[4 - _column][0]) | LO(pattern);
+      _displaybuffer[addr+1] = (_displaybuffer[addr+1] & MASK_ICON_GRID[4 - _column][1]) | HI(pattern);
+
       writeData(_displaybuffer, (DVD538A_NR_GRIDS*2));
-               
+                                
       //Update Cursor
       _column++;
       if (_column > (DVD538A_NR_DIGITS - 1)) {
         _column = 0;
       }
-    }            
-    else if ((value >= (int) 'A') && (value <= (int) 'F')) {   
-      //Character to write
-      value = 10 + value - (int) 'A';
-      addr = (DVD538A_DIG1_IDX + ((DVD538A_NR_DIGITS - 1) - _column)) << 1; 
-      
-      //Save icons...and set bits for character to write
-      _displaybuffer[addr]   = (_displaybuffer[addr]   & LO(S_ICON_MSK)) | FONT_7S[value][0];      
-      _displaybuffer[addr+1] = (_displaybuffer[addr+1] & HI(S_ICON_MSK)) | FONT_7S[value][1];      
-      writeData(_displaybuffer, (DVD538A_NR_GRIDS*2));
-               
-      //Update Cursor
-      _column++;
-      if (_column > (DVD538A_NR_DIGITS - 1)) {
-        _column = 0;
-      }
-    }  
-    else if ((value >= (int) 'a') && (value <= (int) 'f')) {   
-      //Character to write
-      value = 10 + value - (int) 'a';
-      addr = (DVD538A_DIG1_IDX + ((DVD538A_NR_DIGITS - 1) - _column)) << 1; 
-      
-      //Save icons...and set bits for character to write
-      _displaybuffer[addr]   = (_displaybuffer[addr]   & LO(S_ICON_MSK)) | FONT_7S[value][0];      
-      _displaybuffer[addr+1] = (_displaybuffer[addr+1] & HI(S_ICON_MSK)) | FONT_7S[value][1];      
-      writeData(_displaybuffer, (DVD538A_NR_GRIDS*2));
-               
-      //Update Cursor
-      _column++;
-      if (_column > (DVD538A_NR_DIGITS - 1)) {
-        _column = 0;
-      }          
 
-    } //else
+    } // if validChar           
 
     return value;
 }
 
-
 // get a single character (Stream implementation)
 int PT6964_DVD538A::_getc() {
     return -1;