Updated for more display types. Fixed memoryaddress confusion in address() method. Added new getAddress() method. Added support for UDCs, Backlight control and other features such as control through I2C and SPI port expanders and controllers with native I2C and SPI interfaces. Refactored to fix issue with pins that are default declared as NC.

Dependents:   GPSDevice TestTextLCD SD to Flash Data Transfer DrumMachine ... more

Fork of TextLCD by Simon Ford

Example

Hello World! for the TextLCD

#include "mbed.h"
#include "TextLCD.h"
 
// Host PC Communication channels
Serial pc(USBTX, USBRX); // tx, rx
 
// I2C Communication
I2C i2c_lcd(p28,p27); // SDA, SCL
 
// 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  

int main() {
    pc.printf("LCD Test. Columns=%d, Rows=%d\n\r", lcd.columns(), lcd.rows());
    
    for (int row=0; row<lcd.rows(); row++) {
      int col=0;
      
      pc.printf("MemAddr(Col=%d, Row=%d)=0x%02X\n\r", col, row, lcd.getAddress(col, row));      
//      lcd.putc('-');
      lcd.putc('0' + row);      
      
      for (col=1; col<lcd.columns()-1; col++) {    
        lcd.putc('*');
      }
 
      pc.printf("MemAddr(Col=%d, Row=%d)=0x%02X\n\r", col, row, lcd.getAddress(col, row));      
      lcd.putc('+');
        
    }    
    
// Show cursor as blinking character
    lcd.setCursor(TextLCD::CurOff_BlkOn);
 
// Set and show user defined characters. A maximum of 8 UDCs are supported by the HD44780.
// They are defined by a 5x7 bitpattern. 
    lcd.setUDC(0, (char *) udc_0);  // Show |>
    lcd.putc(0);    
    lcd.setUDC(1, (char *) udc_1);  // Show <|
    lcd.putc(1);    

}

Handbook page

More info is here

Revision:
41:111ca62e8a59
Parent:
40:d3496c3ea301
--- a/TextLCD.h	Wed May 20 18:46:51 2015 +0000
+++ b/TextLCD.h	Fri Nov 06 18:59:27 2015 +0000
@@ -22,6 +22,8 @@
  *               2015, v19: WH, Added 10x2D and 10x4D type for SSD1803 
  *               2015, v20: WH, Fixed occasional Init fail caused by insufficient wait time after ReturnHome command (0x02), Added defines to reduce memory footprint (eg LCD_ICON),
  *                              Fixed and Added more fonttable support for PCF2119R_3V3, Added HD66712 controller.
+ *               2015, v21: WH, Added LCD32x2 defines and code, Fixed LCD12x4D enum, Added font enums, Added SPLC792A controller,
+ *                              Added UTF8_2_LCD decode for Cyrilic font (By Andriy Ribalko). Added setFont()
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -87,41 +89,51 @@
 
 /* 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_C6       0x00000006
-#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
+
+// Type ID encoded in b7..b0
+#define LCD_T_ID_MSK   0x000000FF
+#define LCD_T_ID_SHFT           0
+
+// Columns encoded in b15..b8
+#define LCD_T_COL_MSK  0x0000FF00
+#define LCD_T_COL_SHFT          8
+#define LCD_T_C6       0x00000600
+#define LCD_T_C8       0x00000800
+#define LCD_T_C10      0x00000A00
+#define LCD_T_C12      0x00000C00
+#define LCD_T_C16      0x00001000
+#define LCD_T_C20      0x00001400
+#define LCD_T_C24      0x00001800
+#define LCD_T_C32      0x00002000
+#define LCD_T_C40      0x00002800
+//#define LCD_T_C52      0x00003400
 
-// 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
-#define LCD_T_R6       0x00000600
+// Rows encoded in b23..b16  
+#define LCD_T_ROW_MSK  0x00FF0000
+#define LCD_T_ROW_SHFT         16
+#define LCD_T_R1       0x00010000
+#define LCD_T_R2       0x00020000
+#define LCD_T_R3       0x00030000
+#define LCD_T_R4       0x00040000
+#define LCD_T_R6       0x00060000
   
-// Addressing mode encoded in b19..b16
-#define LCD_T_ADR_MSK  0x000F0000
+// Addressing mode encoded in b27..b24
+#define LCD_T_ADR_MSK  0x0F000000
+#define LCD_T_ADR_SHFT         24
 #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, 20x4, 24x4)     */
