Added new createChar() method. Added new clear() method. Added new scrollDisplayLeft() method. Added new scrollDisplayRight() method. Added support for Arduino alike Custom Character, scroll and clear command interfaces.

Dependents:   mbed_lcd_custom MMA8451_ACELEROMETRO_copy

Fork of TextLCD by The Electronics Nuke

Revision:
32:0a5271dd8a9c
Parent:
31:ef31cd8a00d1
Child:
33:ec30a01baf4a
--- a/TextLCD.h	Sun Jun 29 14:55:50 2014 +0000
+++ b/TextLCD.h	Thu Jul 03 20:01:44 2014 +0000
@@ -7,10 +7,6 @@
  *               2013, v05: WH, Added support for 8x2B, added some UDCs  
  *               2013, v06: WH, Added support for devices that use internal DC/DC converters 
  *               2013, v07: WH, Added support for backlight and include portdefinitions for LCD2004 Module from DFROBOT
- *               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  
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -36,11 +32,12 @@
 
 #include "mbed.h"
 
+
 /** A TextLCD interface for driving 4-bit HD44780-based LCDs
  *
- * 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. 
+ * Currently supports 8x1, 8x2, 12x4, 16x1, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2 and 40x4 panels
+ * Interface options include direct mbed pins, I2C portexpander (PCF8474) or SPI bus shiftregister (74595)
+ * Supports some controllers that provide internal DC/DC converters for VLCD or VLED. 
  *
  * @code
  * #include "mbed.h"
@@ -52,12 +49,10 @@
  * // SPI Communication
  * SPI spi_lcd(p5, NC, p7); // MOSI, MISO, SCLK
  *
- * //TextLCD lcd(p15, p16, p17, p18, p19, p20);                          // RS, E, D4-D7, LCDType=LCD16x2, BL=NC, E2=NC, LCDTCtrl=HD44780
- * //TextLCD_SPI lcd(&spi_lcd, p8, TextLCD::LCD40x4);                    // SPI bus, 74595 expander, CS pin, LCD Type  
- * TextLCD_I2C lcd(&i2c_lcd, 0x42, TextLCD::LCD20x4);                  // I2C bus, PCF8574 Slaveaddress, LCD Type
- * //TextLCD_I2C lcd(&i2c_lcd, 0x42, TextLCD::LCD16x2, TextLCD::WS0010); // I2C bus, PCF8574 Slaveaddress, LCD Type, Device Type
- * //TextLCD_SPI_N lcd(&spi_lcd, p8, p9);                                // SPI bus, CS pin, RS pin, LCDType=LCD16x2, BL=NC, LCDTCtrl=ST7032_3V3   
- * //TextLCD_I2C_N lcd(&i2c_lcd, ST7032_SA, TextLCD::LCD16x2, NC, TextLCD::ST7032_3V3); // I2C bus, Slaveaddress, LCD Type, BL=NC, LCDTCtrl=ST7032_3V3  
+ * TextLCD lcd(p15, p16, p17, p18, p19, p20);     // RS, E, D4-D7, LCDType=LCD16x2, BL=NC, E2=NC, LCDTCtrl=HD44780
+ * //TextLCD lcd(&spi_lcd, p8, TextLCD::LCD40x4);   // SPI bus, CS pin, LCD Type  
+ * //TextLCD lcd(&i2c_lcd, 0x42, TextLCD::LCD20x4); // I2C bus, PCF8574 Slaveaddress, LCD Type
+ * //TextLCD lcd(&i2c_lcd, 0x42, TextLCD::LCD16x2, TextLCD::WS0010); // I2C bus, PCF8574 Slaveaddress, LCD Type, Device Type
  * 
  * int main() {
  *   lcd.printf("Hello World!\n");
@@ -65,23 +60,14 @@
  * @endcode
  */
 
-
-//Pin Defines for I2C PCF8574/PCF8574A or MCP23008 and SPI 74595 bus expander interfaces
+//Pin Defines for I2C PCF8574 and SPI 74595 Bus interfaces
 //LCD and serial portexpanders should be wired accordingly 
 //
