1

Dependents:   Program_R11

Revision:
30:033048611c01
Parent:
29:a3663151aa65
Child:
31:ef31cd8a00d1
diff -r a3663151aa65 -r 033048611c01 TextLCD.h
--- a/TextLCD.h	Tue Jun 17 17:41:47 2014 +0000
+++ b/TextLCD.h	Sat Jun 28 14:27:32 2014 +0000
@@ -10,7 +10,7 @@
  *               2014, v08: WH, Refactored in Base and Derived Classes to deal with mbed lib change regarding 'NC' defined DigitalOut pins
  *               2014, v09: WH/EO, Added Class for Native SPI controllers such as ST7032 
  *               2014, v10: WH, Added Class for Native I2C controllers such as ST7032i, Added support for MCP23008 I2C portexpander, Added support for Adafruit module  
- *               2014, v11: WH, Added support for native I2C controllers such as PCF21XX, improved the _initCtrl() method to deal with differences between all supported controllers  
+ *               2014, v11: WH, Added support for native I2C controllers such as PCF21XX, Improved the _initCtrl() method to deal with differences between all supported controllers  
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -38,7 +38,7 @@
 
 /** A TextLCD interface for driving 4-bit HD44780-based LCDs
  *
- * Currently supports 8x1, 8x2, 12x4, 16x1, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2 and 40x4 panels
+ * Currently supports 8x1, 8x2, 12x3, 12x4, 16x1, 16x2, 16x4, 20x2, 20x4, 24x1, 24x2, 24x4, 40x2 and 40x4 panels
  * Interface options include direct mbed pins, I2C portexpander (PCF8474/PCF8574A or MCP23008) or SPI bus shiftregister (74595). 
  * Supports some controllers with native I2C or SP interface. Supports some controllers that provide internal DC/DC converters for VLCD or VLED. 
  *
@@ -74,7 +74,6 @@
 #define ADAFRUIT       1
 #define DFROBOT        0
 
-
 #if (DEFAULT==1)
 //Definitions for default (WH) mapping between serial port expander pins and LCD controller
 //This hardware supports the I2C bus expander (PCF8574/PCF8574A or MCP23008) and SPI bus expander (74595) interfaces
@@ -163,107 +162,152 @@
 #define D_LCD_BUS_DEF  0x00
 
 /* PCF8574/PCF8574A I2C portexpander slave address */
-#define PCF8574_SA0   0x40
-#define PCF8574_SA1   0x42
-#define PCF8574_SA2   0x44
-#define PCF8574_SA3   0x46
-#define PCF8574_SA4   0x48
-#define PCF8574_SA5   0x4A
-#define PCF8574_SA6   0x4C
-#define PCF8574_SA7   0x4E
+#define PCF8574_SA0    0x40
+#define PCF8574_SA1    0x42
+#define PCF8574_SA2    0x44
+#define PCF8574_SA3    0x46
+#define PCF8574_SA4    0x48
+#define PCF8574_SA5    0x4A
+#define PCF8574_SA6    0x4C
+#define PCF8574_SA7    0x4E
 
-#define PCF8574A_SA0  0x70
-#define PCF8574A_SA1  0x72
-#define PCF8574A_SA2  0x74
-#define PCF8574A_SA3  0x76
-#define PCF8574A_SA4  0x78
-#define PCF8574A_SA5  0x7A
-#define PCF8574A_SA6  0x7C
-#define PCF8574A_SA7  0x7E
+#define PCF8574A_SA0   0x70
+#define PCF8574A_SA1   0x72
+#define PCF8574A_SA2   0x74
+#define PCF8574A_SA3   0x76
+#define PCF8574A_SA4   0x78
+#define PCF8574A_SA5   0x7A
+#define PCF8574A_SA6   0x7C
+#define PCF8574A_SA7   0x7E
 
 /* MCP23008 I2C portexpander slave address */
-#define MCP23008_SA0  0x40
-#define MCP23008_SA1  0x42
-#define MCP23008_SA2  0x44
-#define MCP23008_SA3  0x46
-#define MCP23008_SA4  0x48
-#define MCP23008_SA5  0x4A
-#define MCP23008_SA6  0x4C
-#define MCP23008_SA7  0x4E
-
+#define MCP23008_SA0   0x40
+#define MCP23008_SA1   0x42
+#define MCP23008_SA2   0x44
+#define MCP23008_SA3   0x46
+#define MCP23008_SA4   0x48
+#define MCP23008_SA5   0x4A
+#define MCP23008_SA6   0x4C
+#define MCP23008_SA7   0x4E
 
 /* MCP23008 I2C portexpander internal registers */