-#define LCD_T_D1       0x00040000  /*Mode D1, Alternate 3 out of 4 line display (12x3, 20x3, 24x3) */
-#define LCD_T_E        0x00050000  /*Mode E,  40x4 display (actually two 40x2)                     */
-#define LCD_T_F        0x00060000  /*Mode F,  16x3 display (actually 24x2)                         */
-#define LCD_T_G        0x00070000  /*Mode G,  16x3 display                                         */
+#define LCD_T_B        0x01000000  /*Mode B,  Alternate 8x2 (actually 16x1 display)                */
+#define LCD_T_C        0x02000000  /*Mode C,  Alternate 16x1 (actually 8x2 display)                */
+#define LCD_T_D        0x03000000  /*Mode D,  Alternate 3 or 4 line display (12x4, 20x4, 24x4)     */
+#define LCD_T_D1       0x04000000  /*Mode D1, Alternate 3 out of 4 line display (12x3, 20x3, 24x3) */
+#define LCD_T_E        0x05000000  /*Mode E,  40x4 display (actually two 40x2)                     */
+#define LCD_T_F        0x06000000  /*Mode F,  16x3 display (actually 24x2)                         */
+#define LCD_T_G        0x07000000  /*Mode G,  16x3 display                                         */
 
 /* 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_BUS_SHFT         24
 #define LCD_C_PAR      0x01000000  /*Parallel 4 or 8 bit data, E pin, RS pin, RW=GND            */
 #define LCD_C_SPI3_8   0x02000000  /*SPI 3 line (MOSI, SCL, CS pins),  8 bits (Count Command initiates Data transfer) */
 #define LCD_C_SPI3_9   0x04000000  /*SPI 3 line (MOSI, SCL, CS pins),  9 bits (RS + 8 Data)     */
@@ -132,15 +144,27 @@
 #define LCD_C_I2C      0x80000000  /*I2C (SDA, SCL pin), 8 control bits (Co, RS, RW) + 8 Data   */
 // Features encoded in b23..b16
 #define LCD_C_FTR_MSK  0x00FF0000 
+#define LCD_C_FTR_SHFT         16
 #define LCD_C_BST      0x00010000  /*Booster             */
 #define LCD_C_CTR      0x00020000  /*Contrast Control    */
 #define LCD_C_ICN      0x00040000  /*Icons               */
 #define LCD_C_PDN      0x00080000  /*Power Down          */
 // Fonttable encoded in b15..b12
-#define LCD_C_FNT_MSK  0x0000F000 
-#define LCD_C_FT0      0x00000000  /*Default             */
-#define LCD_C_FT1      0x00001000  /*Font1, C            */
-#define LCD_C_FT2      0x00002000  /*Font2, R            */
+#define LCD_C_FNT_MSK  0x0000F000
+#define LCD_C_FNT_SHFT         12 
+#define LCD_C_F0       0x00000000  /*Default HD44780 UK/JAP    */
+#define LCD_C_FC       0x00001000  /*PCF21xxC                  */
+#define LCD_C_FR       0x00002000  /*PCF21XXR                  */
+#define LCD_C_FK       0x00003000  /*PCF21XXK                  */
+#define LCD_C_FRA      0x00004000  /*SSD1803 ROM_A UK/EU       */
+#define LCD_C_FRB      0x00005000  /*SSD1803 ROM_B UK/Cyrillic */
+#define LCD_C_FRC      0x00006000  /*SSD1803 ROM_C UK/JAP      */
+#define LCD_C_FD       0x00007000  /*SPLC780D EU/Cyrillic      */
+#define LCD_C_FT       0x00008000  /*ST7066-0T EU/Cyrillic     */
+
+// Type ID encoded in b7..b0
+#define LCD_C_ID_MSK   0x000000FF
+#define LCD_C_ID_SHFT           0
 
 /** A TextLCD interface for driving 4-bit HD44780-based LCDs
  *
@@ -168,7 +192,7 @@
 //        LCD6x2     = (LCD_T_A | LCD_T_C6 | LCD_T_R2),     /**<  6x2 LCD panel */
         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) */