-//Select Hardware module (one option only)
-#define DEFAULT        1
-#define ADAFRUIT       0
-#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
-//See https://mbed.org/cookbook/Text-LCD-Enhanced
-//
+#if (1)
+//Definitions for hardware used by WH 
 //Note: LCD RW pin must be connected to GND
 //      E2 is used for LCD40x4 (second controller)
-//      BL may be used to control backlight
+//      BL may be used for future expansion to control backlight
 #define D_LCD_PIN_D4   0
 #define D_LCD_PIN_D5   1
 #define D_LCD_PIN_D6   2
@@ -93,42 +79,12 @@
 
 #define D_LCD_PIN_RW   D_LCD_PIN_E2
 
-//Select I2C Portexpander type (one option only)
-#define PCF8574        1
-#define MCP23008       0
-#endif
+#else
 
-#if (ADAFRUIT==1)
-//Definitions for Adafruit i2cspilcdbackpack mapping between serial port expander pins and LCD controller
-//This hardware supports both an I2C expander (MCP23008) and an SPI expander (74595) selectable by a jumper.
-//See http://www.ladyada.net/products/i2cspilcdbackpack
-//
+//Definitions for LCD2004 Module from DFROBOT, See http://arduino-info.wikispaces.com/LCD-Blue-I2C
+//This hardware is different from earlier/different Arduino I2C LCD displays
 //Note: LCD RW pin must be kept LOW
-//      E2 is not available on this hardware and so it does not support LCD40x4 (second controller)
-//      BL is used to control backlight
-#define D_LCD_PIN_0    0
-#define D_LCD_PIN_RS   1
-#define D_LCD_PIN_E    2
-#define D_LCD_PIN_D4   3
-#define D_LCD_PIN_D5   4
-#define D_LCD_PIN_D6   5
-#define D_LCD_PIN_D7   6
-#define D_LCD_PIN_BL   7
-
-#define D_LCD_PIN_E2   D_LCD_PIN_0
-
-//Force I2C portexpander type
-#define PCF8574        0
-#define MCP23008       1
-#endif
-
-#if (DFROBOT==1)
-//Definitions for DFROBOT LCD2004 Module mapping between serial port expander pins and LCD controller
-//This hardware uses PCF8574 and is different from earlier/different Arduino I2C LCD displays
-//See http://arduino-info.wikispaces.com/LCD-Blue-I2C
-//
-//Note: LCD RW pin must be kept LOW
-//      E2 is not available on default Arduino hardware and so it does not support LCD40x4 (second controller)
+//      E2 is not available on default Arduino hardware and does not support LCD40x4 (second controller)
 //      BL is used to control backlight
 #define D_LCD_PIN_RS   0
 #define D_LCD_PIN_RW   1
@@ -140,13 +96,9 @@
 #define D_LCD_PIN_D7   7
 
 #define D_LCD_PIN_E2   D_LCD_PIN_RW
-
-//Force I2C portexpander type
-#define PCF8574        1
-#define MCP23008       0
 #endif
 
-//Bitpattern Defines for I2C PCF8574/PCF8574A, MCP23008 and SPI 74595 Bus expanders
+//Bitpattern Defines for I2C PCF8574 and SPI 74595 Bus
 //
 #define D_LCD_D4       (1<<D_LCD_PIN_D4)
 #define D_LCD_D5       (1<<D_LCD_PIN_D5)
@@ -158,207 +110,86 @@
 #define D_LCD_BL       (1<<D_LCD_PIN_BL)
 //#define D_LCD_RW       (1<<D_LCD_PIN_RW)
 
+
 #define D_LCD_BUS_MSK  (D_LCD_D4 | D_LCD_D5 | D_LCD_D6 | D_LCD_D7)
 #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 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
-
-/* 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
-
-
-/* ST7032I I2C slave address */
-#define ST7032_SA      0x7C
-
-/* PCF21XX I2C slave address */
-#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 */
-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_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_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_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_degr[];    // Degree symbol
-
-extern const char udc_TM_T[];    // Trademark T
-extern const char udc_TM_M[];    // Trademark M
+const char udc_degr[]   = {0x06, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00};  // Degree symbol
 