-#define IODIR         0x00
-#define IPOL          0x01
-#define GPINTEN       0x02
-#define DEFVAL        0x03
-#define INTCON        0x04
-#define IOCON         0x05
-#define GPPU          0x06
-#define INTF          0x07
-#define INTCAP        0x08
-#define GPIO          0x09
-#define OLAT          0x0A
+#define IODIR          0x00
+#define IPOL           0x01
+#define GPINTEN        0x02
+#define DEFVAL         0x03
+#define INTCON         0x04
+#define IOCON          0x05
+#define GPPU           0x06
+#define INTF           0x07
+#define INTCAP         0x08
+#define GPIO           0x09
+#define OLAT           0x0A
 
 
 /* ST7032I I2C slave address */
-#define ST7032_SA     0x7C
+#define ST7032_SA      0x7C
 
 /* PCF21XX I2C slave address */
-#define PCF21XX_SA0   0x74
-#define PCF21XX_SA1   0x76
+#define PCF21XX_SA0    0x74
+#define PCF21XX_SA1    0x76
+
+/* AIP31068 I2C slave address */
+#define AIP31068_SA    0x7C
+
+/* LCD Type information on Rows, Columns and Variant. This information is encoded in
+ * an int and used for the LCDType enumerators in order to simplify code maintenance */
+// Columns encoded in b7..b0
+#define LCD_T_COL_MSK  0x000000FF
+#define LCD_T_C8       0x00000008
+#define LCD_T_C10      0x0000000A
+#define LCD_T_C12      0x0000000C
+#define LCD_T_C16      0x00000010
+#define LCD_T_C20      0x00000014
+#define LCD_T_C24      0x00000018
+#define LCD_T_C32      0x00000020
+#define LCD_T_C40      0x00000028
+
+// Rows encoded in b15..b8  
+#define LCD_T_ROW_MSK  0x0000FF00
+#define LCD_T_R1       0x00000100
+#define LCD_T_R2       0x00000200
+#define LCD_T_R3       0x00000300
+#define LCD_T_R4       0x00000400
+  
+// Addressing mode encoded in b19..b16
+#define LCD_T_ADR_MSK  0x000F0000
+#define LCD_T_A        0x00000000  /*Mode A  (Default), 1, 2 or 4 line display           */
+#define LCD_T_B        0x00010000  /*Mode B,  Alternate 8x2 (actually 16x1 display)      */
+#define LCD_T_C        0x00020000  /*Mode C,  Alternate 16x1 (actually 8x2 display)      */
+#define LCD_T_D        0x00030000  /*Mode D,  Alternate 3 or 4 line display (12x4, 24x4) */
+#define LCD_T_D1       0x00040000  /*Mode D1, Alternate 3 or 4 line display (12x4, 24x4) */
+#define LCD_T_E        0x00050000  /*Mode E,  4x40 display (actually two 40x2)           */
+
+/* LCD Ctrl information on interface support and features. This information is encoded in
+ * an int and used for the LCDCtrl enumerators in order to simplify code maintenance */
+// Interface encoded in b31..b24
+#define LCD_C_BUS_MSK  0xFF000000
+#define LCD_C_PAR      0x01000000  /*Parallel 4 or 8 bit data, E pin                            */
+#define LCD_C_SPI3_9   0x02000000  /*SPI 3 line (MOSI, SCL, CS pins),  9 bits (RS + 8 Data)     */
+#define LCD_C_SPI3_10  0x04000000  /*SPI 3 line (MOSI, SCL, CS pins), 10 bits (RS, RW + 8 Data) */
+#define LCD_C_SPI4     0x08000000  /*SPI 4 line (MOSI, SCL, CS, RS pin)                         */
+#define LCD_C_I2C      0x10000000  /*I2C (SDA, SCL pin)                                         */
+// Features encoded in b23..b16
+#define LCD_C_FTR_MSK  0x00FF0000 
+#define LCD_C_BST      0x00010000  /*Booster             */
+#define LCD_C_CTR      0x00010000  /*Contrast Control    */
+#define LCD_C_ICN      0x00020000  /*Icons               */
 
 /** Some sample User Defined Chars 5x7 dots */