+        LCD8x2B    = (LCD_T_B | LCD_T_C8 | LCD_T_R2),     /**<  8x2 LCD panel (actually 16x1) */
 //        LCD10x2D   = (LCD_T_D | LCD_T_C10 | LCD_T_R2),    /**< 10x2 LCD panel, special mode SSD1803, 4-line but double height */        
         LCD10x4D   = (LCD_T_D | LCD_T_C10 | LCD_T_R4),    /**< 10x4 LCD panel, special mode SSD1803 */
         LCD12x1    = (LCD_T_A | LCD_T_C12 | LCD_T_R1),    /**< 12x1 LCD panel */
@@ -177,7 +201,7 @@
         LCD12x3D1  = (LCD_T_D1 | LCD_T_C12 | LCD_T_R3),   /**< 12x3 LCD panel, special mode PCF21XX, KS0073 */
 //        LCD12x3G   = (LCD_T_G | LCD_T_C12 | LCD_T_R3),    /**< 12x3 LCD panel, special mode ST7036 */
         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, KS0073 */
+        LCD12x4D   = (LCD_T_D | LCD_T_C12 | LCD_T_R4),    /**< 12x4 LCD panel, special mode PCF21XX, KS0073 */
         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) */
@@ -191,10 +215,10 @@
         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 */
 //        LCD20x3    = (LCD_T_A | LCD_T_C20 | LCD_T_R3),    /**< 20x3 LCD panel */
-//        LCD20x3D   = (LCD_T_D | LCD_T_C20 | LCD_T_R3),    /**< 20x3 LCD panel, special mode SSD1803 */
-//        LCD20x3D1  = (LCD_T_D1 | LCD_T_C20 | LCD_T_R3),   /**< 20x3 LCD panel, special mode SSD1803 */
+//        LCD20x3D   = (LCD_T_D | LCD_T_C20 | LCD_T_R3),    /**< 20x3 LCD panel, special mode SSD1803, KS0073 */
+//        LCD20x3D1  = (LCD_T_D1 | LCD_T_C20 | LCD_T_R3),   /**< 20x3 LCD panel, special mode SSD1803, KS0073 */
         LCD20x4    = (LCD_T_A | LCD_T_C20 | LCD_T_R4),    /**< 20x4 LCD panel */
-        LCD20x4D   = (LCD_T_D | LCD_T_C20 | LCD_T_R4),    /**< 20x4 LCD panel, special mode SSD1803 */
+        LCD20x4D   = (LCD_T_D | LCD_T_C20 | LCD_T_R4),    /**< 20x4 LCD panel, special mode SSD1803, KS0073 */
 //        LCD20x6    = (LCD_T_E | LCD_T_C20 | LCD_T_R6),    /**< 20x6 LCD panel, Two controller version */        
         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 */
@@ -203,12 +227,15 @@
         LCD24x4D   = (LCD_T_D | LCD_T_C24 | LCD_T_R4),    /**< 24x4 LCD panel, special mode KS0078 */
 //        LCD32x1    = (LCD_T_A | LCD_T_C32 | LCD_T_R1),    /**< 32x1 LCD panel */
 //        LCD32x1C   = (LCD_T_C | LCD_T_C32 | LCD_T_R1),    /**< 32x1 LCD panel (actually 16x2) */
-//        LCD32x2    = (LCD_T_A | LCD_T_C32 | LCD_T_R2),    /**< 32x2 LCD panel */
-//        LCD32x4    = (LCD_T_A | LCD_T_C32 | LCD_T_R4),    /**< 32x4 LCD panel */
+        LCD32x2    = (LCD_T_A | LCD_T_C32 | LCD_T_R2),    /**< 32x2 LCD panel */
+//        LCD32x4    = (LCD_T_A | LCD_T_C32 | LCD_T_R4),    /**< 32x4 LCD panel, Two controller version ? */
 //        LCD40x1    = (LCD_T_A | LCD_T_C40 | LCD_T_R1),    /**< 40x1 LCD panel */
 //        LCD40x1C   = (LCD_T_C | LCD_T_C40 | LCD_T_R1),    /**< 40x1 LCD panel (actually 20x2) */
         LCD40x2    = (LCD_T_A | LCD_T_C40 | LCD_T_R2),    /**< 40x2 LCD panel */
