A TextLCD interface for driving 4-bit HD44780-based LCDs.

Fork of TextLCD by Wim Huiskamp

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