-const char udc_ae[] = {0x00, 0x00, 0x1B, 0x05, 0x1F, 0x14, 0x1F, 0x00};  //æ
-const char udc_0e[] = {0x00, 0x00, 0x0E, 0x13, 0x15, 0x19, 0x0E, 0x00};  //ø
-const char udc_ao[] = {0x0E, 0x0A, 0x0E, 0x01, 0x0F, 0x11, 0x0F, 0x00};  //å
-const char udc_AE[] = {0x0F, 0x14, 0x14, 0x1F, 0x14, 0x14, 0x17, 0x00};  //Æ
-const char udc_0E[] = {0x0E, 0x13, 0x15, 0x15, 0x15, 0x19, 0x0E, 0x00};  //Ø
-const char udc_Ao[] = {0x0E, 0x0A, 0x0E, 0x11, 0x1F, 0x11, 0x11, 0x00};  //Å
-const char udc_PO[] = {0x04, 0x0A, 0x0A, 0x1F, 0x1B, 0x1B, 0x1F, 0x00};  //Padlock Open
-const char udc_PC[] = {0x1C, 0x10, 0x08, 0x1F, 0x1B, 0x1B, 0x1F, 0x00};  //Padlock Closed
+extern const char udc_ae[];      //æ
+extern const char udc_0e[];      //ø
+extern const char udc_ao[];      //å
+extern const char udc_AE[];      //Æ
+extern const char udc_0E[];      //Ø
+extern const char udc_Ao[];      //Å
+extern const char udc_PO[];      //Padlock Open
+extern const char udc_PC[];      //Padlock Closed
 
-const char udc_0[]  = {0x18, 0x14, 0x12, 0x11, 0x12, 0x14, 0x18, 0x00};  // |>
-const char udc_1[]  = {0x03, 0x05, 0x09, 0x11, 0x09, 0x05, 0x03, 0x00};  // <|
-const char udc_2[]  = {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00};  // |
-const char udc_3[]  = {0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00};  // ||
-const char udc_4[]  = {0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00};  // |||
-const char udc_5[]  = {0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00};  // =
-const char udc_6[]  = {0x15, 0x0a, 0x15, 0x0a, 0x15, 0x0a, 0x15, 0x00};  // checkerboard
-const char udc_7[]  = {0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x10, 0x00};  // \
+extern const char udc_0[];       // |>
+extern const char udc_1[];       // <|
+extern const char udc_2[];       // |
+extern const char udc_3[];       // ||
+extern const char udc_4[];       // |||
+extern const char udc_5[];       // =
+extern const char udc_6[];       // checkerboard
+extern const char udc_7[];       // \
 
-const char udc_degr[]   = {0x06, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00};  // Degree symbol
+extern const char udc_degr[];    // Degree symbol
 
-const char udc_TM_T[]   = {0x1F, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00};  // Trademark T
-const char udc_TM_M[]   = {0x11, 0x1B, 0x15, 0x11, 0x00, 0x00, 0x00, 0x00};  // Trademark M
+extern const char udc_TM_T[];    // Trademark T
+extern const char udc_TM_M[];    // Trademark M
 
-//const char udc_Bat_Hi[] = {0x0E, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00};  // Battery Full
-//const char udc_Bat_Ha[] = {0x0E, 0x11, 0x13, 0x17, 0x1F, 0x1F, 0x1F, 0x00};  // Battery Half
-//const char udc_Bat_Lo[] = {0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x00};  // Battery Low
-const char udc_Bat_Hi[] = {0x0E, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00};  // Battery Full
-const char udc_Bat_Ha[] = {0x0E, 0x11, 0x11, 0x1F, 0x1F, 0x1F, 0x1F, 0x00};  // Battery Half
-const char udc_Bat_Lo[] = {0x0E, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x1F, 0x00};  // Battery Low
-const char udc_AC[]     = {0x0A, 0x0A, 0x1F, 0x11, 0x0E, 0x04, 0x04, 0x00};  // AC Power
+//extern const char udc_Bat_Hi[];  // Battery Full
+//extern const char udc_Bat_Ha[];  // Battery Half
+//extern const char udc_Bat_Lo[];  // Battery Low
+extern const char udc_Bat_Hi[];  // Battery Full
+extern const char udc_Bat_Ha[];  // Battery Half
+extern const char udc_Bat_Lo[];  // Battery Low
+extern const char udc_AC[];      // AC Power
 
