Library for TM1650 LED controller (32 LEDs max, 28 keys max)

Dependents:   mbed_TM1650

See here for more info.

Files at this revision

API Documentation at this revision

Comitter:
wim
Date:
Tue Oct 10 18:38:46 2017 +0000
Commit message:
Library for TM1650 LED controller (32 LEDs max, 27 keys max)

Changed in this revision

Font_7Seg.cpp Show annotated file Show diff for this revision Revisions of this file
Font_7Seg.h Show annotated file Show diff for this revision Revisions of this file
TM1650.cpp Show annotated file Show diff for this revision Revisions of this file
TM1650.h Show annotated file Show diff for this revision Revisions of this file
TM1650_Config.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 4430a1559b4f Font_7Seg.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Font_7Seg.cpp	Tue Oct 10 18:38:46 2017 +0000
@@ -0,0 +1,166 @@
+/* mbed LED Font Library, for TM1650 LED controller
+ * Copyright (c) 2017, v01: WH, Initial version, Test in MEIBAI
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include "Font_7Seg.h"
+
+// Select one of the testboards for TM1650 LED controller
+#if ((MEIBAI_TEST == 1) || (TM1650_TEST == 1))
+
+//Mask for blending out and restoring Icons
+const char MASK_ICON_GRID[] = {
+                                LO(S7_ICON_GR1),
+                                LO(S7_ICON_GR2),
+                                LO(S7_ICON_GR3),
+                                LO(S7_ICON_GR4),
+                                LO(S7_ICON_GR5),
+                                LO(S7_ICON_GR6)                                                                
+                              };
+
+// ASCII Font definition table for transmission to TM1650
+//
+//#define FONT_7S_START     0x20
+//#define FONT_7S_END       0x7F
+//#define FONT_7S_NR_CHARS (FONT_7_END - FONT_7S_START + 1)
+
+#if (SHOW_ASCII == 1)
+//display all ASCII characters
+const short FONT_7S[]  = { 
+                             C7_SPC, //32 0x20, Space
+                             C7_EXC,
+                             C7_QTE,
+                             C7_HSH,
+                             C7_DLR,
+                             C7_PCT,
+                             C7_AMP,
+                             C7_ACC,
+                             C7_LBR,
+                             C7_RBR,                   
+                             C7_MLT,                            
+                             C7_PLS,
+                             C7_CMA,
+                             C7_MIN,
+                             C7_DPT,                             
+                             C7_RS,
+                             C7_0,   //48 0x30
+                             C7_1,
+                             C7_2,
+                             C7_3,
+                             C7_4,                   
+                             C7_5,
+                             C7_6,
+                             C7_7,
+                             C7_8,
+                             C7_9,
+                             C7_COL, //58 0x3A
+                             C7_SCL,
+                             C7_LT,
+                             C7_EQ,
+                             C7_GT,
+                             C7_QM,                             
+                             C7_AT,  //64 0x40
+                             C7_A,   //65 0x41, A
+                             C7_B,
+                             C7_C,
+                             C7_D,
+                             C7_E,
+                             C7_F,
+                             C7_G,
+                             C7_H,
+                             C7_I,
+                             C7_J,                   
+                             C7_K,
+                             C7_L,
+                             C7_M,
+                             C7_N,
+                             C7_O,
+                             C7_P,
+                             C7_Q,
+                             C7_R,
+                             C7_S,
+                             C7_T,
+                             C7_U,
+                             C7_V,
+                             C7_W,
+                             C7_X,
+                             C7_Y,
+                             C7_Z,   //90 0x5A, Z
+                             C7_SBL, //91 0x5B
+                             C7_LS,
+                             C7_SBR,
+                             C7_PWR,
+                             C7_UDS,  
+                             C7_ACC,                             
+                             C7_A,   //97 0x61, A replacing a
+                             C7_B,
+                             C7_C,
+                             C7_D,
+                             C7_E,
+                             C7_F,
+                             C7_G,
+                             C7_H,
+                             C7_I,
+                             C7_J,                   
+                             C7_K,
+                             C7_L,
+                             C7_M,
+                             C7_N,
+                             C7_O,
+                             C7_P,
+                             C7_Q,
+                             C7_R,
+                             C7_S,
+                             C7_T,
+                             C7_U,
+                             C7_V,
+                             C7_W,
+                             C7_X,
+                             C7_Y,
+                             C7_Z,   // 122 0x7A, Z replacing z
+                             C7_CBL, // 123 0x7B
+                             C7_OR,
+                             C7_CBR,
+                             C7_TLD,
+                             C7_DEL  // 127                             
+                        };
+ 
+#else
+//display only digits and hex characters
+const short FONT_7S[] = { 
+                           C7_0, //48 0x30
+                           C7_1,
+                           C7_2,
+                           C7_3,
+                           C7_4,                   
+                           C7_5,
+                           C7_6,
+                           C7_7,
+                           C7_8,
+                           C7_9,
+                           C7_A, //65 0x41, A
+                           C7_B,
+                           C7_C,
+                           C7_D,
+                           C7_E,
+                           C7_F
+                        };// 127
+#endif
+  
+#endif 
\ No newline at end of file
diff -r 000000000000 -r 4430a1559b4f Font_7Seg.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Font_7Seg.h	Tue Oct 10 18:38:46 2017 +0000
@@ -0,0 +1,255 @@
+/* mbed LED Font Library, for TM1650 LED Controller
+ * Copyright (c) 2017, v01: WH, Initial version, Test in MEIBAI
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef MBED_FONT_7SEG_H
+#define MBED_FONT_7SEG_H
+
+// Select one of the testboards for TM1650 controller
+#include "TM1650_Config.h"
+
+#if ((MEIBAI_TEST == 1) || (TM1650_TEST == 1))
+// Segment bit positions for 7 Segment display using the MEIBAI and ROBOTDYN mapping for TM1650
+// Modify this table for different 'bit-to-segment' mappings. The ASCII character defines and the FONT_7S const table below 
+// will be adapted automatically according to the bit-to-segment mapping. Obviously this will only work when the segment
+// mapping is identical for every digit position. This will be the case unless the hardware designer really hates software developers.
+//
+//            A
+//          -----
+//         |     |     
+//       F |     | B    
+//         |  G  |     
+//          -----
+//         |     |     
+//       E |     | C    
+//         |     |     
+//          -----   * DP
+//            D  
+//
+#define S7_A    0x0001
+#define S7_B    0x0002
+#define S7_C    0x0004
+#define S7_D    0x0008
+#define S7_E    0x0010
+#define S7_F    0x0020
+#define S7_G    0x0040 
+#define S7_DP   0x0080 
+
+//Mask for blending out and setting 7 segments digits
+#define MASK_7S_ALL = (S7_A | S7_B | S7_C | S7_D | S7_E | S7_F | S7_G}
+
+//The CATALAX mapping between Digit positions or Columns (Left to Right) and Grids (ie memory address) are:
+//The column numbers are:
+//   0   1   2   3
+//The Grids are:
+//  GR1 GR2 GR3 GR4
+//The memory addresses are:
+//   0   1   2   3
+
+
+//The ROBOTDYN mapping between Digit positions or columns (Left to Right) and Grids (ie memory address) are:
+//The column numbers are:
+//   0   1   2   3   4   5
+//The Grids are:
+//  GR3 GR2 GR1 GR6 GR5 GR4
+//The memory addresses are:
+//   2   1   0   5   4   3
+
+
+//The EYEWINK mapping between Digit positions or columns (Left to Right) and Grids (ie memory address) are:
+//The column numbers are:
+//   0   1   2   3   4   5
+//The Grids are:
+//  GR1 GR2 GR3 GR4 GR5 GR6
+//The memory addresses are:
+//   0   1   2   3   4   5
+
+
+//Icons Grid 1
+#define S7_DP1  0x0080
+#define S7_ICON_GR1 (0x0000)
+//#define S7_ICON_GR1 (S7_DP1)
+
+//Icons Grid 2
+#define S7_DP2  0x0080
+#define S7_COL2 0x0080
+#define S7_ICON_GR2 (0x0000)
+//#define S7_ICON_GR2 (S7_DP2)
+
+//Icons Grid 3
+#define S7_DP3  0x0080
+#define S7_ICON_GR3 (0x0000)
+//#define S7_ICON_GR3 (S7_DP3)
+
+//Icons Grid 4
+#define S7_DP4  0x0080
+#define S7_ICON_GR4 (0x0000)
+//#define S7_ICON_GR4 (S7_DP4)
+
+//Icons Grid 5
+#define S7_DP5  0x0080
+#define S7_ICON_GR5 (0x0000)
+//#define S7_ICON_GR5 (S7_DP5)
+
+//Icons Grid 6
+#define S7_DP6  0x0080
+#define S7_ICON_GR6 (0x0000)
+//#define S7_ICON_GR6 (S7_DP6)
+
+
+//Mask for blending out and restoring Icons
+extern const char MASK_ICON_GRID[]; 
+#endif
+
+
+// ASCII Font definitions for segments in each character
+//
+//32 0x20  Symbols
+#define C7_SPC  (0x0000)
+#define C7_EXC  (S7_B | S7_C) //!
+#define C7_QTE  (S7_B | S7_F) //"
+#define C7_HSH  (S7_C | S7_D | S7_E | S7_G) //#
+#define C7_DLR  (S7_A | S7_C | S7_D | S7_F | S7_G) //$
+#define C7_PCT  (S7_C | S7_F) //%
+#define C7_AMP  (S7_A | S7_C | S7_D | S7_E | S7_F | S7_G) //&
+#define C7_ACC  (S7_B) //'
+#define C7_LBR  (S7_A | S7_D | S7_E | S7_F) //(
+#define C7_RBR  (S7_A | S7_B | S7_C | S7_D) //)
+#define C7_MLT  (S7_B | S7_C | S7_E | S7_F | S7_G)  //*
+#define C7_PLS  (S7_B | S7_C | S7_G) //+
+#define C7_CMA  (S7_DP)
+#define C7_MIN  (S7_G)
+#define C7_DPT  (S7_DP)
+#define C7_RS   (S7_B | S7_E  | S7_G)  // /
+
+//48 0x30  Digits
+#define C7_0    (S7_A | S7_B | S7_C | S7_D | S7_E | S7_F)
+#define C7_1    (S7_B | S7_C)
+#define C7_2    (S7_A | S7_B | S7_D | S7_E | S7_G)
+#define C7_3    (S7_A | S7_B | S7_C | S7_D | S7_G)
+#define C7_4    (S7_B | S7_C | S7_F | S7_G)
+#define C7_5    (S7_A | S7_C | S7_D | S7_F | S7_G)
+#define C7_6    (S7_A | S7_C | S7_D | S7_E | S7_F | S7_G)
+#define C7_7    (S7_A | S7_B | S7_C)
+#define C7_8    (S7_A | S7_B | S7_C | S7_D | S7_E | S7_F | S7_G)
+#define C7_9    (S7_A | S7_B | S7_C | S7_D | S7_F | S7_G)
+
+//58 0x3A
+#define C7_COL  (S7_D | S7_G) // :
+#define C7_SCL  (S7_D | S7_G) // ;
+#define C7_LT   (S7_D | S7_E | S7_G)             // <
+#define C7_EQ   (S7_D | S7_G)                    // =
+#define C7_GT   (S7_C | S7_D | S7_G)             // >   
+#define C7_QM   (S7_A | S7_B | S7_E | S7_G)      // ?
+#define C7_AT   (S7_A | S7_B | S7_C | S7_D | S7_E  | S7_G)  // @
+
+//65 0x41  Upper case alphabet
+#define C7_A    (S7_A | S7_B | S7_C | S7_E | S7_F | S7_G )
+#define C7_B    (S7_C | S7_D | S7_E | S7_F | S7_G)
+#define C7_C    (S7_A | S7_D | S7_E | S7_F)
+#define C7_D    (S7_B | S7_C | S7_D | S7_E | S7_G)
+#define C7_E    (S7_A | S7_D | S7_E | S7_F | S7_G)
+#define C7_F    (S7_A | S7_E | S7_F | S7_G)
+
+#define C7_G    (S7_A | S7_C | S7_D | S7_E | S7_F)
+#define C7_H    (S7_B | S7_C | S7_E | S7_F | S7_G)
+#define C7_I    (S7_B | S7_C)
+#define C7_J    (S7_B | S7_C | S7_D | S7_E)
+#define C7_K    (S7_B | S7_C | S7_E | S7_F | S7_G)
+#define C7_L    (S7_D | S7_E | S7_F)
+#define C7_M    (S7_A | S7_C | S7_E)
+#define C7_N    (S7_A | S7_B | S7_C | S7_E | S7_F)
+#define C7_O    (S7_A | S7_B | S7_C | S7_D | S7_E | S7_F)
+#define C7_P    (S7_A | S7_B | S7_E | S7_F | S7_G)
+#define C7_Q    (S7_A | S7_B | S7_C | S7_F | S7_G)
+#define C7_R    (S7_E | S7_G )
+#define C7_S    (S7_A | S7_C | S7_D | S7_F | S7_G)
+#define C7_T    (S7_D | S7_E | S7_F | S7_G)
+#define C7_U    (S7_B | S7_C | S7_D | S7_E | S7_F)
+#define C7_V    (S7_B | S7_C | S7_D | S7_E | S7_F)
+#define C7_W    (S7_B | S7_D | S7_F)
+#define C7_X    (S7_B | S7_C | S7_E | S7_F | S7_G)
+#define C7_Y    (S7_B | S7_C | S7_D | S7_F | S7_G)
+#define C7_Z    (S7_A | S7_B | S7_D | S7_E | S7_G)
+
+//91 0x5B
+#define C7_SBL  (S7_A | S7_D | S7_E | S7_F) // [
+#define C7_LS   (S7_C | S7_F | S7_G)        // left slash
+#define C7_SBR  (S7_A | S7_B | S7_C | S7_D) // ]
+#define C7_PWR  (S7_A | S7_B | S7_F)        // ^
+#define C7_UDS  (S7_D)                      // _
+#define C7_DSH  (S7_F)                      // `  
+
+//97 0x61  Lower case alphabet
+#define C7_a     C7_A
+#define C7_b     C7_B
+#define C7_c     C7_C
+#define C7_d     C7_D
+#define C7_e     C7_E
+#define C7_f     C7_H
+
+#define C7_g     C7_G
+#define C7_h     C7_H
+#define C7_i     C7_I
+#define C7_j     C7_J
+#define C7_k     C7_K
+#define C7_l     C7_L
+#define C7_m     C7_M
+//#define C7_n     C7_N
+#define C7_n    (S7_C | S7_E | S7_G)
+//#define C7_o     C7_O
+#define C7_o    (S7_C | S7_D | S7_E | S7_G)
+#define C7_p     C7_P
+#define C7_q     C7_Q
+//#define C7_r     C7_R
+#define C7_r    (S7_E | S7_G)
+#define C7_s     C7_S
+#define C7_t     C7_T
+#define C7_u     C7_U
+#define C7_v     C7_V
+#define C7_w     C7_W
+#define C7_x     C7_X
+#define C7_y     C7_Y
+#define C7_z     C7_Z
+
+//123 0x7B
+#define C7_CBL  (S7_A | S7_D | S7_E | S7_F)        // {
+#define C7_OR   (S7_B | S7_C)                      // |
+#define C7_CBR  (S7_A | S7_B | S7_C | S7_D)        // }
+#define C7_TLD  (S7_B | S7_E | S7_G )              // ~
+#define C7_DEL  (0x0000)
+
+
+//User Defined Characters (some examples)
+#define C7_DGR   (S7_A | S7_B | S7_F | S7_G)  //Degrees
+                                                                         
+// Font data selection for transmission to TM1650 memory
+#define LO(x)  ( x & 0xFF)
+#define HI(x)  ((x >> 8) & 0xFF)
+
+
+// ASCII Font definition table
+//
+#define FONT_7S_START     0x20
+#define FONT_7S_END       0x7F
+//#define FONT_7S_NR_CHARS (FONT_7S_END - FONT_7S_START + 1)
+extern const short FONT_7S[]; 
+
+#endif   
\ No newline at end of file
diff -r 000000000000 -r 4430a1559b4f TM1650.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TM1650.cpp	Tue Oct 10 18:38:46 2017 +0000
@@ -0,0 +1,542 @@
+/* mbed TM1650 Library, for TM1650 LED controller
+ * Copyright (c) 2017, v01: WH, Initial version
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, inclumosig without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUmosiG BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include "mbed.h" 
+#include "TM1650.h"
+
+/** Constructor for class for driving TM1650 LED controller with Serial bus interface device. 
+ *  @brief Supports 4 digits @ 8 segments. Also supports upto 28 Keys.
+ *   
+ *  @param  PinName dio Serial bus DIO pin 
+ *  @param  PinName clk Serial bus CLK pin
+*/
+TM1650::TM1650(PinName dio, PinName clk) : _dio(dio), _clk(clk) {
+
+  _init();
+}
+
+
+/** Init the Serial interface and the controller
+  * @param  none
+  * @return none
+  */ 
+void TM1650::_init(){
+  
+//TM1650 uses a Serial bus that looks like I2C, but really is not.
+//It has Start and Stop conditions like I2C and an Ack pulse, but instead of slaveaddresses and a RW bit it just transmits commands and data.
+
+//init Serial bus
+  _dio.output();
+//  _dio.mode(PullUp);
+  wait_us(1);
+
+  _dio=1;  
+  _clk=1;  
+
+//init controller  
+  _bright  = TM1650_BRT_DEF; 
+  _segment = TM1650_DSP_8S; 
+  _display = TM1650_DSP_ON;  
+  _writeCmd(TM1650_DSP_CTRL_CMD, _bright | _segment | _display );  // Display control cmd, brightness, 7/8 segments, display on/off
+}   
+
+
+/** Clear the screen and locate to 0
+ */  
+void TM1650::cls() {
+
+  for (int cnt=0; cnt<TM1650_DISPLAY_MEM; cnt++) {
+    _start();     
+    _write(TM1650_DATA_WR_CMD | (cnt << 1)); // Set Address cmd (no auto incr supported)
+    _write(0x00);                            // Write data 
+    _stop();      
+  }
+
+}  
+
+/** Set Brightness
+  *
+  * @param  char brightness (3 significant bits, valid range 0..7 (1/16 .. 14/14 dutycycle)  
+  * @return none
+  */
+void TM1650::setBrightness(char brightness){
+
+  _bright = brightness & TM1650_BRT_MSK; // mask invalid bits
+  
+  _writeCmd(TM1650_DSP_CTRL_CMD, _bright | _segment | _display );  // Display control cmd, brightness, 7/8 segments, display on/off
+}
+
+/** Set the Display mode On/off
+  *
+  * @param bool display mode
+  */
+void TM1650::setDisplay(bool on) {
+  
+  if (on) {
+    _display = TM1650_DSP_ON;
+  }
+  else {
+    _display = TM1650_DSP_OFF;
+  }
+  
+  _writeCmd(TM1650_DSP_CTRL_CMD, _bright | _segment | _display );  // Display control cmd, brightness, 7/8 segments, display on/off
+}
+
+/** Write databyte to TM1650
+  *  @param  int address display memory location to write byte
+  *  @param  char data byte written at given address
+  *  @return none
+  */ 
+void TM1650::writeData(char data, int address) {
+  
+  _start();
+
+  _write(TM1650_DATA_WR_CMD | ((address & TM1650_ADDR_MSK) << 1)); // Set Address cmd     
+  _write(data);                                                    // Write data 
+
+  _stop();  
+}
+
+/** Write Display datablock to TM1650
+  *  @param  DisplayData_t data Array of TM1650_DISPLAY_MEM (=4) bytes for displaydata
+  *  @param  length number bytes to write (valid range 0..(TM1650_MAX_NR_GRIDS * TM1650_BYTES_PER_GRID) (=4), when starting at address 0)  
+  *  @param  int address display memory location to write bytes (default = 0) 
+  *  @return none
+  */  
+void TM1650::writeData(DisplayData_t data, int length, int address) {
+
+// sanity check
+  address &= TM1650_ADDR_MSK;
+  if (length < 0) {length = 0;}
+  if ((length + address) > TM1650_DISPLAY_MEM) {length = (TM1650_DISPLAY_MEM - address);}
+    
+  for (int idx=0; idx<length; idx++) {    
+    _start();
+    _write(TM1650_DATA_WR_CMD | ((address + idx) << 1)); // Set Address cmd (no auto incr supported)
+    _write(data[address + idx]);                         // Write data 
+    _stop();      
+  }
+}
+
+/** Read keydata block from TM1650
+  *  @param  *keydata Ptr to bytes for keydata
+  *  @return bool keypress True when at least one key was pressed
+  */   
+bool TM1650::getKeys(KeyData_t *keydata) {
+
+  _start();
+
+  // Enable Key Read mode
+  _write(TM1650_KEY_RD_CMD); // Read Key cmd
+
+  // Read key
+  *keydata = _read();
+//  printf("Key = 0x%02x\r\n", *keydata);  // debug
+
+  _stop();  
+      
+  // Check if valid key bits are set
+  return ( (*keydata & TM1650_SW_MSK) == TM1650_SW_MSK );
+}
+  
+
+/** Generate Start condition for TM1650
+  *  @param  none
+  *  @return none
+  */ 
+void TM1650::_start() {
+
+  _dio=0;
+  wait_us(1);
+  _clk=0;
+  wait_us(1);
+}
+  
+/** Generate Stop condition for TM1650
+  *  @param  none
+  *  @return none
+  */ 
+void TM1650::_stop() {
+
+  _dio=0;
+  wait_us(1);  
+  _clk=1;
+  wait_us(1);
+  _dio=1;
+  wait_us(1);
+}
+
+/** Send byte to TM1650
+  *  @param  int data
+  *  @return none
+  */ 
+void TM1650::_write(int data) {
+ 
+  for (int bit=7; bit >= 0; bit--) {    
+    //The TM1650 expects MSB first
+    if (((data >> bit) & 0x01) == 0x01) {
+      _dio=1;      
+    }
+    else {    
+      _dio=0;      
+    }  
+    wait_us(1);
+    _clk=1;
+    wait_us(1);
+    _clk=0;  
+    wait_us(1);
+  }  
+
+  _dio=1;
+  
+  // Prepare DIO to read data
+  _dio.input();
+  wait_us(3);
+      
+  // dummy Ack
+  _clk=1;
+  wait_us(1);
+//  _ack = _dio;  
+  _clk=0;  
+  wait_us(1); 
+  
+  // Return DIO to output mode
+  _dio.output();  
+  wait_us(3);  
+
+  _dio=1; //idle  
+}
+
+/** Read byte from TM1650
+  *  @param  none
+  *  @return read byte 
+  */ 
+char TM1650::_read() {
+  char keycode = 0;
+
+  // Prepare DIO to read data
+  _dio.input();
+  wait_us(3);
+    
+  for (int bit=0; bit<8; bit++) {    
+   
+    //The TM1650 sends bitpattern: D7..D0
+    //Data is shifted out by the TM1650 on the falling edge of CLK
+    //Observe sufficient delay to allow the Open Drain DIO to rise to H levels
+    // Prepare to read next bit, MSB (ie D7) first. 
+    keycode = keycode << 1;  
+
+    _clk=1;
+    wait_us(1);
+    
+    // Read next bit
+    if (_dio) { keycode |= 0x01; }        
+
+    _clk=0;        
+    wait_us(5); // Delay to allow for slow risetime
+  }  
+  
+  // Return DIO to output mode
+  _dio.output();
+  wait_us(3);  
+
+  // dummy Ack
+  _dio=0; //Ack   
+  wait_us(1);
+  
+  _clk=1;
+  wait_us(1);
+  _clk=0;  
+  wait_us(1); 
+
+  _dio=1; //idle
+
+  return keycode;
+}
+
+/** Write command (and parameters) to TM1650
+  *  @param  int cmd Command byte
+  *  @Param  int data Parameters for command
+  *  @return none
+  */  
+void TM1650::_writeCmd(int cmd, int data){
+    
+  _start();
+
+  _write(cmd);   
+  _write(data);  
+   
+  _stop();          
+}  
+
+
+#if (MEIBAI_TEST == 1) 
+// Derived class for TM1650 used in MEIBAI display unit
+//
+
+/** Constructor for class for driving TM1650 LED controller
+ *
+ * @brief Supports 4 Digits of 7 Segments + DP.
+ *        Also supports 3 keys.
+ *        Serial bus interface device. 
+ *
+ *  @param  PinName dio Serial bus DIO pin
+ *  @param  PinName sck Serial bus CLK pin 
+ */
+TM1650_MEIBAI::TM1650_MEIBAI(PinName dio, PinName clk) : TM1650(dio, clk) {
+  _column  = 0;
+  _columns = MEIBAI_NR_DIGITS;    
+}  
+
+#if(0)
+#if DOXYGEN_ONLY
+    /** Write a character to the Display
+     *
+     * @param c The character to write to the display
+     * @return c
+     */
+    int putc(int c);
+
+    /** Write a formatted string to the Display
+     *
+     * @param format A printf-style format string, followed by the
+     *               variables to use in formatting the string.
+     */
+    int printf(const char* format, ...);   
+#endif
+#endif
+
+/** Locate cursor to a screen column
+  *
+  * @param column  The horizontal position from the left, indexed from 0
+  * @return none  
+  */
+void TM1650_MEIBAI::locate(int column) {
+  //sanity check
+  if (column < 0) {column = 0;}
+  if (column > (_columns - 1)) {column = _columns - 1;}  
+  
+  _column = column;       
+}
+
+
+/** Number of screen columns
+  *
+  * @param none
+  * @return columns
+  */
+int TM1650_MEIBAI::columns() {
+    return _columns;
+}
+
+    
+/** Clear the screen and locate to 0
+  * 
+  * @param bool clrAll Clear Icons also (default = false)
+  * @return none  
+  */ 
+void TM1650_MEIBAI::cls(bool clrAll) {  
+
+  if (clrAll) {
+    //clear local buffer (inclumosig Icons)
+    for (int idx=0; idx < MEIBAI_NR_GRIDS; idx++) {
+      _displaybuffer[idx] = 0x00;  
+    }
+  }  
+  else {
+    //clear local buffer (preserving Icons)
+    for (int idx=0; idx < MEIBAI_NR_GRIDS; idx++) {
+      _displaybuffer[idx] = _displaybuffer[idx] & MASK_ICON_GRID[idx];  
+    }  
+  }
+
+  writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID), 0);
+
+  _column = 0;   
+}     
+
+/** Set Icon
+  *
+  * @param Icon icon Enums Icon has Grid position encoded in 8 MSBs, Icon pattern encoded in 16 LSBs
+  * @return none
+  */
+void TM1650_MEIBAI::setIcon(Icon icon) {
+  int addr, icn;
+
+   icn =        icon  & 0xFFFF;
+  addr = (icon >> 24) & 0xFF; 
+  addr = (addr - 1);
+    
+  //Save char...and set bits for icon to write
+  _displaybuffer[addr] = _displaybuffer[addr] | LO(icn);      
+//  writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID), 0);
+  writeData(_displaybuffer, TM1650_BYTES_PER_GRID, addr);  
+}
+
+/** Clr Icon
+  *
+  * @param Icon icon Enums Icon has Grid position encoded in 8 MSBs, Icon pattern encoded in 16 LSBs
+  * @return none
+  */
+void TM1650_MEIBAI::clrIcon(Icon icon) {
+  int addr, icn;
+
+   icn =        icon  & 0xFFFF;
+  addr = (icon >> 24) & 0xFF; 
+  addr = (addr - 1);
+    
+  //Save char...and clr bits for icon to write
+  _displaybuffer[addr] = _displaybuffer[addr] & ~LO(icn);      
+//  writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID), 0);
+  writeData(_displaybuffer, TM1650_BYTES_PER_GRID, addr);    
+}
+
+
+/** Set User Defined Characters (UDC)
+  *
+  * @param unsigned char udc_idx  The Index of the UDC (0..7)
+  * @param int udc_data           The bitpattern for the UDC (8 bits)
+  * @return none  
+  */
+void TM1650_MEIBAI::setUDC(unsigned char udc_idx, int udc_data) {
+
+  //Sanity check
+  if (udc_idx > (MEIBAI_NR_UDC-1)) {
+    return;
+  }
+  // Mask out Icon bits?
+
+  _UDC_7S[udc_idx] = LO(udc_data);
+}
+
+
+/** Write a single character (Stream implementation)
+  *
+  * @param c The character to write to the display
+  * @return c
+  */
+int TM1650_MEIBAI::_putc(int value) {
+//The MEIBAI mapping between Digit positions (Left to Right) and Grids is:
+//  GR1 GR2 GR3 GR4
+//The memory addresses or column numbers are:
+//   0   1   2   3
+    
+    int addr;
+    bool validChar = false;
+    char pattern   = 0x00;
+    
+    if ((value == '\n') || (value == '\r')) {
+      //No character to write
+      validChar = false;
+      
+      //Update Cursor      
+      _column = 0;
+    }
+    else if ((value == '.') || (value == ',')) {
+      //No character to write
+      validChar = false;
+      pattern = S7_DP; // placeholder for all DPs
+      
+      // Check to see that DP can be shown for current column
+      if (_column > 0) {
+        //Translate between _column and displaybuffer entries
+        //Add DP to bitpattern of digit left of current column.
+        addr = (_column - 1);
+      
+        //Save icons...and set bits for decimal point to write
+        _displaybuffer[addr] = _displaybuffer[addr] | pattern;
+//        writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID));
+        writeData(_displaybuffer, TM1650_BYTES_PER_GRID, addr); 
+        
+        //No Cursor Update
+      }
+    }
+    else if ((value >= 0) && (value < MEIBAI_NR_UDC)) {
+      //Character to write
+      validChar = true;
+      pattern = _UDC_7S[value];
+    }  
+    
+#if (SHOW_ASCII == 1)
+    //display all ASCII characters
+    else if ((value >= FONT_7S_START) && (value <= FONT_7S_END)) {   
+      //Character to write
+      validChar = true;
+      pattern = FONT_7S[value - FONT_7S_START];
+    } // else
+#else    
+    //display only digits and hex characters      
+    else if (value == '-') {
+      //Character to write
+      validChar = true;
+      pattern = C7_MIN;         
+    }
+    else if ((value >= (int)'0') && (value <= (int) '9')) {   
+      //Character to write
+      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
+#endif
+
+    if (validChar) {
+      //Character to write
+ 
+      //Translate between _column and displaybuffer entries
+      addr = _column;
+
+      //Save icons...and set bits for character to write
+      _displaybuffer[addr] = (_displaybuffer[addr] & MASK_ICON_GRID[_column]) | pattern;
+
+//      writeData(_displaybuffer, (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID));
+      writeData(_displaybuffer, TM1650_BYTES_PER_GRID, addr);        
+                                
+      //Update Cursor
+      _column++;
+      if (_column > (MEIBAI_NR_DIGITS - 1)) {
+        _column = 0;
+      }
+
+    } // if validChar           
+
+    return value;
+}
+
+
+/** Get a single character (Stream implementation)
+  *
+  * @param none
+  * @return -1
+  */
+int TM1650_MEIBAI::_getc() {
+    return -1;
+}
+
+#endif
diff -r 000000000000 -r 4430a1559b4f TM1650.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TM1650.h	Tue Oct 10 18:38:46 2017 +0000
@@ -0,0 +1,413 @@
+/* mbed TM1650 Library, for TM1650 LED controller
+ * Copyright (c) 2017, v01: WH, Initial version
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, inclumosig without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUmosiG BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef TM1650_H
+#define TM1650_H
+
+// Select one of the testboards for TM1650 LED controller
+#include "TM1650_Config.h"
+
+/** An interface for driving TM1650 LED controller
+ *
+ * @code
+ * #include "mbed.h"
+ * #include "TM1650.h" 
+ * 
+ * Serial pc(USBTX, USBRX);
+ *
+ * //DisplayData_t size is 4 bytes (4 grids @ 8 segments)
+ * TM1650::DisplayData_t all_str  = {0xFF, 0xFF, 0xFF, 0xFF};  
+ *
+ * // KeyData_t size is 1 bytes  
+ * TM1650::KeyData_t keydata; 
+ *
+ * // TM1650 declaration, Select the desired type in TM1650_Config.h
+ * TM1650_MEIBAI MEIBAI(p6, p7);       //LPC1768
+ * //TM1650_MEIBAI MEIBAI(D9, D10);      //F401
+ *
+ * int main() {
+ *   MEIBAI.cls(); 
+ *   MEIBAI.writeData(all_str);
+ *   wait(1);
+ *   MEIBAI.setBrightness(TM1650_BRT0);
+ *   wait(1);
+ *   MEIBAI.setBrightness(TM1650_BRT3);
+ *
+ *   while (1) {
+ *     MEIBAI.cls(); 
+ *     wait(0.5); 
+ *     MEIBAI.writeData(all_str);
+ *     wait(1.0);
+ *     MEIBAI.cls(); 
+ *     MEIBAI.printf(" HI ");  
+ *     wait(1.0); 
+ *
+ *     // Check and read keydata
+ *     if (MEIBAI.getKeys(&keydata)) {
+ *       pc.printf("Keydata = 0x%02x\r\n", keydata);
+ *
+ *       if (keydata == TM1650_SW1_BIT) { //sw1  
+ *         MEIBAI.cls(); 
+ *         MEIBAI.printf("--01"); 
+ *       }  
+ *     } // Check keydata
+ *   } // while 
+ * }
+ * @endcode
+ */
+
+
+//TM1650 Display data
+#define TM1650_MAX_NR_GRIDS    4
+#define TM1650_BYTES_PER_GRID  1
+
+//Significant bits Keymatrix data
+//#define TM1638_KEY_MSK      0xFF 
+
+//Memory size in bytes for Display and Keymatrix
+#define TM1650_DISPLAY_MEM  (TM1650_MAX_NR_GRIDS * TM1650_BYTES_PER_GRID)
+#define TM1650_KEY_MEM         1
+
+//Data write command
+//Valid data addresses are 0x68, 0x6A, 0x6C, 0x6E
+#define TM1650_DATA_WR_CMD  0x68
+#define TM1650_ADDR_MSK     0x03 //0..3
+
+//Display control command
+#define TM1650_DSP_CTRL_CMD 0x48
+
+#define TM1650_BRT_MSK      0x70
+//#define TM1650_BRT_SHFT        4
+#define TM1650_BRT0         0x10 //Pulsewidth 1/16
+#define TM1650_BRT1         0x20
+#define TM1650_BRT2         0x30
+#define TM1650_BRT3         0x40
+#define TM1650_BRT4         0x50
+#define TM1650_BRT5         0x60
+#define TM1650_BRT6         0x70
+#define TM1650_BRT7         0x00 //Pulsewidth 15/16
+
+#define TM1650_BRT_DEF      TM1650_BRT3
+
+#define TM1650_DSP_8S       0x00
+#define TM1650_DSP_7S       0x08
+
+#define TM1650_DSP_OFF      0x00
+#define TM1650_DSP_ON       0x01
+
+
+//Keydata read command
+#define TM1650_KEY_RD_CMD   0x49
+
+//Access to 28 Switches
+//d7 d6 d5 d4 d3 d2 d1 d0
+// .  1  .  .  .  1  .  .   = Valid Key
+#define TM1650_SW_MSK       0x44
+
+//A -> Dig1 .. Dig4
+#define TM1650_SW1_BIT      0x44
+#define TM1650_SW2_BIT      0x45
+#define TM1650_SW3_BIT      0x46
+#define TM1650_SW4_BIT      0x47
+//B -> Dig1 .. Dig4
+#define TM1650_SW5_BIT      0x4C
+#define TM1650_SW6_BIT      0x4D
+#define TM1650_SW7_BIT      0x4E
+#define TM1650_SW8_BIT      0x4F
+//C -> Dig1 .. Dig4
+#define TM1650_SW9_BIT      0x54
+#define TM1650_SW10_BIT     0x55
+#define TM1650_SW11_BIT     0x56
+#define TM1650_SW12_BIT     0x57
+//D -> Dig1 .. Dig4
+#define TM1650_SW13_BIT     0x5C
+#define TM1650_SW14_BIT     0x5D
+#define TM1650_SW15_BIT     0x5E
+#define TM1650_SW16_BIT     0x5F
+//E -> Dig1 .. Dig4
+#define TM1650_SW17_BIT     0x64
+#define TM1650_SW18_BIT     0x65
+#define TM1650_SW19_BIT     0x66
+#define TM1650_SW20_BIT     0x67
+//F -> Dig1 .. Dig4
+#define TM1650_SW21_BIT     0x6C
+#define TM1650_SW22_BIT     0x6D
+#define TM1650_SW23_BIT     0x6E
+#define TM1650_SW24_BIT     0x6F
+//G -> Dig1 .. Dig4
+#define TM1650_SW25_BIT     0x74
+#define TM1650_SW26_BIT     0x75
+#define TM1650_SW27_BIT     0x76
+#define TM1650_SW28_BIT     0x77
+
+
+
+/** A class for driving TM1650 LED controller
+ *
+ * @brief Supports 4 Grids @ 8 Segments and upto 28 Keys. 
+ *        Serial bus interface device. 
+ */
+class TM1650 {
+ public:
+
+  /** Datatype for displaydata */
+  typedef char DisplayData_t[TM1650_DISPLAY_MEM];
+
+  /** Datatypes for keymatrix data */
+  typedef char KeyData_t;
+
+ /** Constructor for class for driving TM1650 LED controller
+  *
+  * @brief Supports 4 Grids @ 8 segments and 28 Keys. 
+  *        Serial bus interface device. 
+  *
+  *  @param  PinName dio Serial bus DIO pin
+  *  @param  PinName sck Serial bus CLK pin 
+  */
+  TM1650(PinName dio, PinName clk);
+
+
+  /** Clear the screen and locate to 0
+   */ 
+  void cls();  
+
+  /** Write databyte to TM1650
+   *  @param  char data byte written at given address
+   *  @param  int address display memory location to write byte
+   *  @return none
+   */ 
+   void writeData(char data, int address); 
+
+   /** Write Display datablock to TM1650
+    *  @param  DisplayData_t data Array of TM1650_DISPLAY_MEM (=4) bytes for displaydata
+    *  @param  length number bytes to write (valid range 0..(TM1650_MAX_NR_GRIDS * TM1650_BYTES_PER_GRID) (=4), when starting at address 0)  
+    *  @param  int address display memory location to write bytes (default = 0) 
+    *  @return none
+    */ 
+    void writeData(DisplayData_t data, int length = (TM1650_MAX_NR_GRIDS * TM1650_BYTES_PER_GRID), int address = 0);
+
+  /** Read keydata block from TM1650
+   *
+   *  @param  *keydata Ptr to bytes for keydata
+   *  @return bool keypress True when at least one key was pressed
+   */   
+  bool getKeys(KeyData_t *keydata);
+
+  /** Set Brightness
+    *
+    * @param  char brightness (3 significant bits, valid range 0..7 (1/16 .. 14/16 dutycycle)  
+    * @return none
+    */
+  void setBrightness(char brightness = TM1650_BRT_DEF);
+  
+  /** Set the Display mode On/off
+    *
+    * @param bool display mode
+    * @return none
+    */
+  void setDisplay(bool on);
+  
+ private:  
+    DigitalInOut _dio;
+    DigitalOut   _clk;  
+
+    char _bright;
+    char _segment;
+    char _display;    
+  
+  /** Init the Serial interface and the controller
+    * @param  none
+    * @return none
+    */ 
+    void _init();
+
+  /** Generate Start condition for TM1650
+    *  @param  none
+    *  @return none
+    */ 
+    void _start();
+  
+  /** Generate Stop condition for TM1650
+    *  @param  none
+    *  @return none
+    */ 
+    void _stop();
+
+  /** Send byte to TM1650
+    *  @param  int data
+    *  @return none
+    */ 
+    void _write(int data);
+
+  /** Read byte from TM1650
+    *  @param  none  
+    *  @return read byte 
+    */ 
+    char _read();
+
+  /** Write command and parameter to TM1650
+    *  @param  int cmd Command byte
+    *  @Param  int data Parameters for command
+    *  @return none
+    */ 
+    void _writeCmd(int cmd, int data);  
+};
+
+#if (MEIBAI_TEST == 1) 
+// Derived class for TM1650 used in MEIBAI display unit with 4 Digits and 3 keys
+//
+
+#include "Font_7Seg.h"
+
+#define MEIBAI_NR_GRIDS  4
+#define MEIBAI_NR_DIGITS 4
+#define MEIBAI_NR_UDC    8
+
+
+/** Constructor for class for driving TM1650 controller as used in MEIBAI
+  *
+  *  @brief Supports 4 Digits of 7 Segments + DP. 
+  *         Also Supports 3 Keys. Serial bus interface device. 
+  *  
+  *  @param  PinName dio Serial bus DIO pin
+  *  @param  PinName sck Serial bus CLK pin  
+  */
+class TM1650_MEIBAI : public TM1650, public Stream {
+ public:
+
+  /** Enums for Icons */
+  //  Grid encoded in 8 MSBs, Icon pattern encoded in 16 LSBs
+  enum Icon {
+    DP1   = ( 1<<24) | S7_DP1,  /**<  Digit 1 */
+    DP2   = ( 2<<24) | S7_DP2,  /**<  Digit 2 */
+    DP3   = ( 3<<24) | S7_DP3,  /**<  Digit 3 */
+    DP4   = ( 4<<24) | S7_DP4,  /**<  Digit 4 */
+  };
+  
+  typedef char UDCData_t[MEIBAI_NR_UDC];
+
+
+ /** Constructor for class for driving TM1650 LED controller
+  *
+  * @brief Supports 4 Digits of 7 Segments + DP.
+  *        Also Supports 3 Keys. Serial bus interface device. 
+  *
+  *  @param  PinName dio Serial bus DIO pin
+  *  @param  PinName sck Serial bus CLK pin
+  */
+  TM1650_MEIBAI(PinName dio, PinName clk);
+
+  
+#if DOXYGEN_ONLY
+    /** Write a character to the Display
+     *
+     * @param c The character to write to the display
+     * @return c
+     */
+    int putc(int c);
+
+    /** Write a formatted string to the Display
+     *
+     * @param format A printf-style format string, followed by the
+     *               variables to use in formatting the string.
+     * @return chars written
+     */
+    int printf(const char* format, ...);   
+#endif
+
+    /** Locate cursor to a screen column
+     *
+     * @param column  The horizontal position from the left, indexed from 0
+     * @return none     
+     */
+    void locate(int column);
+    
+    /** Clear the screen and locate to 0
+     * @param bool clrAll Clear Icons also (default = false)
+     * @return none     
+     */
+    void cls(bool clrAll = false);
+
+    /** Set Icon
+     *
+     * @param Icon icon Enums Icon has Grid position encoded in 8 MSBs, Icon pattern encoded in 16 LSBs
+     * @return none
+     */
+    void setIcon(Icon icon);
+
+    /** Clr Icon
+     *
+     * @param Icon icon Enums Icon has Grid position encoded in 8 MSBs, Icon pattern encoded in 16 LSBs
+     * @return none
+     */
+    void clrIcon(Icon icon);
+
+   /** Set User Defined Characters (UDC)
+     *
+     * @param unsigned char udc_idx   The Index of the UDC (0..7)
+     * @param int udc_data            The bitpattern for the UDC (16 bits)
+     * @return none            
+     */
+    void setUDC(unsigned char udc_idx, int udc_data);
+
+
+   /** Number of screen columns
+    *
+    * @param none
+    * @return columns
+    */
+    int columns();   
+
+   /** Write databyte to TM1650
+     *  @param  char data byte written at given address
+     *  @param  int address display memory location to write byte
+     *  @return none
+     */ 
+    void writeData(char data, int address){
+      TM1650::writeData(data, address);
+    }        
+
+   /** Write Display datablock to TM1650
+    *  @param  DisplayData_t data Array of TM1650_DISPLAY_MEM (=4) bytes for displaydata
+    *  @param  length number bytes to write (valid range 0..(MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID) (=4), when starting at address 0)  
+    *  @param  int address display memory location to write bytes (default = 0)
+    *  @return none
+    */   
+    void writeData(DisplayData_t data, int length = (MEIBAI_NR_GRIDS * TM1650_BYTES_PER_GRID), int address = 0) {
+      TM1650::writeData(data, length, address);
+    }  
+
+protected:  
+    // Stream implementation functions
+    virtual int _putc(int value);
+    virtual int _getc();
+
+private:
+    int _column;
+    int _columns;   
+    
+    DisplayData_t _displaybuffer;
+    UDCData_t _UDC_7S; 
+};
+#endif
+
+#endif
\ No newline at end of file
diff -r 000000000000 -r 4430a1559b4f TM1650_Config.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TM1650_Config.h	Tue Oct 10 18:38:46 2017 +0000
@@ -0,0 +1,33 @@
+/* mbed TM1650 Library, for TM1650 LEDcontroller
+ * Copyright (c) 2017, v01: WH, Initial version
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef TM1650_CONFIG_H
+#define TM1650_CONFIG_H
+
+// Select one of the testboards for TM1650 LED controller
+#define TM1650_TEST   0
+#define MEIBAI_TEST   1 
+
+// Select the display mode: only digits and hex or ASCII
+#define SHOW_ASCII    1 
+
+#endif
\ No newline at end of file