-//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_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_smiley[];  // Smiley
-//extern const char udc_droopy[];  // Droopey
-//extern const char udc_note[];    // Note
+//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_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_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_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)
+//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
+
 
 /** A TextLCD interface for driving 4-bit HD44780-based LCDs
  *
- * @brief Currently supports 8x1, 8x2, 12x2, 12x4, 16x1, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2 and 40x4 panels
- *        Interface options include direct mbed pins, I2C portexpander (PCF8474/PCF8574A or MCP23008) or SPI bus shiftregister (74595) and some native I2C or SPI devices 
+ * Currently supports 8x1, 8x2, 12x2, 12x4, 16x1, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2 and 40x4 panels
  *
  */
-class TextLCD_Base : public Stream {
+class TextLCD : public Stream {
 public:
 
     /** 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 */                        
+        LCD8x1,     /**<  8x1 LCD panel */    
+        LCD8x2,     /**<  8x2 LCD panel */          
+        LCD8x2B,    /**<  8x2 LCD panel (actually 16x1) */                  
+        LCD12x2,    /**< 12x2 LCD panel */                          
+        LCD12x4,    /**< 12x4 LCD panel */                  
+        LCD16x1,    /**< 16x1 LCD panel (actually 8x2) */          
+        LCD16x2,    /**< 16x2 LCD panel (default) */
+        LCD16x2B,   /**< 16x2 LCD panel alternate addressing */
+        LCD16x4,    /**< 16x4 LCD panel */        
+        LCD20x2,    /**< 20x2 LCD panel */
+        LCD20x4,    /**< 20x4 LCD panel */
+        LCD24x2,    /**< 24x2 LCD panel */        
+        LCD24x4,    /**< 24x4 LCD panel, special mode KS0078 */                
+        LCD40x2,    /**< 40x2 LCD panel */                
+        LCD40x4     /**< 40x4 LCD panel, Two controller version */                        
     };
 
-
     /** 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                           */                           
+        HD44780,    /**<  HD44780 (default)      */    
+        WS0010,     /**<  WS0010 OLED Controller */    
+        ST7036      /**<  ST7036                 */    
     };
 
 
@@ -370,6 +201,7 @@
         CurOn_BlkOn   = 0x03   /**<  Cursor On, Blinking Char On */    
     };
 
+
     /** LCD Display control */
     enum LCDMode {
         DispOff = 0x00,  /**<  Display Off */    
@@ -382,6 +214,38 @@
         LightOn          /**<  Backlight On */            
     };
 
+    /** Create a TextLCD interface for using regular mbed pins
+     *
+     * @param rs    Instruction/data control line
+     * @param e     Enable line (clock)
+     * @param d4-d7 Data lines for using as a 4-bit interface
+     * @param type  Sets the panel size/addressing mode (default = LCD16x2)
+     * @param bl    Backlight control line (optional, default = NC)      
+     * @param e2    Enable2 line (clock for second controller, LCD40x4 only)  
+     * @param ctrl  LCD controller (default = HD44780)           
+     */
+    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);
+    
+    /** Create a TextLCD interface using an I2C PC8574 portexpander
+     *
+     * @param i2c             I2C Bus
+     * @param deviceAddress   I2C slave address (PCF8574)
+     * @param type            Sets the panel size/addressing mode (default = LCD16x2)
+     * @param ctrl            LCD controller (default = HD44780)                
+     */
+    TextLCD(I2C *i2c, char deviceAddress, LCDType type = LCD16x2, LCDCtrl ctrl = HD44780);
+
+
+    /** Create a TextLCD interface using an SPI 74595 portexpander
+     *
+     * @param spi             SPI Bus
+     * @param cs              chip select pin (active low)
+     * @param type            Sets the panel size/addressing mode (default = LCD16x2)
+     * @param ctrl            LCD controller (default = HD44780)                     
+     */
+    TextLCD(SPI *spi, PinName cs, LCDType type = LCD16x2, LCDCtrl ctrl = HD44780);
+
+
 #if DOXYGEN_ONLY
     /** Write a character to the LCD
      *
@@ -397,20 +261,22 @@
     int printf(const char* format, ...);
 #endif
 
-    /** Locate cursor to a screen column and row
+    /** Locate to a screen column and row
      *
      * @param column  The horizontal position from the left, indexed from 0
      * @param row     The vertical position from the top, indexed from 0
      */
     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
      *
@@ -419,8 +285,10 @@
      */
     void setAddress(int column, int row);        
 