-//const char udc_smiley[] = {0x00, 0x0A, 0x00, 0x04, 0x11, 0x0E, 0x00, 0x00};  // Smiley
-//const char udc_droopy[] = {0x00, 0x0A, 0x00, 0x04, 0x00, 0x0E, 0x11, 0x00};  // Droopey
-//const char udc_note[]   = {0x01, 0x03, 0x05, 0x09, 0x0B, 0x1B, 0x18, 0x00};  // Note
+//extern const char udc_smiley[];  // Smiley
+//extern const char udc_droopy[];  // Droopey
+//extern const char udc_note[];    // Note
 
-//const char udc_bar_1[]  = {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00};  // Bar 1
-//const char udc_bar_2[]  = {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00};  // Bar 11
-//const char udc_bar_3[]  = {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x00};  // Bar 111
-//const char udc_bar_4[]  = {0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x00};  // Bar 1111
-//const char udc_bar_5[]  = {0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00};  // Bar 11111
+//extern const char udc_bar_1[];   // Bar 1
+//extern const char udc_bar_2[];   // Bar 11
+//extern const char udc_bar_3[];   // Bar 111
+//extern const char udc_bar_4[];   // Bar 1111
+//extern const char udc_bar_5[];   // Bar 11111
 
-//const char udc_ch_1[]  =  {0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00};  // Hor bars 4
-//const char udc_ch_2[]  =  {0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f};  // Hor bars 4 (inverted)
-//const char udc_ch_3[]  =  {0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15};  // Ver bars 3
-//const char udc_ch_4[]  =  {0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a};  // Ver bars 3 (inverted)
-//const char udc_ch_yr[] =  {0x08, 0x0f, 0x12, 0x0f, 0x0a, 0x1f, 0x02, 0x02};  // Year   (kana)
-//const char udc_ch_mo[] =  {0x0f, 0x09, 0x0f, 0x09, 0x0f, 0x09, 0x09, 0x13};  // Month  (kana)
-//const char udc_ch_dy[] =  {0x1f, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x11, 0x1F};  // Day    (kana)
-//const char udc_ch_mi[] =  {0x0C, 0x0a, 0x11, 0x1f, 0x09, 0x09, 0x09, 0x13};  // minute (kana)
-
+//extern const char udc_ch_1[];    // Hor bars 4
+//extern const char udc_ch_2[];    // Hor bars 4 (inverted)
+//extern const char udc_ch_3[];    // Ver bars 3
+//extern const char udc_ch_4[];    // Ver bars 3 (inverted)
+//extern const char udc_ch_yr[];   // Year   (kana)
+//extern const char udc_ch_mo[];   // Month  (kana)
+//extern const char udc_ch_dy[];   // Day    (kana)
+//extern const char udc_ch_mi[];   // minute (kana)
 
 /** A TextLCD interface for driving 4-bit HD44780-based LCDs
  *
@@ -276,6 +320,36 @@
 
     /** LCD panel format */
     enum LCDType {
+        LCD8x1     = (LCD_T_A | LCD_T_C8 | LCD_T_R1),     /**<  8x1 LCD panel */    
+        LCD8x2     = (LCD_T_A | LCD_T_C8 | LCD_T_R2),     /**<  8x2 LCD panel */          
+        LCD8x2B    = (LCD_T_D | LCD_T_C8 | LCD_T_R2),     /**<  8x2 LCD panel (actually 16x1) */                  
+//        LCD12x1    = (LCD_T_A | LCD_T_C12 | LCD_T_R1),    /**< 12x1 LCD panel */                          
+        LCD12x2    = (LCD_T_A | LCD_T_C12 | LCD_T_R2),    /**< 12x2 LCD panel */                          
+        LCD12x3D   = (LCD_T_D | LCD_T_C12 | LCD_T_R3),    /**< 12x3 LCD panel, special mode PCF21XX */                                  
+        LCD12x3D1  = (LCD_T_D1 | LCD_T_C12 | LCD_T_R3),   /**< 12x3 LCD panel, special mode PCF21XX */                                          
+        LCD12x4    = (LCD_T_A | LCD_T_C12 | LCD_T_R4),    /**< 12x4 LCD panel */                  
+        LCD12x4D   = (LCD_T_B | LCD_T_C12 | LCD_T_R4),    /**< 12x4 LCD panel, special mode PCF21XX */                                          
+        LCD16x1    = (LCD_T_A | LCD_T_C16 | LCD_T_R1),    /**< 16x1 LCD panel */                  
+        LCD16x1C   = (LCD_T_C | LCD_T_C16 | LCD_T_R1),    /**< 16x1 LCD panel (actually 8x2) */          
+        LCD16x2    = (LCD_T_A | LCD_T_C16 | LCD_T_R2),    /**< 16x2 LCD panel (default) */
+//        LCD16x2B   = (LCD_T_B | LCD_T_C16 | LCD_T_R2),    /**< 16x2 LCD panel, alternate addressing, wrong.. */
+//        LCD16x3D   = (LCD_T_D | LCD_T_C16 | LCD_T_R3),    /**< 16x3 LCD panel, special mode ST7036 */                
+        LCD16x4    = (LCD_T_A | LCD_T_C16 | LCD_T_R4),    /**< 16x4 LCD panel */        
+//        LCD20x1    = (LCD_T_A | LCD_T_C20 | LCD_T_R1),    /**< 20x1 LCD panel */
+        LCD20x2    = (LCD_T_A | LCD_T_C20 | LCD_T_R2),    /**< 20x2 LCD panel */
+        LCD20x4    = (LCD_T_A | LCD_T_C20 | LCD_T_R4),    /**< 20x4 LCD panel */
+        LCD24x1    = (LCD_T_A | LCD_T_C24 | LCD_T_R1),    /**< 24x1 LCD panel */        
+        LCD24x2    = (LCD_T_A | LCD_T_C24 | LCD_T_R2),    /**< 24x2 LCD panel */        
+        LCD24x4D   = (LCD_T_D | LCD_T_C24 | LCD_T_R4),    /**< 24x4 LCD panel, special mode KS0078 */                                                          
+//        LCD40x1    = (LCD_T_A | LCD_T_C40 | LCD_T_R1),    /**< 40x1 LCD panel */                        
+        LCD40x2    = (LCD_T_A | LCD_T_C40 | LCD_T_R2),    /**< 40x2 LCD panel */                
+        LCD40x4    = (LCD_T_E | LCD_T_C40 | LCD_T_R4)     /**< 40x4 LCD panel, Two controller version */                        
+    };
+
+
+#if(0)
+    /** LCD panel format */
+    enum LCDType {
         LCD8x1,     /**<  8x1 LCD panel */    
         LCD8x2,     /**<  8x2 LCD panel */          
         LCD8x2B,    /**<  8x2 LCD panel (actually 16x1) */                  
@@ -283,9 +357,11 @@
 //        LCD12x1B,   /**< 12x1 LCD panel, special mode PCF21XX */                                  
         LCD12x2,    /**< 12x2 LCD panel */                          
         LCD12x3B,   /**< 12x3 LCD panel, special mode PCF21XX */                                  
+//        LCD12x3C,   /**< 12x3 LCD panel, special mode PCF21XX */                                          
         LCD12x4,    /**< 12x4 LCD panel */                  
         LCD12x4B,   /**< 12x4 LCD panel, special mode PCF21XX */                                          
         LCD16x1,    /**< 16x1 LCD panel (actually 8x2) */          
+//        LCD16x1B,   /**< 16x1 LCD panel */                  
         LCD16x2,    /**< 16x2 LCD panel (default) */
         LCD16x2B,   /**< 16x2 LCD panel alternate addressing */
 //        LCD16x3B,   /**< 16x3 LCD panel, special mode ST7036 */                
@@ -296,22 +372,41 @@
         LCD24x4B,   /**< 24x4 LCD panel, special mode KS0078 */                                                  
         LCD24x1,    /**< 24x1 LCD panel */        
         LCD24x2,    /**< 24x2 LCD panel */        
+//        LCD40x1,    /**< 40x1 LCD panel */                        
         LCD40x2,    /**< 40x2 LCD panel */                
         LCD40x4     /**< 40x4 LCD panel, Two controller version */                        
     };