+//        LCD52x1    = (LCD_T_A | LCD_T_C52 | LCD_T_R1),    /**< 52x1 LCD panel, special mode KS0073 */        
+#if (LCD_TWO_CTRL == 1)
         LCD40x4    = (LCD_T_E | LCD_T_C40 | LCD_T_R4)     /**< 40x4 LCD panel, Two controller version */
+#endif     
     };
 
 
@@ -222,19 +249,20 @@
         PCF2103_3V3     =  5 | (LCD_C_PAR | LCD_C_I2C),                                                       /**<  PCF2103 3V3 no Booster, 4/8 bit, I2C         */                                   
         PCF2113_3V3     =  6 | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST | LCD_C_CTR),                           /**<  PCF2113 3V3 with Booster, 4/8 bit, I2C       */                           
         PCF2116_3V3     =  7 | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST),                                       /**<  PCF2116 3V3 with Booster, 4/8 bit, I2C       */                           
-//        PCF2116C_3V3    =    | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST | LCD_C_FT1),                           /**<  PCF2116C 3V3 with Booster, 4/8 bit, I2C       */
-//        PCF2116K_3V3    =    | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST | LCD_C_FT2),                           /**<  PCF2116K 3V3 with Booster, 4/8 bit, I2C       */
+//        PCF2116C_3V3    =    | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST | LCD_C_FC),                            /**<  PCF2116C 3V3 with Booster, 4/8 bit, I2C       */
+//        PCF2116K_3V3    =    | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST | LCD_C_FK),                            /**<  PCF2116K 3V3 with Booster, 4/8 bit, I2C       */
         PCF2116_5V      =  8 | (LCD_C_PAR | LCD_C_I2C),                                                       /**<  PCF2116 5V no Booster, 4/8 bit, I2C          */
-        PCF2116C_5V     =  9 | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST | LCD_C_FT1),                           /**<  PCF2116C 3V3 with Booster, 4/8 bit, I2C       */
+        PCF2116C_5V     =  9 | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST | LCD_C_FC),                            /**<  PCF2116C 3V3 with Booster, 4/8 bit, I2C       */
         PCF2119_3V3     = 10 | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST | LCD_C_CTR),                           /**<  PCF2119 3V3 with Booster, 4/8 bit, I2C       */
-//        PCF2119C_3V3    = 11 | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST | LCD_C_CTR | LCD_C_FT1),                /**<  PCF2119K 3V3 with Booster, 4/8 bit, I2C       */
-        PCF2119R_3V3    = 12 | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST | LCD_C_CTR | LCD_C_FT2),                /**<  PCF2119R 3V3 with Booster, 4/8 bit, I2C       */
+//        PCF2119C_3V3    = 11 | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST | LCD_C_CTR | LCD_C_FC),                /**<  PCF2119K 3V3 with Booster, 4/8 bit, I2C       */
+        PCF2119R_3V3    = 12 | (LCD_C_PAR | LCD_C_I2C     | LCD_C_BST | LCD_C_CTR | LCD_C_FR),                /**<  PCF2119R 3V3 with Booster, 4/8 bit, I2C       */
 //        PCF2119_5V      =    | (LCD_C_PAR | LCD_C_I2C),                                                       /**<  PCF2119 5V no Booster, 4/8 bit, I2C          */
-        PT6314          = 13 | (LCD_C_PAR | LCD_C_SPI3_16 | LCD_C_CTR),                                       /**<  PT6314  VFD, 4/8 bit, SPI3                   */
+        PT6314          = 13 | (LCD_C_PAR | LCD_C_SPI3_16 | LCD_C_CTR),                                       /**<  PT6314  VFD Controller, 4/8 bit, SPI3        */
+//        PT6880          = xx | (LCD_C_PAR | LCD_C_SPI3_16 | LCD_C_CTR),                                       /**<  PT6880  OLED controller, 4/8 bit, SPI3       */        
         SSD1803_3V3     = 14 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_I2C | LCD_C_BST | LCD_C_CTR | LCD_C_PDN),   /**<  SSD1803 3V3 with Booster, 4/8 bit, I2C, SPI3 */
 //        SSD1803_5V      = 15 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_I2C | LCD_C_BST | LCD_C_CTR | LCD_C_PDN),   /**<  SSD1803 3V3 with Booster, 4/8 bit, I2C, SPI3 */
