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
