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:
39:e9c2319de9c5
Parent:
38:cbe275b0b647
Child:
40:d3496c3ea301
--- a/TextLCD_Config.h	Sat Apr 18 11:33:02 2015 +0000
+++ b/TextLCD_Config.h	Tue May 19 18:13:00 2015 +0000
@@ -7,6 +7,7 @@
  *               2015, v05: WH, Clean up low-level _writeCommand() and _writeData(), Added support for alt fonttables (eg PCF21XX), Added ST7066_ACM for ACM1602 module, fixed contrast for ST7032 
  *               2015, v06: WH, Performance improvement I2C portexpander
  *               2015, v07: WH, Fixed Adafruit I2C/SPI portexpander pinmappings, fixed SYDZ Backlight
+ *               2015, v08: WH, Added defines to reduce memory footprint (eg LCD_ICON), added some I2C portexpander defines 
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -41,23 +42,33 @@
 #define LCD_SPI_N_3_24 1           /* Native SPI bus     */
 
 //Select options to reduce memory footprint (multiple options allowed)
-#define LCD_UDC        1           /* Enable predefined UDC example*/                
-#define LCD_PRINTF     1           /* Enable Stream implementation */                
+#define LCD_UDC        1           /* Enable predefined UDC example*/
+#define LCD_PRINTF     1           /* Enable Stream implementation */
+#define LCD_ICON       1           /* Enable Icon implementation -2.0K codesize*/
+#define LCD_ORIENT     1           /* Enable Orientation switch implementation -0.9K codesize*/
+#define LCD_BIGFONT    0           /* Enable Big Font implementation -0.6K codesize */
+#define LCD_INVERT     0           /* Enable display Invert implementation -0.5K codesize*/
+#define LCD_POWER      0           /* Enable Power control implementation -0.1K codesize*/
+#define LCD_BLINK      1           /* Enable UDC and Icon Blink control implementation -0.8K codesize*/
 
-//Select option to activate default fonttable or alternatively use conversion for specific controller versions (eg PCF2119C)
-#define LCD_DEFAULT_FONT 1      
+//Select option to activate default fonttable or alternatively use conversion for specific controller versions (eg PCF2119C, PCF2119R)
+#define LCD_DEFAULT_FONT 0
 
 //Pin Defines for I2C PCF8574/PCF8574A or MCP23008 and SPI 74595 bus expander interfaces
 //Different commercially available LCD portexpanders use different wiring conventions.
 //LCD and serial portexpanders should be wired according to the tables below.
 //
 //Select Serial Port Expander Hardware module (one option only)
-#define DEFAULT        1
+#define DEFAULT        0
 #define ADAFRUIT       0
 #define DFROBOT        0
+#define LCM1602        0
 #define YWROBOT        0
 #define GYLCD          0
-#define SYDZ           0
+#define MJKDZ          0
+#define SYDZ           1
+#define WIDEHK         0
+#define LCDPLUG        0
 
 #if (DEFAULT==1)
 //Definitions for default (WH) mapping between serial port expander pins and LCD controller
@@ -194,15 +205,15 @@
 #define BACKLIGHT_INV  0
 #endif
 
-#if (YWROBOT==1)
+#if ((YWROBOT==1) || (LCM1602==1))
 //Definitions for YWROBOT LCM1602 V1 Module mapping between serial port expander pins and LCD controller. 
-//Very similar to DFROBOT. This hardware uses PCF8574.
+//Very similar to DFROBOT. Also marked as 'Funduino'. This hardware uses PCF8574.
 //Slaveaddress may be set by solderbridges (default 0x4E). SDA/SCL has no pullup Resistors onboard.
 //See http://arduino-info.wikispaces.com/LCD-Blue-I2C
 //
 //Note: LCD RW pin must be kept LOW
 //      E2 is not available on default hardware and so it does not support LCD40x4 (second controller)
-//      BL is used to control backlight, reverse logic: Low turns on Backlight. This is handled in setBacklight()
+//      BL is used to control backlight.
 
 //I2C bus expander PCF8574 interface
 #define LCD_BUS_I2C_RS (1 << 0)
@@ -236,8 +247,8 @@
 #define BACKLIGHT_INV  0
 #endif
 
-#if (GYLCD==1)
-//Definitions for Arduino-IIC-LCD GY-LCD-V1 Module mapping between serial port expander pins and LCD controller. 
+#if ((GYLCD==1) || (MJKDZ==1))
+//Definitions for Arduino-IIC-LCD GY-LCD-V1, for GY-IICLCD and for MJKDZ Module mapping between serial port expander pins and LCD controller. 
 //Very similar to DFROBOT. This hardware uses PCF8574.
 //Slaveaddress may be set by solderbridges (default 0x4E). SDA/SCL has pullup Resistors onboard.
 //See http://arduino-info.wikispaces.com/LCD-Blue-I2C