-        ST7032_3V3      = 16 | (LCD_C_PAR | LCD_C_SPI4    | LCD_C_I2C | LCD_C_BST | LCD_C_CTR),               /**<  ST7032  3V3 with Booster, 4/8 bit, SPI4, I2C */   
-        ST7032_5V       = 17 | (LCD_C_PAR | LCD_C_SPI4    | LCD_C_I2C | LCD_C_CTR),                           /**<  ST7032  5V no Booster, 4/8 bit, SPI4, I2C    */           
+        ST7032_3V3      = 16 | (LCD_C_PAR | LCD_C_SPI4    | LCD_C_I2C | LCD_C_BST | LCD_C_CTR),               /**<  ST7032/SPLC792A 3V3 with Booster, 4/8 bit, SPI4, I2C */   
+        ST7032_5V       = 17 | (LCD_C_PAR | LCD_C_SPI4    | LCD_C_I2C | LCD_C_CTR),                           /**<  ST7032/SPLC792A 5V no Booster, 4/8 bit, SPI4, I2C    */           
         ST7036_3V3      = 18 | (LCD_C_PAR | LCD_C_SPI4    | LCD_C_I2C | LCD_C_BST | LCD_C_CTR),               /**<  ST7036  3V3 with Booster, 4/8 bit, SPI4, I2C */   
         ST7036_5V       = 19 | (LCD_C_PAR | LCD_C_SPI4    | LCD_C_I2C | LCD_C_BST | LCD_C_CTR),               /**<  ST7036  5V no Booster, 4/8 bit, SPI4, I2C    */   
         ST7066_ACM      = 20 | (LCD_C_PAR | LCD_C_I2C),                                                       /**<  ST7066 4/8 bit, I2C on ACM1602 using a PIC   */        
@@ -242,16 +270,17 @@
         US2066_3V3      = 22 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_I2C | LCD_C_CTR | LCD_C_PDN),               /**<  US2066/SSD1311 3V3, 4/8 bit, I2C, SPI3 */
         WS0010          = 23 | (LCD_C_PAR | LCD_C_SPI3_10 | LCD_C_PDN),                                       /**<  WS0010/RS0010 OLED Controller, 4/8 bit, SPI3 */    
 //        WS0012          = 24 | (LCD_C_PAR | LCD_C_SPI3_10 | LCD_C_I2C | LCD_C_PDN),                           /**<  WS0012 4/8 bit, SPI, I2C                     */
-        HD66712         = 25 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_BST | LCD_C_PDN)                            /**<  HD66712 Controller, 4/8 bit, SPI3 */    
+        HD66712         = 25 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_BST | LCD_C_PDN),                           /**<  HD66712 Controller, 4/8 bit, SPI3 */    
+        SPLC792A_3V3    = 26 | (LCD_C_PAR | LCD_C_SPI3_9  | LCD_C_SPI4 | LCD_C_I2C | LCD_C_BST | LCD_C_CTR)   /**<  ST7032/SPLC792A 3V3 with Booster, 4/8 bit, SPI3, SPI4, I2C */
     };
 
 
     /** LCD Cursor control */
     enum LCDCursor {
         CurOff_BlkOff = 0x00,  /**<  Cursor Off, Blinking Char Off */    
-        CurOn_BlkOff  = 0x02,  /**<  Cursor On, Blinking Char Off */    
-        CurOff_BlkOn  = 0x01,  /**<  Cursor Off, Blinking Char On */    
-        CurOn_BlkOn   = 0x03   /**<  Cursor On, Blinking Char On */    
+        CurOff_BlkOn  = 0x01,  /**<  Cursor Off, Blinking Char On  */         
+        CurOn_BlkOff  = 0x02,  /**<  Cursor On, Blinking Char Off  */   
+        CurOn_BlkOn   = 0x03   /**<  Cursor On, Blinking Char On   */
     };
 
     /** LCD Display control */
@@ -278,6 +307,7 @@
         Bottom           /**<  Upside down view */            
     };
 