-    /** Clear the screen and locate to 0,0
-     */
+
+    void createChar(int addrx, char *ptrx);
+        
+        /** Clear the screen and locate to 0,0 */
     void cls();
 
     /** Return the number of rows
@@ -441,17 +309,19 @@
      */
     void setCursor(LCDCursor cursorMode);     
     
+
     /** Set the Displaymode
      *
      * @param displayMode The Display mode (DispOff, DispOn)
      */
-    void setMode(LCDMode displayMode);     
+    void setMode(TextLCD::LCDMode displayMode);     
 
     /** Set the Backlight mode
      *
-     *  @param backlightMode The Backlight mode (LightOff, LightOn)
+     * @param backlightMode The Backlight mode (LightOff, LightOn)
      */
-    void setBacklight(LCDBacklight backlightMode); 
+    void setBacklight(TextLCD::LCDBacklight backlightMode); 
+
 
     /** Set User Defined Characters
      *
@@ -460,100 +330,72 @@
      */
     void setUDC(unsigned char c, char *udc_data);
 
-//test
-//    void _initCtrl();    
-    
+
 protected:
+   /* LCD Bus control */
+    enum _LCDBus {
+        _PinBus,  /*<  Regular mbed pins */    
+        _I2CBus,  /*<  I2C PCF8574 Portexpander */    
+        _SPIBus   /*<  SPI 74595 Shiftregister */    
+    };
 
-   /** LCD controller select, mainly used for LCD40x4
-     */
+   /* LCD controller select, mainly used for LCD40x4 */
     enum _LCDCtrl_Idx {
         _LCDCtrl_0,  /*<  Primary */    
         _LCDCtrl_1,  /*<  Secondary */            
     };
-
-    /** Create a TextLCD_Base interface
-      * @brief Base class, can not be instantiated
-      *
-      * @param type  Sets the panel size/addressing mode (default = LCD16x2)
-      * @param ctrl  LCD controller (default = HD44780)           
-      */
-    TextLCD_Base(LCDType type = LCD16x2, LCDCtrl ctrl = HD44780);
     
     // Stream implementation functions
     virtual int _putc(int value);
     virtual int _getc();
 
-/** Low level method for LCD controller
-  */
+//Low level methods for LCD controller
     void _init();    
-
-/** Low level initialisation method for LCD controller
-  */
     void _initCtrl();    
-
-/** Low level character address set method
-  */  
     int  _address(int column, int row);
+    void _setCursor(TextLCD::LCDCursor show);
+    void _setUDC(unsigned char c, char *udc_data);   
+    void _setCursorAndDisplayMode(TextLCD::LCDMode displayMode, TextLCD::LCDCursor cursorType);       
     
-/** Low level cursor enable or disable method
-  */  
-    void _setCursor(LCDCursor show);
-
-/** Low level method to store user defined characters for current controller
-  */     
-    void _setUDC(unsigned char c, char *udc_data);   
-
-/** Low level method to restore the cursortype and display mode for current controller
-  */     
-    void _setCursorAndDisplayMode(LCDMode displayMode, LCDCursor cursorType);       
-    
-/** Low level nibble write operation to LCD controller (serial or parallel)
-  */
+//Low level write operations to LCD controller
     void _writeNibble(int value);
-   
-/** Low level command byte write operation to LCD controller.
-  * Methods resets the RS bit and provides the required timing for the command.
-  */
+    void _writeByte(int value);
     void _writeCommand(int command);
-
-/** Low level data byte write operation to LCD controller (serial or parallel).
-  * Methods sets the RS bit and provides the required timing for the data.
-  */   
     void _writeData(int data);
 
-/** Pure Virtual Low level writes to LCD Bus (serial or parallel)
-  * Set the Enable pin.
-  */
-    virtual void _setEnable(bool value) = 0;
-
-/** Pure Virtual Low level writes to LCD Bus (serial or parallel)
-  * Set the RS pin ( 0 = Command, 1 = Data).
-  */   
-    virtual void _setRS(bool value) = 0;  
+//Low level writes to LCD Bus (serial or parallel)
+    void _setEnable(bool value);
+    void _setRS(bool value);  
+    void _setBL(bool value);
+    void _setData(int value);
+    void _setCS(bool value);
+    
+//Low level writes to LCD serial bus only
+    void _writeBus();      
 
