A TextLCD interface for driving 4-bit HD44780-based LCDs.
Fork of TextLCD by
Diff: TextLCD.cpp
- Revision:
- 42:14e1718fba52
- Parent:
- 41:111ca62e8a59
--- 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