@@ -320,6 +331,93 @@
 #define BACKLIGHT_INV  0
 #endif
 
+#if (WIDEHK==1)
+//Definitions for WIDE.HK I2C backpack mapping between serial port expander pins and LCD controller
+//This hardware uses an MCP23008 I2C expander.
+//Slaveaddress is hardcoded at 0x4E. SDA/SCL has pullup Resistors onboard (3k3).
+//See http://www.wide.hk
+//
+//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
+//
+
+//I2C bus expander (MCP23008) interface
+#define LCD_BUS_I2C_D4 (1 << 0)
+#define LCD_BUS_I2C_D5 (1 << 1)
+#define LCD_BUS_I2C_D6 (1 << 2)
+#define LCD_BUS_I2C_D7 (1 << 3)
+#define LCD_BUS_I2C_RS (1 << 4)
+#define LCD_BUS_I2C_RW (1 << 5)
+#define LCD_BUS_I2C_BL (1 << 6)
+#define LCD_BUS_I2C_E  (1 << 7)
+
+#define LCD_BUS_I2C_E2 (1 << 5)
+
+//SPI bus expander (74595) interface, same as I2C
+#define LCD_BUS_SPI_D4 LCD_BUS_I2C_D4
+#define LCD_BUS_SPI_D5 LCD_BUS_I2C_D5
+#define LCD_BUS_SPI_D6 LCD_BUS_I2C_D6
+#define LCD_BUS_SPI_D7 LCD_BUS_I2C_D7
+#define LCD_BUS_SPI_RS LCD_BUS_I2C_RS
+#define LCD_BUS_SPI_RW LCD_BUS_I2C_RW
+#define LCD_BUS_SPI_BL LCD_BUS_I2C_BL
+#define LCD_BUS_SPI_E  LCD_BUS_I2C_E
+
+#define LCD_BUS_SPI_E2 LCD_BUS_I2C_E2
+
+//Force I2C portexpander type
+#define PCF8574        0
+#define MCP23008       1
+
+//Inverted Backlight control
+#define BACKLIGHT_INV  0
+#endif
+
+#if (LCDPLUG==1)
+//Definitions for Jeelabs LCD_Plug I2C backpack mapping between serial port expander pins and LCD controller
+//This hardware uses an MCP23008 I2C expander.
+//Slaveaddress is hardcoded at 0x48. SDA/SCL has no pullup Resistors onboard.
+//See http://jeelabs.net/projects/hardware/wiki/lcd_plug
+//
+//Note: LCD RW pin must be kept LOW
+//      E2 is available on a plug and so it does support LCD40x4 (second controller)
+//      BL is used to control backlight
+//
+
+//I2C bus expander (MCP23008) interface
+#define LCD_BUS_I2C_D4 (1 << 0)
+#define LCD_BUS_I2C_D5 (1 << 1)
+#define LCD_BUS_I2C_D6 (1 << 2)
+#define LCD_BUS_I2C_D7 (1 << 3)
+#define LCD_BUS_I2C_RS (1 << 4)
+#define LCD_BUS_I2C_E2 (1 << 5)
+#define LCD_BUS_I2C_E  (1 << 6)
+#define LCD_BUS_I2C_BL (1 << 7)
+
+#define LCD_BUS_I2C_RW (1 << 5)
+
+//SPI bus expander (74595) interface, same as I2C
+#define LCD_BUS_SPI_D4 LCD_BUS_I2C_D4
+#define LCD_BUS_SPI_D5 LCD_BUS_I2C_D5
+#define LCD_BUS_SPI_D6 LCD_BUS_I2C_D6
+#define LCD_BUS_SPI_D7 LCD_BUS_I2C_D7
+#define LCD_BUS_SPI_RS LCD_BUS_I2C_RS
+#define LCD_BUS_SPI_E2 LCD_BUS_I2C_E2
+#define LCD_BUS_SPI_E  LCD_BUS_I2C_E
+#define LCD_BUS_SPI_BL LCD_BUS_I2C_BL
+
+#define LCD_BUS_SPI_RW LCD_BUS_I2C_RW
+
+//Force I2C portexpander type
+#define PCF8574        0
+#define MCP23008       1
+
+//Inverted Backlight control
+#define BACKLIGHT_INV  0
+#endif
+
+
 //Bitpattern Defines for I2C PCF8574/PCF8574A, MCP23008 and SPI 74595 Bus expanders
 //Don't change!
 #define LCD_BUS_I2C_MSK (LCD_BUS_I2C_D4 | LCD_BUS_I2C_D5 | LCD_BUS_I2C_D6 | LCD_BUS_I2C_D7)