-/** Pure Virtual Low level writes to LCD Bus (serial or parallel)
-  * Set the BL pin (0 = Backlight Off, 1 = Backlight On).
-  */   
-    virtual void _setBL(bool value) = 0;
+  
+// Regular mbed pins bus
+    DigitalOut _rs, _e, _bl, _e2;
+    BusOut _d;
+    
+// I2C bus    
+    I2C *_i2c;
+    unsigned char _slaveAddress;
     
-/** Pure Virtual Low level writes to LCD Bus (serial or parallel)
-  * Set the databus value (4 bit).
-  */   
-    virtual void _setData(int value) = 0;
+// SPI bus        
+    SPI *_spi;
+    DigitalOut _cs;    
+    
+//Bus Interface type    
+    _LCDBus _busType;
 
-/** Low level byte write operation to LCD controller (serial or parallel)
-  * Depending on the RS pin this byte will be interpreted as data or command
-  */
-    virtual void _writeByte(int value);
+// Internal bus mirror value for serial bus only
+    char _lcd_bus;   
     
 //Display type
     LCDType _type;
-    int _nr_cols;    
-    int _nr_rows;    
-    int _addr_mode;    
-        
-//Display mode
+
+//Display type
     LCDMode _currentMode;
 
 //Controller type 
@@ -568,431 +410,4 @@
     LCDCursor _currentCursor;    
 };
 