+#endif
 
+
+    /** LCD Controller Device */
+    enum LCDCtrl {
+        HD44780     = 0,                                             /**<  HD44780 (default)                            */    
+        WS0010      = 1 | (LCD_C_SPI3_10 | LCD_C_BST),               /**<  WS0010  OLED Controller, 4/8 bit, SPI3       */    
+        ST7036      = 2 | (LCD_C_SPI4    | LCD_C_BST),               /**<  ST7036  3V3 with Booster, 4/8 bit, SPI4      */   
+        ST7032_3V3  = 3 | (LCD_C_SPI4    | LCD_C_I2C | LCD_C_BST),   /**<  ST7032  3V3 with Booster, 4/8 bit, SPI4, I2C */   
+        ST7032_5V   = 4 | (LCD_C_SPI4    | LCD_C_I2C),               /**<  ST7032  5V no Booster, 4/8 bit, SPI4, I2C    */           
+        KS0078      = 5,                                             /**<  KS0078  24x4 support, 4/8 bit                */                   
+        PCF2113_3V3 = 6 | (LCD_C_I2C     | LCD_C_BST),               /**<  PCF2113 3V3 with Booster, 4/8 bit, I2C       */                           
+        PCF2116_3V3 = 7 | (LCD_C_I2C     | LCD_C_BST),               /**<  PCF2116 3V3 with Booster, 4/8 bit, I2C       */                           
+//        PCF2116_5V  = 8 | (LCD_C_I2C),                             /**<  PCF2116 5V no Booster, 4/8 bit, I2C          */        
+        AIP31068    = 9 | (LCD_C_SPI3_9  | LCD_C_I2C | LCD_C_BST)    /**<  AIP31068 I2C, SPI3                           */                           
+    };
+
+
+#if(0)
     /** LCD Controller Device */
     enum LCDCtrl {
         HD44780,     /**<  HD44780 (default)                           */    
-        WS0010,      /**<  WS0010  OLED Controller, 4/8 bit            */    
+        WS0010,      /**<  WS0010  OLED Controller, 4/8 bit, SPI       */    
         ST7036,      /**<  ST7036  3V3 with Booster, 4/8 bit, SPI      */   
         ST7032_3V3,  /**<  ST7032  3V3 with Booster, 4/8 bit, SPI, I2C */   
         ST7032_5V,   /**<  ST7032  5V no Booster, 4/8 bit, SPI, I2C    */           
-        KS0078,      /**<  KS0078  24x3 support                        */                   
+        KS0078,      /**<  KS0078  24x4 support, 4/8 bit               */                   
         PCF21XX_3V3, /**<  PCF21XX 3V3 with Booster, 4/8 bit, I2C      */                           
 //        PCF21XX_5V   /**<  PCF21XX 5V no Booster, 4/8 bit, I2C         */        
     };
