1
Diff: TextLCD.h
- Revision:
- 26:bd897a001012
- Parent:
- 25:6162b31128c9
- Child:
- 27:22d5086f6ba6
--- a/TextLCD.h Sat May 10 21:34:51 2014 +0000 +++ b/TextLCD.h Fri May 30 15:05:13 2014 +0000 @@ -9,6 +9,7 @@ * 2013, v07: WH, Added support for backlight and include portdefinitions for LCD2004 Module from DFROBOT * 2014, v08: WH, Refactored in Base and Derived Classes to deal with mbed lib change regarding 'NC' defined DigitalOut pins * 2014, v09: WH/EO, Added Class for Native SPI controllers such as ST7032 + * 2014, v10: WH, Added Class for Native I2C controllers such as ST7032i, Added support for MCP23008 I2C portexpander, Added support for Adafruit module * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -34,11 +35,10 @@ #include "mbed.h" - /** A TextLCD interface for driving 4-bit HD44780-based LCDs * * Currently supports 8x1, 8x2, 12x4, 16x1, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2 and 40x4 panels - * Interface options include direct mbed pins, I2C portexpander (PCF8474, PCF8574A) or SPI bus shiftregister (74595) + * Interface options include direct mbed pins, I2C portexpander (PCF8474, PCF8574A, MCP23008) or SPI bus shiftregister (74595) * Supports some controllers that provide internal DC/DC converters for VLCD or VLED. * * @code @@ -55,7 +55,7 @@ * //TextLCD_SPI lcd(&spi_lcd, p8, TextLCD::LCD40x4); // SPI bus, CS pin, LCD Type * TextLCD_I2C lcd(&i2c_lcd, 0x42, TextLCD::LCD20x4); // I2C bus, PCF8574 Slaveaddress, LCD Type * //TextLCD_I2C lcd(&i2c_lcd, 0x42, TextLCD::LCD16x2, TextLCD::WS0010); // I2C bus, PCF8574 Slaveaddress, LCD Type, Device Type - * //TextLCD_SPI_N lcd(&spi_lcd, p8, p9); // SPI bus, CS pin, RS pin, LCDType=LCD16x2, BL=NC, LCDTCtrl=ST7032 + * //TextLCD_SPI_N lcd(&spi_lcd, p8, p9); // SPI bus, CS pin, RS pin, LCDType=LCD16x2, BL=NC, LCDTCtrl=ST7032 * * int main() { * lcd.printf("Hello World!\n"); @@ -63,14 +63,23 @@ * @endcode */ -//Pin Defines for I2C PCF8574 and SPI 74595 Bus interfaces + +//Pin Defines for I2C PCF8574/PCF8574A or MCP23008 and SPI 74595 bus expander interfaces //LCD and serial portexpanders should be wired accordingly // -#if (1) +//Select Hardware module (one option only) +#define DEFAULT 1 +#define ADAFRUIT 0 +#define DFROBOT 0 + + +#if (DEFAULT==1) //Definitions for hardware used by WH +//This hardware supports the I2C bus expander (PCF8574/PCF8574A or MCP23008) and SPI bus expander (74595) interfaces +// //Note: LCD RW pin must be connected to GND // E2 is used for LCD40x4 (second controller) -// BL may be used for future expansion to control backlight +// BL may be used to control backlight #define D_LCD_PIN_D4 0 #define D_LCD_PIN_D5 1 #define D_LCD_PIN_D6 2 @@ -82,12 +91,40 @@ #define D_LCD_PIN_RW D_LCD_PIN_E2 -#else +//Select I2C Portexpander type (one option only) +#define PCF8574 1 +#define MCP23008 0 +#endif +#if (ADAFRUIT==1) +//Definitions for i2cspilcdbackpack from Adafruit, See http://www.ladyada.net/products/i2cspilcdbackpack +//This hardware supports both an I2C expander (MCP23008) and an SPI expander (74595) selectable by a jumper. +// +//Note: LCD RW pin must be kept LOW +// E2 is not available on this hardware and so it does not support LCD40x4 (second controller) +// BL is used to control backlight +#define D_LCD_PIN_0 0 +#define D_LCD_PIN_RS 1 +#define D_LCD_PIN_E 2 +#define D_LCD_PIN_D4 3 +#define D_LCD_PIN_D5 4 +#define D_LCD_PIN_D6 5 +#define D_LCD_PIN_D7 6 +#define D_LCD_PIN_BL 7 + +#define D_LCD_PIN_E2 D_LCD_PIN_0 + +//Force I2C portexpander type +#define PCF8574 0 +#define MCP23008 1 +#endif + +#if (DFROBOT==1) //Definitions for LCD2004 Module from DFROBOT, See http://arduino-info.wikispaces.com/LCD-Blue-I2C -//This hardware is different from earlier/different Arduino I2C LCD displays +//This hardware uses PCF8574 and is different from earlier/different Arduino I2C LCD displays +// //Note: LCD RW pin must be kept LOW -// E2 is not available on default Arduino hardware and does not support LCD40x4 (second controller) +// E2 is not available on default Arduino hardware and so it does not support LCD40x4 (second controller) // BL is used to control backlight #define D_LCD_PIN_RS 0 #define D_LCD_PIN_RW 1 @@ -99,9 +136,13 @@ #define D_LCD_PIN_D7 7 #define D_LCD_PIN_E2 D_LCD_PIN_RW + +//Force I2C portexpander type +#define PCF8574 1 +#define MCP23008 0 #endif -//Bitpattern Defines for I2C PCF8574 and SPI 74595 Bus +//Bitpattern Defines for I2C PCF8574/PCF8574A, MCP23008 and SPI 74595 Bus expanders // #define D_LCD_D4 (1<<D_LCD_PIN_D4) #define D_LCD_D5 (1<<D_LCD_PIN_D5) @@ -113,10 +154,56 @@ #define D_LCD_BL (1<<D_LCD_PIN_BL) //#define D_LCD_RW (1<<D_LCD_PIN_RW) - #define D_LCD_BUS_MSK (D_LCD_D4 | D_LCD_D5 | D_LCD_D6 | D_LCD_D7) #define D_LCD_BUS_DEF 0x00 +/* PCF8574/PCF8574A I2C portexpander slave address */ +#define PCF8574_SA0 0x40 +#define PCF8574_SA1 0x42 +#define PCF8574_SA2 0x44 +#define PCF8574_SA3 0x46 +#define PCF8574_SA4 0x48 +#define PCF8574_SA5 0x4A +#define PCF8574_SA6 0x4C +#define PCF8574_SA7 0x4E + +#define PCF8574A_SA0 0x70 +#define PCF8574A_SA1 0x72 +#define PCF8574A_SA2 0x74 +#define PCF8574A_SA3 0x76 +#define PCF8574A_SA4 0x78 +#define PCF8574A_SA5 0x7A +#define PCF8574A_SA6 0x7C +#define PCF8574A_SA7 0x7E + +/* MCP23008 I2C portexpander slave address */ +#define MCP23008_SA0 0x40 +#define MCP23008_SA1 0x42 +#define MCP23008_SA2 0x44 +#define MCP23008_SA3 0x46 +#define MCP23008_SA4 0x48 +#define MCP23008_SA5 0x4A +#define MCP23008_SA6 0x4C +#define MCP23008_SA7 0x4E + + +/* MCP23008 I2C portexpander internal registers */ +#define IODIR 0x00 +#define IPOL 0x01 +#define GPINTEN 0x02 +#define DEFVAL 0x03 +#define INTCON 0x04 +#define IOCON 0x05 +#define GPPU 0x06 +#define INTF 0x07 +#define INTCAP 0x08 +#define GPIO 0x09 +#define OLAT 0x0A + + +/* ST7032I I2C slave address */ +#define ST7032_SA 0x7C + /** Some sample User Defined Chars 5x7 dots */ const char udc_ae[] = {0x00, 0x00, 0x1B, 0x05, 0x1F, 0x14, 0x1F, 0x00}; //æ @@ -164,7 +251,7 @@ /** A TextLCD interface for driving 4-bit HD44780-based LCDs * * @brief Currently supports 8x1, 8x2, 12x2, 12x4, 16x1, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2 and 40x4 panels - * Interface options include direct mbed pins, I2C portexpander (PCF8474, PCF8574A) or SPI bus shiftregister (74595) + * Interface options include direct mbed pins, I2C portexpander (PCF8474, PCF8574A) or SPI bus shiftregister (74595) and some native I2C or SPI devices * */ class TextLCD_Base : public Stream { @@ -191,10 +278,11 @@ /** LCD Controller Device */ enum LCDCtrl { - HD44780, /**< HD44780 (default) */ - WS0010, /**< WS0010 OLED Controller */ - ST7036, /**< ST7036 */ - ST7032 /**< ST7032 */ + HD44780, /**< HD44780 (default) */ + WS0010, /**< WS0010 OLED Controller */ + ST7036, /**< ST7036 */ + ST7032_3V3, /**< ST7032 3V3 with Booster */ + ST7032_5V /**< ST7032 5V no Booster */ }; @@ -424,26 +512,29 @@ //--------- Start TextLCD_I2C ----------- -/** Create a TextLCD interface using an I2C PC8574 or PCF8574A portexpander +/** Create a TextLCD interface using an I2C PCF8574 (or PCF8574A) or MCP23008 portexpander * */ class TextLCD_I2C : public TextLCD_Base { public: - /** Create a TextLCD interface using an I2C PC8574 or PCF8574A portexpander + /** Create a TextLCD interface using an I2C PCF8574 (or PCF8574A) or MCP23008 portexpander * * @param i2c I2C Bus - * @param deviceAddress I2C slave address (PCF8574 or PCF8574A, default = 0x40) + * @param deviceAddress I2C slave address (PCF8574 or PCF8574A, default = PCF8574_SA0 = 0x40) * @param type Sets the panel size/addressing mode (default = LCD16x2) * @param ctrl LCD controller (default = HD44780) */ - TextLCD_I2C(I2C *i2c, char deviceAddress = 0x40, LCDType type = LCD16x2, LCDCtrl ctrl = HD44780); + TextLCD_I2C(I2C *i2c, char deviceAddress = PCF8574_SA0, LCDType type = LCD16x2, LCDCtrl ctrl = HD44780); private: //Low level writes to LCD Bus (serial or parallel) virtual void _setEnable(bool value); virtual void _setRS(bool value); virtual void _setBL(bool value); - virtual void _setData(int value); + virtual void _setData(int value); + +// Write data to MCP23008 I2C portexpander + void _write_register (int reg, int value); //I2C bus I2C *_i2c; @@ -500,8 +591,8 @@ //---------- End TextLCD_SPI ------------ -//--------- Start TextLCD_NativeSPI ----------- +//--------- Start TextLCD_SPI_N ----------- /** Create a TextLCD interface using a controller with native SPI interface * @@ -515,9 +606,9 @@ * @param rs Instruction/data control line * @param type Sets the panel size/addressing mode (default = LCD16x2) * @param bl Backlight control line (optional, default = NC) - * @param ctrl LCD controller (default = ST7032) + * @param ctrl LCD controller (default = ST7032_3V3) */ - TextLCD_SPI_N(SPI *spi, PinName cs, PinName rs, LCDType type = LCD16x2, PinName bl = NC, LCDCtrl ctrl = ST7032); + TextLCD_SPI_N(SPI *spi, PinName cs, PinName rs, LCDType type = LCD16x2, PinName bl = NC, LCDCtrl ctrl = ST7032_3V3); virtual ~TextLCD_SPI_N(void); private: @@ -537,4 +628,40 @@ //---------- End TextLCD_SPI_N ------------ + +//--------- Start TextLCD_I2C_N ----------- + +/** Create a TextLCD interface using a controller with native I2C interface + * + */ +class TextLCD_I2C_N : public TextLCD_Base { +public: + /** Create a TextLCD interface using a controller with native I2C interface + * + * @param i2c I2C Bus + * @param deviceAddress I2C slave address (default = 0x) + * @param type Sets the panel size/addressing mode (default = LCD16x2) + * @param ctrl LCD controller (default = ST7032_3V3) + */ + TextLCD_I2C_N(I2C *i2c, char deviceAddress = 0x40, LCDType type = LCD16x2, LCDCtrl ctrl = ST7032_3V3); + virtual ~TextLCD_I2C_N(void); + +private: + virtual void _setEnable(bool value); + virtual void _setRS(bool value); + virtual void _setBL(bool value); + virtual void _setData(int value); + virtual void _writeByte(int value); + +//I2C bus + I2C *_i2c; + char _slaveAddress; + +// Internal bus mirror value for serial bus only + char _lcd_bus; +}; + +//---------- End TextLCD_I2C_N ------------ + + #endif