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