-
+#endif
 
     /** LCD Cursor control */
     enum LCDCursor {
@@ -321,7 +416,6 @@
         CurOn_BlkOn   = 0x03   /**<  Cursor On, Blinking Char On */    
     };
 
-
     /** LCD Display control */
     enum LCDMode {
         DispOff = 0x00,  /**<  Display Off */    
@@ -334,7 +428,6 @@
         LightOn          /**<  Backlight On */            
     };
 
-
 #if DOXYGEN_ONLY
     /** Write a character to the LCD
      *
@@ -357,15 +450,13 @@
      */
     void locate(int column, int row);
 
-
     /** Return the memoryaddress of screen column and row location
      *
      * @param column  The horizontal position from the left, indexed from 0
      * @param row     The vertical position from the top, indexed from 0
      * @param return  The memoryaddress of screen column and row location
      */
-    int  getAddress(int column, int row);    
-    
+    int  getAddress(int column, int row);     
     
     /** Set the memoryaddress of screen column and row location
      *
@@ -374,7 +465,6 @@
      */
     void setAddress(int column, int row);        
 
-
     /** Clear the screen and locate to 0,0
      */
     void cls();
@@ -397,7 +487,6 @@
      */
     void setCursor(LCDCursor cursorMode);     
     
-
     /** Set the Displaymode
      *
      * @param displayMode The Display mode (DispOff, DispOn)
@@ -410,7 +499,6 @@
      */
     void setBacklight(LCDBacklight backlightMode); 
 
-
     /** Set User Defined Characters
      *
      * @param unsigned char c   The Index of the UDC (0..7)
@@ -419,7 +507,7 @@
     void setUDC(unsigned char c, char *udc_data);
 
 //test
-    void _initCtrl();    
+//    void _initCtrl();    
     
 protected:
 
@@ -437,7 +525,6 @@
       * @param ctrl  LCD controller (default = HD44780)           
       */
     TextLCD_Base(LCDType type = LCD16x2, LCDCtrl ctrl = HD44780);