-//--------- End TextLCD_Base -----------
-
-
-
-//--------- Start TextLCD Bus -----------
-
-/** Create a TextLCD interface for using regular mbed pins
-  *
-  */
-class TextLCD : public TextLCD_Base {
-public:    
-    /** Create a TextLCD interface for using regular mbed pins
-     *
-     * @param rs    Instruction/data control line
-     * @param e     Enable line (clock)
-     * @param d4-d7 Data lines for using as a 4-bit interface
-     * @param type  Sets the panel size/addressing mode (default = LCD16x2)
-     * @param bl    Backlight control line (optional, default = NC)      
-     * @param e2    Enable2 line (clock for second controller, LCD40x4 only)  
-     * @param ctrl  LCD controller (default = HD44780)           
-     */
-    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
-     * @return none
-     */ 
-    virtual ~TextLCD();
-
-private:    
-
-/** Implementation of pure Virtual Low level writes to LCD Bus (parallel)
-  * Set the Enable pin.
-  */
-    virtual void _setEnable(bool value);
-
-/** Implementation of pure Virtual Low level writes to LCD Bus (parallel)
-  * Set the RS pin ( 0 = Command, 1 = Data).
-  */   
-    virtual void _setRS(bool value);  
-
-/** Implementation of pure Virtual Low level writes to LCD Bus (parallel)
-  * 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 (parallel)
-  * Set the databus value (4 bit).
-  */   
-    virtual void _setData(int value);
-
-
-/** Regular mbed pins bus
-  */
-    DigitalOut _rs, _e;
-    BusOut _d;
-    
-/** Optional Hardware pins for the Backlight and LCD40x4 device
-  * Default PinName value is NC, must be used as pointer to avoid issues with mbed lib and DigitalOut pins
-  */
-    DigitalOut *_bl, *_e2;       
-};
-
-    
-//----------- End TextLCD ---------------
-
-
-//--------- Start TextLCD_I2C -----------
-
-
-/** Create a TextLCD interface using an I2C PCF8574 (or PCF8574A) or MCP23008 portexpander
-  *
-  */
-class TextLCD_I2C : public TextLCD_Base {    
-public:
-   /** Create a TextLCD interface using an I2C PCF8574 (or PCF8574A) or MCP23008 portexpander
-     *
-     * @param i2c             I2C Bus
-     * @param deviceAddress   I2C slave address (PCF8574 or PCF8574A, default = PCF8574_SA0 = 0x40)
-     * @param type            Sets the panel size/addressing mode (default = LCD16x2)
-     * @param ctrl            LCD controller (default = HD44780)                
-     */
-    TextLCD_I2C(I2C *i2c, char deviceAddress = PCF8574_SA0, LCDType type = LCD16x2, LCDCtrl ctrl = HD44780);
-
-private:
-    
-/** Implementation of pure Virtual Low level writes to LCD Bus (serial expander)
-  * Set the Enable pin.
-  */
-    virtual void _setEnable(bool value);
-
-/** Implementation of pure Virtual Low level writes to LCD Bus (serial expander)
-  * Set the RS pin ( 0 = Command, 1 = Data).
-  */   
-    virtual void _setRS(bool value);  
-
-/** Implementation of pure Virtual Low level writes to LCD Bus (serial expander)
-  * 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 expander)
-  * 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
-  *  @return none     
-  *
-  */
-    void _write_register (int reg, int value);     
-  
-//I2C bus
-    I2C *_i2c;
-    char _slaveAddress;
-    
-// Internal bus mirror value for serial bus only
-    char _lcd_bus;      
-};
-
-//---------- End TextLCD_I2C ------------
-
-
-//--------- Start TextLCD_SPI -----------
-
-/** Create a TextLCD interface using an SPI 74595 portexpander
-  *
-  */
-class TextLCD_SPI : public TextLCD_Base {    
-public:
-    /** Create a TextLCD interface using an SPI 74595 portexpander
-     *
-     * @param spi             SPI Bus
-     * @param cs              chip select pin (active low)
-     * @param type            Sets the panel size/addressing mode (default = LCD16x2)
-     * @param ctrl            LCD controller (default = HD44780)                     
-     */
-    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)
-  * Set the Enable pin.
-  */
-    virtual void _setEnable(bool value);
-
-/** Implementation of pure Virtual Low level writes to LCD Bus (serial expander)
-  * Set the RS pin ( 0 = Command, 1 = Data).
-  */   
-    virtual void _setRS(bool value);  
-
-/** Implementation of pure Virtual Low level writes to LCD Bus (serial expander)
-  * 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 expander)
-  * Set the databus value (4 bit).
-  */   
-    virtual void _setData(int value);
-    
-/** Implementation of Low level writes to LCD Bus (serial expander)
-  * Set the CS pin (0 = select, 1 = deselect).
-  */   
-    virtual void _setCS(bool value);
-    
-///** Low level writes to LCD serial bus only (serial expander)
-//  */
-//    void _writeBus();      
-   
-// SPI bus        
-    SPI *_spi;
-    DigitalOut _cs;    
-    
-// 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 SPI4 interface
-  *
-  */
-class TextLCD_SPI_N : public TextLCD_Base {    
-public:
-    /** Create a TextLCD interface using a controller with native SPI4 interface
-     *
-     * @param spi             SPI Bus
-     * @param cs              chip select pin (active low)
-     * @param rs              Instruction/data control line
-     * @param type            Sets the panel size/addressing mode (default = LCD16x2)
-     * @param bl              Backlight control line (optional, default = NC)  
-     * @param ctrl            LCD controller (default = ST7032_3V3)                     
-     */
-    TextLCD_SPI_N(SPI *spi, PinName cs, PinName rs, LCDType type = LCD16x2, PinName bl = NC, LCDCtrl ctrl = ST7032_3V3);
-    virtual ~TextLCD_SPI_N(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;    
-    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
-  *
-  */
-class TextLCD_I2C_N : public TextLCD_Base {    
-public:
-    /** Create a TextLCD interface using a controller with native I2C interface
-     *
-     * @param i2c             I2C Bus
-     * @param deviceAddress   I2C slave address (default = ST7032_SA = 0x7C)  
-     * @param type            Sets the panel size/addressing mode (default = LCD16x2)
-     * @param bl              Backlight control line (optional, default = NC)       
-     * @param ctrl            LCD controller (default = ST7032_3V3)                     
-     */
-    TextLCD_I2C_N(I2C *i2c, char deviceAddress = ST7032_SA, LCDType type = LCD16x2, PinName bl = NC, LCDCtrl ctrl = ST7032_3V3);
-    virtual ~TextLCD_I2C_N(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);
-
-//I2C bus
-    I2C *_i2c;
-    char _slaveAddress;
-    
-// controlbyte to select between data and command. Internal value for serial bus only
-    char _controlbyte;   
-    
-//Backlight
-    DigitalOut *_bl;    
-};
-
-//---------- End TextLCD_I2C_N ------------
-
-
-#endif