A TextLCD interface for driving 4-bit HD44780-based LCDs.
Fork of TextLCD by
Revision 42:14e1718fba52, committed 2017-01-06
- Comitter:
- vm2m
- Date:
- Fri Jan 06 14:51:48 2017 +0000
- Parent:
- 41:111ca62e8a59
- Child:
- 43:db59a996a57a
- Commit message:
- Add support for PCA9538 expander
Changed in this revision
TextLCD.cpp | Show annotated file Show diff for this revision Revisions of this file |
TextLCD_Config.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/TextLCD.cpp Fri Nov 06 18:59:27 2015 +0000 +++ b/TextLCD.cpp Fri Jan 06 14:51:48 2017 +0000 @@ -3201,23 +3201,27 @@ //--------- Start TextLCD_I2C ----------- -#if(LCD_I2C == 1) /* I2C Expander PCF8574/MCP23008 */ -/** Create a TextLCD interface using an I2C PC8574 (or PCF8574A) or MCP23008 portexpander +#if(LCD_I2C == 1) /* I2C Expander PCF8574/MCP23008/PCA9538 */ +/** Create a TextLCD interface using an I2C PC8574 (or PCF8574A) or MCP23008 or PCA9538 portexpander * * @param i2c I2C Bus - * @param deviceAddress I2C slave address (PCF8574, PCF8574A or MCP23008, default = 0x40) + * @param deviceAddress I2C slave address (PCF8574, PCF8574A or MCP23008 or PCA9538, default = 0x40) * @param type Sets the panel size/addressing mode (default = LCD16x2) * @param ctrl LCD controller (default = HD44780) */ TextLCD_I2C::TextLCD_I2C(I2C *i2c, char deviceAddress, LCDType type, LCDCtrl ctrl) : TextLCD_Base(type, ctrl), _i2c(i2c){ - + +#if (PCA9538==1) + _slaveAddress = deviceAddress & 0xFE; +#else _slaveAddress = deviceAddress & 0xFE; // Setup the I2C bus // The max bitrate for PCF8574 is 100kbit, the max bitrate for MCP23008 is 400kbit, _i2c->frequency(100000); +#endif #if (MCP23008==1) // MCP23008 portexpander Init @@ -3242,6 +3246,15 @@ // write the new data to the portexpander _writeRegister(GPIO, _lcd_bus); +#elif (PCA9538==1) + // PCA9538 portexpander Init + _writeRegister(PCA_CONFIG, 0x00); // Set all pin as output + + // Init the portexpander bus + _lcd_bus = LCD_BUS_I2C_DEF; + + // write the new data to the portexpander + _writeRegister(PCA_OUTPUT, _lcd_bus); #else // PCF8574 of PCF8574A portexpander @@ -3299,7 +3312,12 @@ // MCP23008 portexpander // write the new data to the portexpander - _writeRegister(GPIO, _lcd_bus); + _writeRegister(GPIO, _lcd_bus); +#elif (PCA9538==1) + // PCA9538 portexpander + + // write the new data to the I2C portexpander + _writeRegister(PCA_OUTPUT, _lcd_bus); #else // PCF8574 of PCF8574A portexpander @@ -3324,7 +3342,12 @@ // MCP23008 portexpander // write the new data to the portexpander - _writeRegister(GPIO, _lcd_bus); + _writeRegister(GPIO, _lcd_bus); +#elif (PCA9538==1) + // PCA9538 portexpander + + // write the new data to the I2C portexpander + _writeRegister(PCA_OUTPUT, _lcd_bus); #else // PCF8574 of PCF8574A portexpander @@ -3348,7 +3371,12 @@ // MCP23008 portexpander // write the new data to the portexpander - _writeRegister(GPIO, _lcd_bus); + _writeRegister(GPIO, _lcd_bus); +#elif (PCA9538==1) + // PCA9538 portexpander + + // write the new data to the I2C portexpander + _writeRegister(PCA_OUTPUT, _lcd_bus); #else // PCF8574 of PCF8574A portexpander @@ -3429,7 +3457,12 @@ // MCP23008 portexpander // write the new data to the portexpander - _writeRegister(GPIO, _lcd_bus); + _writeRegister(GPIO, _lcd_bus); +#elif (PCA9538==1) + // PCA9538 portexpander + + // write the new data to the I2C portexpander + _writeRegister(PCA_OUTPUT, _lcd_bus); #else // PCF8574 of PCF8574A portexpander @@ -3438,7 +3471,7 @@ #endif } -// Write data to MCP23008 I2C portexpander +// Write data to MCP23008/PCA9538 I2C portexpander // Used for mbed I2C bus expander void TextLCD_I2C::_writeRegister (int reg, int value) { char data[] = {reg, value}; @@ -3475,7 +3508,29 @@ data[4] = _lcd_bus; // write the packed data to the I2C portexpander - _i2c->write(_slaveAddress, data, 5); + _i2c->write(_slaveAddress, data, 5); +#elif (PCA9538==1) + // PCA9538 portexpander + + data[0] = PCA_OUTPUT; // set registeraddres + // Note: no increment so all data will go to GPIO register + + _setEnableBit(true); // set E + _setDataBits(value >> 4); // set data high + data[1] = _lcd_bus; + + _setEnableBit(false); // clear E + data[2] = _lcd_bus; + + _setEnableBit(true); // set E + _setDataBits(value); // set data low + data[3] = _lcd_bus; + + _setEnableBit(false); // clear E + data[4] = _lcd_bus; + + // write the packed data to the I2C portexpander + _i2c->write(_slaveAddress, data, 5); #else // PCF8574 of PCF8574A portexpander
--- a/TextLCD_Config.h Fri Nov 06 18:59:27 2015 +0000 +++ b/TextLCD_Config.h Fri Jan 06 14:51:48 2017 +0000 @@ -33,15 +33,15 @@ #define MBED_TEXTLCDCONFIG_H //Select hardware interface options to reduce memory footprint (multiple options allowed) -#define LCD_I2C 1 /* I2C Expander PCF8574/MCP23008 */ -#define LCD_SPI 1 /* SPI Expander SN74595 */ -#define LCD_I2C_N 1 /* Native I2C bus */ -#define LCD_SPI_N 1 /* Native SPI bus */ -#define LCD_SPI_N_3_8 1 /* Native SPI bus */ -#define LCD_SPI_N_3_9 1 /* Native SPI bus */ -#define LCD_SPI_N_3_10 1 /* Native SPI bus */ -#define LCD_SPI_N_3_16 1 /* Native SPI bus */ -#define LCD_SPI_N_3_24 1 /* Native SPI bus */ +#define LCD_I2C 1 /* I2C Expander PCF8574/MCP23008/PCA9538 */ +#define LCD_SPI 0 /* SPI Expander SN74595 */ +#define LCD_I2C_N 0 /* Native I2C bus */ +#define LCD_SPI_N 0 /* Native SPI bus */ +#define LCD_SPI_N_3_8 0 /* Native SPI bus */ +#define LCD_SPI_N_3_9 0 /* Native SPI bus */ +#define LCD_SPI_N_3_10 0 /* Native SPI bus */ +#define LCD_SPI_N_3_16 0 /* Native SPI bus */ +#define LCD_SPI_N_3_24 0 /* Native SPI bus */ //Select options to reduce memory footprint (multiple options allowed) #define LCD_UDC 1 /* Enable predefined UDC example*/ @@ -53,7 +53,7 @@ #define LCD_POWER 1 /* Enable Power control implementation -0.1K codesize*/ #define LCD_BLINK 1 /* Enable UDC and Icon Blink control implementation -0.8K codesize*/ #define LCD_CONTRAST 1 /* Enable Contrast control implementation -0.9K codesize*/ -#define LCD_TWO_CTRL 1 /* Enable LCD40x4 (two controller) implementation -0.1K codesize*/ +#define LCD_TWO_CTRL 0 /* Enable LCD40x4 (two controller) implementation -0.1K codesize*/ #define LCD_FONTSEL 0 /* Enable runtime font select implementation using setFont -0.9K codesize*/ //Select option to activate default fonttable or alternatively use conversion for specific controller versions (eg PCF2116C, PCF2119R, SSD1803, US2066) @@ -63,7 +63,7 @@ //#define LCD_UTF8_FONT 1 /* Enable UTF8 Support (eg Cyrillic tables) -0.4K codesize*/ //#define LCD_UTF8_CYR_B 1 /* Select specific UTF8 Cyrillic table (SSD1803 ROM_B) */ -//Pin Defines for I2C PCF8574/PCF8574A or MCP23008 and SPI 74595 bus expander interfaces +//Pin Defines for I2C PCF8574/PCF8574A or MCP23008 or PCA9538 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. // @@ -81,14 +81,14 @@ #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 +//This hardware supports the I2C bus expander (PCF8574/PCF8574A or MCP23008or PCA9538) and SPI bus expander (74595) interfaces //See https://mbed.org/cookbook/Text-LCD-Enhanced // //Note: LCD RW pin must be connected to GND // E2 is used for LCD40x4 (second controller) // BL may be used to control backlight -//I2C bus expander (PCF8574/PCF8574A or MCP23008) interface +//I2C bus expander (PCF8574/PCF8574A or MCP23008 or PCA9538) interface #define LCD_BUS_I2C_D4 (1 << 0) #define LCD_BUS_I2C_D5 (1 << 1) #define LCD_BUS_I2C_D6 (1 << 2) @@ -113,8 +113,9 @@ #define LCD_BUS_SPI_RW LCD_BUS_I2C_RW //Select I2C Portexpander type (one option only) -#define PCF8574 1 +#define PCF8574 0 #define MCP23008 0 +#define PCA9538 1 //Inverted Backlight control #define BACKLIGHT_INV 0 @@ -160,6 +161,7 @@ //Force I2C portexpander type #define PCF8574 0 #define MCP23008 1 +#define PCA9538 0 //Inverted Backlight control #define BACKLIGHT_INV 0 @@ -209,6 +211,7 @@ //Force I2C portexpander type #define PCF8574 1 #define MCP23008 0 +#define PCA9538 0 //Inverted Backlight control #define BACKLIGHT_INV 0 @@ -251,6 +254,7 @@ //Force I2C portexpander type #define PCF8574 1 #define MCP23008 0 +#define PCA9538 0 //Inverted Backlight control #define BACKLIGHT_INV 0 @@ -293,6 +297,7 @@ //Force I2C portexpander type #define PCF8574 1 #define MCP23008 0 +#define PCA9538 0 //Force Inverted Backlight control #define BACKLIGHT_INV 1 @@ -335,6 +340,7 @@ //Force I2C portexpander type #define PCF8574 1 #define MCP23008 0 +#define PCA9538 0 //Force Inverted Backlight control #define BACKLIGHT_INV 0 @@ -376,8 +382,9 @@ #define LCD_BUS_SPI_E2 LCD_BUS_I2C_E2 //Force I2C portexpander type -#define PCF8574 0 -#define MCP23008 1 +#define PCF8574 1 +#define MCP23008 0 +#define PCA9538 0 //Inverted Backlight control #define BACKLIGHT_INV 0 @@ -419,8 +426,9 @@ #define LCD_BUS_SPI_RW LCD_BUS_I2C_RW //Force I2C portexpander type -#define PCF8574 0 -#define MCP23008 1 +#define PCF8574 1 +#define MCP23008 0 +#define PCA9538 0 //Inverted Backlight control #define BACKLIGHT_INV 0 @@ -486,6 +494,18 @@ #define GPIO 0x09 #define OLAT 0x0A +/* PCA9538 I2C portexpander slave address */ +#define PCA9538_SA0 0xE0 +#define PCA9538_SA1 0xE2 +#define PCA9538_SA2 0xE4 +#define PCA9538_SA3 0xE6 + +/* PCA9538 I2C portexpander internal registers */ +#define PCA_INPUT 0x00 +#define PCA_OUTPUT 0x01 +#define PCA_POLARITY 0x02 +#define PCA_CONFIG 0x03 + /* ST7032i I2C slave address */ #define ST7032_SA 0x7C