-
     
     // Stream implementation functions
     virtual int _putc(int value);
@@ -449,7 +536,7 @@
 
 /** Low level initialisation method for LCD controller
   */
-//    void _initCtrl();    
+    void _initCtrl();    
 
 /** Low level character address set method
   */  
@@ -467,7 +554,6 @@
   */     
     void _setCursorAndDisplayMode(LCDMode displayMode, LCDCursor cursorType);       
     
-
 /** Low level nibble write operation to LCD controller (serial or parallel)
   */
     void _writeNibble(int value);
@@ -482,7 +568,6 @@
   */   
     void _writeData(int data);
 
-
 /** Pure Virtual Low level writes to LCD Bus (serial or parallel)
   * Set the Enable pin.
   */
@@ -510,7 +595,10 @@
     
 //Display type
     LCDType _type;
-
+    int _nr_cols;    
+    int _nr_rows;    
+    int _addr_mode;    
+        
 //Display mode
     LCDMode _currentMode;
 
@@ -549,7 +637,6 @@
      */
     TextLCD(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7, LCDType type = LCD16x2, PinName bl = NC, PinName e2 = NC, LCDCtrl ctrl = HD44780);
 
-
    /** Destruct a TextLCD interface for using regular mbed pins
      *
      * @param  none
@@ -633,8 +720,7 @@
   * Set the databus value (4 bit).
   */   
     virtual void _setData(int value);
-    
-    
+      
 /** Write data to MCP23008 I2C portexpander
   *  @param reg register to write
   *  @param value data to write
@@ -648,18 +734,14 @@
     char _slaveAddress;
     
 // Internal bus mirror value for serial bus only
-    char _lcd_bus;   
-    
+    char _lcd_bus;      
 };
 
-
 //---------- End TextLCD_I2C ------------
 
 
-
 //--------- Start TextLCD_SPI -----------
 
-
 /** Create a TextLCD interface using an SPI 74595 portexpander
   *
   */
@@ -674,7 +756,6 @@
      */
     TextLCD_SPI(SPI *spi, PinName cs, LCDType type = LCD16x2, LCDCtrl ctrl = HD44780);
 
-
 private:
 
 /** Implementation of pure Virtual Low level writes to LCD Bus (serial expander)
@@ -712,21 +793,19 @@
     
 // Internal bus mirror value for serial bus only
     char _lcd_bus;   
-
 };
 
 //---------- End TextLCD_SPI ------------
 
 
-
 //--------- Start TextLCD_SPI_N -----------
 
-/** Create a TextLCD interface using a controller with native SPI interface
+/** Create a TextLCD interface using a controller with native SPI4 interface
   *
   */
 class TextLCD_SPI_N : public TextLCD_Base {    
 public:
-    /** Create a TextLCD interface using a controller with native SPI interface
+    /** Create a TextLCD interface using a controller with native SPI4 interface
      *
      * @param spi             SPI Bus
      * @param cs              chip select pin (active low)
@@ -763,19 +842,147 @@
 /** Low level writes to LCD serial bus only (serial native)
   */
     virtual void _writeByte(int value);
-
    
 // SPI bus        
     SPI *_spi;
     DigitalOut _cs;    
     DigitalOut _rs;
+    
+//Backlight    
     DigitalOut *_bl;
-
 };
 
 //---------- End TextLCD_SPI_N ------------
 
 
