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
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
Diff: TextLCD.h
- Revision:
- 36:9f5f86dfd44a
- Parent:
- 35:311be6444a39
- Child:
- 37:ce348c002929
diff -r 311be6444a39 -r 9f5f86dfd44a TextLCD.h --- a/TextLCD.h Fri Oct 10 15:47:56 2014 +0000 +++ b/TextLCD.h Tue Nov 25 19:21:18 2014 +0000 @@ -16,6 +16,7 @@ * 2014, v14: WH, Added support for PT6314 (VFD), added setOrient() method for supported devices (eg SSD1803, US2066), added Double Height lines for supported devices, * added 16 UDCs for supported devices (eg PCF2103), moved UDC defines to TextLCD_UDC file, added TextLCD_Config.h for feature and footprint settings. * 2014, v15: WH, Added AC780 support, added I2C expander modules, fixed setBacklight() for inverted logic modules. Fixed bug in LCD_SPI_N define + * 2014, v16: WH, Added ST7070 and KS0073 support, added setIcon(), clrIcon() and setInvert() method for supported devices * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -116,12 +117,13 @@ // Interface encoded in b31..b24 #define LCD_C_BUS_MSK 0xFF000000 #define LCD_C_PAR 0x01000000 /*Parallel 4 or 8 bit data, E pin, RS pin, RW=GND */ -#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_SPI3_16 0x08000000 /*SPI 3 line (MOSI, SCL, CS pins), 16 bits (RS, RW + 8 Data) */ -#define LCD_C_SPI3_24 0x10000000 /*SPI 3 line (MOSI, SCL, CS pins), 24 bits (RS, RW + 8 Data) */ -#define LCD_C_SPI4 0x20000000 /*SPI 4 line (MOSI, SCL, CS, RS pin), RS pin + 8 Data */ -#define LCD_C_I2C 0x40000000 /*I2C (SDA, SCL pin), 8 control bits (Co, RS, RW) + 8 Data */ +#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) */ +#define LCD_C_SPI3_10 0x08000000 /*SPI 3 line (MOSI, SCL, CS pins), 10 bits (RS, RW + 8 Data) */ +#define LCD_C_SPI3_16 0x10000000 /*SPI 3 line (MOSI, SCL, CS pins), 16 bits (RS, RW + 8 Data) */ +#define LCD_C_SPI3_24 0x20000000 /*SPI 3 line (MOSI, SCL, CS pins), 24 bits (RS, RW + 8 Data) */ +#define LCD_C_SPI4 0x40000000 /*SPI 4 line (MOSI, SCL, CS, RS pin), RS pin + 8 Data */ +#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_BST 0x00010000 /*Booster */ @@ -157,11 +159,11 @@ 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 */ + LCD12x3D = (LCD_T_D | LCD_T_C12 | LCD_T_R3), /**< 12x3 LCD panel, special mode PCF21XX, KS0073 */ + 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 */ + LCD12x4D = (LCD_T_B | 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) */ @@ -203,7 +205,7 @@ ST7036_5V = 3 | (LCD_C_PAR | LCD_C_SPI4 | LCD_C_I2C | LCD_C_BST | LCD_C_CTR), /**< ST7036 5V no Booster, 4/8 bit, SPI4, I2C */ ST7032_3V3 = 4 | (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 = 5 | (LCD_C_PAR | LCD_C_SPI4 | LCD_C_I2C | LCD_C_CTR), /**< ST7032 5V no Booster, 4/8 bit, SPI4, I2C */ - KS0078 = 6 | (LCD_C_PAR | LCD_C_SPI3_24), /**< KS0078 24x4 support, 4/8 bit, SPI3 */ + KS0078 = 6 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_PDN), /**< KS0078 24x4 support, 4/8 bit, SPI3 */ PCF2103_3V3 = 7 | (LCD_C_PAR | LCD_C_I2C), /**< PCF2103 3V3 no Booster, 4/8 bit, I2C */ PCF2113_3V3 = 8 | (LCD_C_PAR | LCD_C_I2C | LCD_C_BST | LCD_C_CTR), /**< PCF2113 3V3 with Booster, 4/8 bit, I2C */ PCF2116_3V3 = 9 | (LCD_C_PAR | LCD_C_I2C | LCD_C_BST), /**< PCF2116 3V3 with Booster, 4/8 bit, I2C */ @@ -215,8 +217,10 @@ // 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 */ US2066_3V3 = 16 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_I2C | LCD_C_CTR | LCD_C_PDN), /**< US2066/SSD1311 3V3, 4/8 bit, I2C, SPI3 */ PT6314 = 17 | (LCD_C_PAR | LCD_C_SPI3_16 | LCD_C_CTR), /**< PT6314 VFD, 4/8 bit, SPI3 */ - AC780 = 18 | (LCD_C_PAR | LCD_C_SPI4 | LCD_C_I2C | LCD_C_PDN) /**< AC780/KS0066i 4/8 bit, SPI, I2C */ -// WS0012 = 19 | (LCD_C_PAR | LCD_C_SPI3_10 | LCD_C_I2C | LCD_C_PDN) /**< WS0012 4/8 bit, SPI, I2C */ + AC780 = 18 | (LCD_C_PAR | LCD_C_SPI4 | LCD_C_I2C | LCD_C_PDN), /**< AC780/KS0066i 4/8 bit, SPI, I2C */ +// WS0012 = 19 | (LCD_C_PAR | LCD_C_SPI3_10 | LCD_C_I2C | LCD_C_PDN), /**< WS0012 4/8 bit, SPI, I2C */ + ST7070 = 20 | (LCD_C_PAR | LCD_C_SPI3_8 | LCD_C_SPI4), /**< ST7070 4/8 bit, SPI3 */ + KS0073 = 21 | (LCD_C_PAR | LCD_C_SPI3_24 | LCD_C_PDN) /**< KS0073 4/8 bit, SPI3 */ }; @@ -304,7 +308,7 @@ * * @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 + * @return The memoryaddress of screen column and row location */ int getAddress(int column, int row); @@ -321,13 +325,13 @@ /** Return the number of rows * - * @param return The number of rows + * @return The number of rows */ int rows(); /** Return the number of columns * - * @param return The number of columns + * @return The number of columns */ int columns(); @@ -356,7 +360,7 @@ */ void setUDC(unsigned char c, char *udc_data); - /** Set UDC Blink + /** Set UDC Blink and Icon blink * setUDCBlink method is supported by some compatible devices (eg SSD1803) * * @param blinkMode The Blink mode (BlinkOff, BlinkOn) @@ -397,11 +401,32 @@ */ void setBigFont(LCDBigFont lines); -//test -// void _initCtrl(); -// int _column; -// int _row; - + /** Set Icons + * + * @param unsigned char idx The Index of the icon pattern (0..15) for KS0073 and similar controllers + * and Index (0..31) for PCF2103 and similar controllers + * @param unsigned char data The bitpattern for the icons (6 lsb for KS0073 bitpattern (5 lsb for KS0078) and 2 msb for blinkmode) + * The bitpattern for the PCF2103 icons is 5 lsb (UDC 0..2) and 5 lsb for blinkmode (UDC 4..6) + */ + void setIcon(unsigned char idx, unsigned char data); + + /** Clear Icons + * + * @param none + * @return none + */ + //@TODO Add support for 40x4 dual controller + void clrIcon(); + + /** Set Invert + * setInvert method is supported by some compatible devices (eg KS0073) to swap between black and white + * + * @param bool invertOn Invert on/off + * @return none + */ + //@TODO Add support for 40x4 dual controller + void setInvert(bool invertOn); + protected: /** LCD controller select, mainly used for LCD40x4 @@ -411,6 +436,12 @@ _LCDCtrl_1, /*< Secondary */ }; + /** LCD Datalength control to select between 4 or 8 bit data/commands, used for native Serial interface */ + enum _LCDDatalength { + _LCD_DL_4 = 0x00, /**< Datalength 4 bit */ + _LCD_DL_8 = 0x10 /**< Datalength 8 bit */ + }; + /** Create a TextLCD_Base interface * @brief Base class, can not be instantiated * @@ -423,13 +454,21 @@ virtual int _putc(int value); virtual int _getc(); -/** Low level method for LCD controller +/** Medium level initialisation method for LCD controller + * @param _LCDDatalength dl sets the datalength of data/commands + * @return none */ - void _init(); + void _init(_LCDDatalength dl = _LCD_DL_4); /** Low level initialisation method for LCD controller + * Set number of lines, fonttype, no cursor etc + * The controller is accessed in 4-bit parallel mode either directly via mbed pins or through I2C or SPI expander. + * Some controllers also support native I2C or SPI interfaces. + * + * @param _LCDDatalength dl sets the 4 or 8 bit datalength of data/commands. Required for some native serial modes. + * @return none */ - void _initCtrl(); + void _initCtrl(_LCDDatalength dl = _LCD_DL_4); /** Low level character address set method */ @@ -509,13 +548,12 @@ int _row; LCDCursor _currentCursor; -// Function mode saved to allow switch between Instruction sets after initialisation time +// Function modes saved to allow switch between Instruction sets after initialisation time + int _function, _function_1, _function_x; + // Icon, Booster mode and contrast saved to allow contrast change at later time // Only available for controllers with added features - int _function, _function_1, _function_x; - int _icon_power; - int _contrast; - + int _icon_power, _contrast; }; //--------- End TextLCD_Base ----------- @@ -760,6 +798,67 @@ //---------- End TextLCD_SPI_N ------------ +//-------- Start TextLCD_SPI_N_3_8 -------- +#if(LCD_SPI_N_3_8 == 1) /* Native SPI bus */ + +class TextLCD_SPI_N_3_8 : public TextLCD_Base { +public: + /** Create a TextLCD interface using a controller with a native SPI3 8 bits interface + * This mode is supported by ST7070. Note that implementation in TexTLCD is not very efficient due to + * structure of the TextLCD library: each databyte is written separately and requires a separate 'count command' set to 1 byte. + * + * @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 = ST7070) + */ + TextLCD_SPI_N_3_8(SPI *spi, PinName cs, LCDType type = LCD16x2, PinName bl = NC, LCDCtrl ctrl = ST7070); + + virtual ~TextLCD_SPI_N_3_8(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; +}; + +#endif /* Native SPI bus */ +//------- End TextLCD_SPI_N_3_8 ----------- + + + //------- Start TextLCD_SPI_N_3_9 --------- #if(LCD_SPI_N_3_9 == 1) /* Native SPI bus */ //Code checked out on logic analyser. Not yet tested on hardware.. @@ -811,7 +910,6 @@ // SPI bus SPI *_spi; DigitalOut _cs; - // controlbyte to select between data and command. Internal value for serial bus only char _controlbyte; @@ -873,8 +971,7 @@ // SPI bus SPI *_spi; DigitalOut _cs; - - + // controlbyte to select between data and command. Internal value for serial bus only char _controlbyte;