+#if (LCD_BIGFONT == 1) 
    /** LCD BigFont control, supported for some Controllers */
     enum LCDBigFont {
         None,            /**<  no lines              */    
@@ -286,15 +316,53 @@
         BottomLine,      /**<  2+3 line or 3+4 line  */
         TopBottomLine    /**<  1+2 line and 3+4 line */
     };
+#endif
 
+#if (LCD_FONTSEL == 1) 
+   /** LCD setFont control.
+       Note: most controllers support only one font and the hardware specific
+       fonttable is encoded as part of the controller type number (eg PCF21XXC or PCF21XXR).
+       Some controllers support multiple tables that can only be selected by logic levels on a few pins.
+       Some controllers also support runtime fontable switching through a specific instruction */
+    enum LCDFont {
+                               /**< HD44780 fonttable      */
+        Font_0  = LCD_C_F0,    /**< default, UK/JAP        */
+                               /**< PCF21XX fonttables     */
+        Font_C  = LCD_C_FC,    /**< PCF21XXC               */
+        Font_R  = LCD_C_FR,    /**< PCF21XXR               */
+                               /**< SSD1803 ROM tables     */
+        Font_RA = LCD_C_FRA,   /**< UK/EU                  */
+        Font_RB = LCD_C_FRB,   /**< UK/Cyrillic            */
+        Font_RC = LCD_C_FRC,   /**< default, UK/JAP        */
+        Font_D  = LCD_C_FD,    /**< SPLC780D Cyrillic      */
+        Font_T  = LCD_C_FT     /**< ST7066-0T Cyrillic     */
+    };
+#endif
 
+#if ((LCD_C_FONT == 1) || (LCD_R_FONT == 1)) //PCF21xxC or PCF21xxR font
    /** Convert ASCII character code to the LCD fonttable code
      *
      * @param c The character to write to the display
      * @return The character code for the specific fonttable of the controller
      */
    int ASCII_2_LCD (int c);
+#endif
 
+#if(LCD_UTF8_FONT == 1)       
+    /** Convert UTF8 2-byte character code to the LCD fonttable code
+      * @param c The character to write to the display
+      * @return character code for the specific fonttable of the controller or -1 if UTF8 code is not yet complete or incorrect
+      *
+      * Orig by Andriy, Modified by WH
+      * 
+      * Note: The UTF8 decoding table for a specific controller is defined and selected in file TextLCD_UTF8.inc
+      * The table is accessed in this UTF_2_LCD() method through
+      *   #define UTF_FIRST, UTF_LAST, UTF_SEQ_REC_FIRST, UTF_SEQ_REC_LAST and 
+      *   #define UTF_SEQ_RECODE and UTF_RND_RECODE
+      */      
+      int UTF_2_LCD (int c);       
+#endif
+ 
 
 #if(LCD_PRINTF != 1)
    /** Write a character to the LCD
@@ -399,6 +467,7 @@
     void setUDCBlink(LCDBlink blinkMode);
 #endif
 
+#if(LCD_CONTRAST == 1)
     /** Set Contrast
      * setContrast method is supported by some compatible devices (eg ST7032i) that have onboard LCD voltage generation
      * Code imported from fork by JH1PJL
@@ -407,6 +476,7 @@
      * @return none
      */
     void setContrast(unsigned char c = LCD_DEF_CONTRAST);
+#endif
 
 #if(LCD_POWER == 1)
     /** Set Power
@@ -435,10 +505,22 @@
      * @param lines  The selected Big Font lines (None, TopLine, CenterLine, BottomLine, TopBottomLine)
      *                                            Double height characters can be shown on lines 1+2, 2+3, 3+4 or 1+2 and 3+4
      *                                            Valid double height lines depend on the LCDs number of rows.
+     * @return none     
      */
     void setBigFont(LCDBigFont lines);
 #endif
 
+#if(LCD_FONTSEL == 1)
+    /** Set Font
+     * setFont method is supported by some compatible devices (eg SSD1803, US2066, ST7070) 
+     *
+     * @param LCDFont font  The selected Font 
+     * @return none     
+     */
+    void setFont(LCDFont font = Font_0);
+#endif
+
+
 #if(LCD_ICON==1)
     /** Set Icons
     *