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.
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.
Diff: PT6964.cpp
- 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;
PT6964 LED controller (70 LEDs max), Keyboard scan (20 keys max)