+#if(0)
+//Code checked out on logic analyser. Not yet tested on hardware..
+
+//------- Start TextLCD_SPI_N_3_9 ---------
+
+/** Create a TextLCD interface using a controller with native SPI3 9 bits interface
+  * Note: current mbed libs only support SPI 9 bit mode for NXP platforms
+  *
+  */
+class TextLCD_SPI_N_3_9 : public TextLCD_Base {    
+public:
+   /** Create a TextLCD interface using a controller with native SPI3 9 bits interface
+     * Note: current mbed libs only support SPI 9 bit mode for NXP platforms
+     *
+     * @param spi             SPI Bus
+     * @param cs              chip select pin (active low)
+     * @param type            Sets the panel size/addressing mode (default = LCD16x2)
+     * @param bl              Backlight control line (optional, default = NC)  
+     * @param ctrl            LCD controller (default = AIP31068)                     
+     */
+    TextLCD_SPI_N_3_9(SPI *spi, PinName cs, LCDType type = LCD16x2, PinName bl = NC, LCDCtrl ctrl = AIP31068);
+    virtual ~TextLCD_SPI_N_3_9(void);
+
+private:
+
+/** Implementation of pure Virtual Low level writes to LCD Bus (serial native)
+  * Set the Enable pin.
+  */
+    virtual void _setEnable(bool value);
+
+/** Implementation of pure Virtual Low level writes to LCD Bus (serial native)
+  * Set the RS pin ( 0 = Command, 1 = Data).
+  */   
+    virtual void _setRS(bool value);  
+
+/** Implementation of pure Virtual Low level writes to LCD Bus (serial native)
+  * Set the BL pin (0 = Backlight Off, 1 = Backlight On).
+  */   
+    virtual void _setBL(bool value);
+    
+/** Implementation of pure Virtual Low level writes to LCD Bus (serial native)
+  * Set the databus value (4 bit).
+  */   
+    virtual void _setData(int value);
+
+/** Low level writes to LCD serial bus only (serial native)
+  */
+    virtual void _writeByte(int value);
+   
+// SPI bus        
+    SPI *_spi;
+    DigitalOut _cs;    
+   
+// controlbyte to select between data and command. Internal value for serial bus only
+    char _controlbyte;   
+
+//Backlight
+    DigitalOut *_bl;    
+};
+
+//-------- End TextLCD_SPI_N_3_9 ----------
+#endif
+
+
+#if(0)
+//Code checked out on logic analyser. Not yet tested on hardware..
+
+//------- Start TextLCD_SPI_N_3_10 ---------
+
+/** Create a TextLCD interface using a controller with native SPI3 10 bits interface
+  * Note: current mbed libs only support SPI 10 bit mode for NXP platforms
+  *
+  */
+class TextLCD_SPI_N_3_10 : public TextLCD_Base {    
+public:
+   /** Create a TextLCD interface using a controller with native SPI3 10 bits interface
+     * Note: current mbed libs only support SPI 10 bit mode for NXP platforms
+     *
+     * @param spi             SPI Bus
+     * @param cs              chip select pin (active low)
+     * @param type            Sets the panel size/addressing mode (default = LCD16x2)
+     * @param bl              Backlight control line (optional, default = NC)  
+     * @param ctrl            LCD controller (default = AIP31068)                     
+     */
+    TextLCD_SPI_N_3_10(SPI *spi, PinName cs, LCDType type = LCD16x2, PinName bl = NC, LCDCtrl ctrl = AIP31068);
+    virtual ~TextLCD_SPI_N_3_10(void);
+
+private:
+
+/** Implementation of pure Virtual Low level writes to LCD Bus (serial native)
+  * Set the Enable pin.
+  */
+    virtual void _setEnable(bool value);
+
+/** Implementation of pure Virtual Low level writes to LCD Bus (serial native)
+  * Set the RS pin ( 0 = Command, 1 = Data).
+  */   
+    virtual void _setRS(bool value);  
+
+/** Implementation of pure Virtual Low level writes to LCD Bus (serial native)
+  * Set the BL pin (0 = Backlight Off, 1 = Backlight On).
+  */   
+    virtual void _setBL(bool value);
+    
+/** Implementation of pure Virtual Low level writes to LCD Bus (serial native)
+  * Set the databus value (4 bit).
+  */   
+    virtual void _setData(int value);
+
+/** Low level writes to LCD serial bus only (serial native)
+  */
+    virtual void _writeByte(int value);
+   
+// SPI bus        
+    SPI *_spi;
+    DigitalOut _cs;    
+   
+// controlbyte to select between data and command. Internal value for serial bus only
+    char _controlbyte;   
+
+//Backlight
+    DigitalOut *_bl;    
+};
+
+//-------- End TextLCD_SPI_N_3_10 ----------
+#endif
+
+
 //--------- Start TextLCD_I2C_N -----------
 
 /** Create a TextLCD interface using a controller with native I2C interface
@@ -820,7 +1027,6 @@
   */
     virtual void _writeByte(int value);
 
-
 //I2C bus
     I2C *_i2c;
     char _slaveAddress;
@@ -828,6 +1034,7 @@
 // controlbyte to select between data and command. Internal value for serial bus only
     char _controlbyte;   
     
+//Backlight
     DigitalOut *_bl;    
 };