made some changes in config header file to make this library work with 1602A display and PCF8574AT I2C-bus interface
Fork of TextLCD by
Revision 20:e0da005a777f, committed 2013-05-13
- Comitter:
- wim
- Date:
- Mon May 13 19:29:13 2013 +0000
- Parent:
- 19:c747b9e2e7b8
- Child:
- 21:9eb628d9e164
- Commit message:
- Added support for Backlight control; Added portdefinitions for I2C/TWI LCD2004 Module from DFROBOT
Changed in this revision
| TextLCD.cpp | Show annotated file Show diff for this revision Revisions of this file |
| TextLCD.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/TextLCD.cpp Fri Apr 19 19:36:37 2013 +0000
+++ b/TextLCD.cpp Mon May 13 19:29:13 2013 +0000
@@ -6,6 +6,7 @@
* 2013, v04: WH, Added support for Display On/Off, improved 4bit bootprocess
* 2013, v05: WH, Added support for 8x2B, added some UDCs
* 2013, v06: WH, Added support for devices that use internal DC/DC converters
+ * 2013, v07: WH, Added support for backlight and include portdefinitions for LCD2004 Module from DFROBOT
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -36,16 +37,17 @@
* @param e Enable line (clock)
* @param d4-d7 Data lines for using as a 4-bit interface
* @param type Sets the panel size/addressing mode (default = LCD16x2)
+ * @param bl Backlight control line (optional, default = NC)
* @param e2 Enable2 line (clock for second controller, LCD40x4 only)
* @param ctrl LCD controller (default = HD44780)
*/
TextLCD::TextLCD(PinName rs, PinName e,
PinName d4, PinName d5, PinName d6, PinName d7,
- LCDType type, PinName e2, LCDCtrl ctrl) : _rs(rs), _e(e), _e2(e2),
- _d(d4, d5, d6, d7),
- _cs(NC),
- _type(type),
- _ctrl(ctrl) {
+ LCDType type, PinName bl, PinName e2, LCDCtrl ctrl) : _rs(rs), _e(e), _bl(bl), _e2(e2),
+ _d(d4, d5, d6, d7),
+ _cs(NC),
+ _type(type),
+ _ctrl(ctrl) {
_busType = _PinBus;
@@ -61,7 +63,7 @@
* @param ctrl LCD controller (default = HD44780)
*/
TextLCD::TextLCD(I2C *i2c, char deviceAddress, LCDType type, LCDCtrl ctrl) :
- _rs(NC), _e(NC), _e2(NC),
+ _rs(NC), _e(NC), _bl(NC), _e2(NC),
_d(NC),
_i2c(i2c),
_cs(NC),
@@ -90,7 +92,7 @@
* @param ctrl LCD controller (default = HD44780)
*/
TextLCD::TextLCD(SPI *spi, PinName cs, LCDType type, LCDCtrl ctrl) :
- _rs(NC), _e(NC), _e2(NC),
+ _rs(NC), _e(NC), _bl(NC), _e2(NC),
_d(NC),
_spi(spi),
_cs(cs),
@@ -163,7 +165,7 @@
// send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus)
for (int i=0; i<3; i++) {
_writeNibble(0x3);
- wait_ms(15); // this command takes 1.64ms, so wait for it
+ wait_ms(15); // This command takes 1.64ms, so wait for it
}
_writeNibble(0x2); // 4-bit mode
wait_us(40); // most instructions take 40us
@@ -173,19 +175,19 @@
// Device specific initialisations for DC/DC converter to generate VLCD or VLED
switch (_ctrl) {
- case ST7063:
+ case ST7036:
// ST7036 controller: Initialise Voltage booster for VLCD. VDD=5V
// Note: supports 1,2 or 3 lines
_writeByte( 0x29 ); // 4-bit Databus, 2 Lines, Select Instruction table 1
- wait_us(27); // > 26,3ms
+ wait_ms(30); // > 26,3ms
_writeByte( 0x14 ); // Bias: 1/5, 2-Lines LCD
- wait_us(30); // > 26,3ms
+ wait_ms(30); // > 26,3ms
_writeByte( 0x55 ); // Icon off, Booster on, Set Contrast C5, C4
- wait_us(30); // > 26,3ms
+ wait_ms(30); // > 26,3ms
_writeByte( 0x6d ); // Voltagefollower On, Ampl ratio Rab2, Rab1, Rab0
wait_ms(200); // > 200ms!
_writeByte( 0x78 ); // Set Contrast C3, C2, C1, C0
- wait_us(30); // > 26,3ms
+ wait_ms(30); // > 26,3ms
_writeByte( 0x28 ); // Return to Instruction table 0
wait_ms(50);
@@ -472,6 +474,48 @@
}
+// Set BL pin
+// Used for mbed pins, I2C bus expander or SPI shifregister
+void TextLCD::_setBL(bool value) {
+
+ switch(_busType) {
+ case _PinBus :
+ if (value)
+ _bl = 1; // Set BL bit
+ else
+ _bl = 0; // Reset BL bit
+
+ break;
+
+ case _I2CBus :
+ if (value)
+ _lcd_bus |= D_LCD_BL; // Set BL bit
+ else
+ _lcd_bus &= ~D_LCD_BL; // Reset BL bit
+
+ // write the new data to the I2C portexpander
+ _i2c->write(_slaveAddress, &_lcd_bus, 1);
+
+ break;
+
+ case _SPIBus :
+ if (value)
+ _lcd_bus |= D_LCD_BL; // Set BL bit
+ else
+ _lcd_bus &= ~D_LCD_BL; // Reset BL bit
+
+ // write the new data to the SPI portexpander
+ _setCS(false);
+ _spi->write(_lcd_bus);
+ _setCS(true);
+
+ break;
+ }
+
+}
+
+
+
// Place the 4bit data on the databus
// Used for mbed pins, I2C bus expander or SPI shifregister
void TextLCD::_setData(int value) {
@@ -931,6 +975,17 @@
_writeCommand(0x08 | displayMode | cursorType);
}
+// Set the Backlight mode (Off/On)
+void TextLCD::setBacklight(TextLCD::LCDBacklight backlightMode) {
+
+ if (backlightMode == LightOn) {
+ _setBL(true);
+ }
+ else {
+ _setBL(false);
+ }
+}
+
void TextLCD::setUDC(unsigned char c, char *udc_data) {
--- a/TextLCD.h Fri Apr 19 19:36:37 2013 +0000
+++ b/TextLCD.h Mon May 13 19:29:13 2013 +0000
@@ -6,6 +6,7 @@
* 2013, v04: WH, Added support for Display On/Off, improved 4bit bootprocess
* 2013, v05: WH, Added support for 8x2B, added some UDCs
* 2013, v06: WH, Added support for devices that use internal DC/DC converters
+ * 2013, v07: WH, Added support for backlight and include portdefinitions for LCD2004 Module from DFROBOT
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -48,7 +49,7 @@
* // SPI Communication
* SPI spi_lcd(p5, NC, p7); // MOSI, MISO, SCLK
*
- * TextLCD lcd(p15, p16, p17, p18, p19, p20); // RS, E, D4-D7, LCDType=LCD16x2
+ * TextLCD lcd(p15, p16, p17, p18, p19, p20); // RS, E, D4-D7, LCDType=LCD16x2, BL=NC, E2=NC, LCDTCtrl=HD44780
* //TextLCD lcd(&spi_lcd, p8, TextLCD::LCD40x4); // SPI bus, CS pin, LCD Type
* //TextLCD lcd(&i2c_lcd, 0x42, TextLCD::LCD20x4); // I2C bus, PCF8574 Slaveaddress, LCD Type
* //TextLCD lcd(&i2c_lcd, 0x42, TextLCD::LCD16x2, TextLCD::WS0010); // I2C bus, PCF8574 Slaveaddress, LCD Type, Device Type
@@ -59,13 +60,14 @@
* @endcode
*/
-
//Pin Defines for I2C PCF8574 and SPI 74595 Bus interfaces
//LCD and serial portexpanders should be wired accordingly
+//
+#if (1)
+//Definitions for hardware used by WH
//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
-//
#define D_LCD_PIN_D4 0
#define D_LCD_PIN_D5 1
#define D_LCD_PIN_D6 2
@@ -75,8 +77,26 @@
#define D_LCD_PIN_E2 6
#define D_LCD_PIN_BL 7
-#define D_LCD_BUS_MSK 0x0F
-#define D_LCD_BUS_DEF 0x00
+#define D_LCD_PIN_RW D_LCD_PIN_E2
+
+#else
+
+//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
+//Note: LCD RW pin must be kept LOW
+// E2 is not available on default Arduino hardware and does not support LCD40x4 (second controller)
+// BL is used to control backlight
+#define D_LCD_PIN_RS 0
+#define D_LCD_PIN_RW 1
+#define D_LCD_PIN_E 2
+#define D_LCD_PIN_BL 3
+#define D_LCD_PIN_D4 4
+#define D_LCD_PIN_D5 5
+#define D_LCD_PIN_D6 6
+#define D_LCD_PIN_D7 7
+
+#define D_LCD_PIN_E2 D_LCD_PIN_RW
+#endif
//Bitpattern Defines for I2C PCF8574 and SPI 74595 Bus
//
@@ -88,6 +108,11 @@
#define D_LCD_E (1<<D_LCD_PIN_E)
#define D_LCD_E2 (1<<D_LCD_PIN_E2)
#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
/** Some sample User Defined Chars 5x7 dots */
@@ -164,7 +189,7 @@
enum LCDCtrl {
HD44780, /**< HD44780 (default) */
WS0010, /**< WS0010 OLED Controller */
- ST7063 /**< ST7063 */
+ ST7036 /**< ST7036 */
};
@@ -183,6 +208,11 @@
DispOn = 0x04 /**< Display On */
};
+ /** LCD Backlight control */
+ enum LCDBacklight {
+ LightOff, /**< Backlight Off */
+ LightOn /**< Backlight On */
+ };
/** Create a TextLCD interface for using regular mbed pins
*
@@ -190,10 +220,11 @@
* @param e Enable line (clock)
* @param d4-d7 Data lines for using as a 4-bit interface
* @param type Sets the panel size/addressing mode (default = LCD16x2)
+ * @param bl Backlight control line (optional, default = NC)
* @param e2 Enable2 line (clock for second controller, LCD40x4 only)
* @param ctrl LCD controller (default = HD44780)
*/
- TextLCD(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7, LCDType type = LCD16x2, PinName e2 = NC, LCDCtrl ctrl = HD44780);
+ TextLCD(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7, LCDType type = LCD16x2, PinName bl = NC, PinName e2 = NC, LCDCtrl ctrl = HD44780);
/** Create a TextLCD interface using an I2C PC8574 portexpander
*
@@ -283,6 +314,12 @@
*/
void setMode(TextLCD::LCDMode displayMode);
+ /** Set the Backlight mode
+ *
+ * @param backlightMode The Backlight mode (LightOff, LightOn)
+ */
+ void setBacklight(TextLCD::LCDBacklight backlightMode);
+
/** Set User Defined Characters
*
@@ -291,6 +328,7 @@
*/
void setUDC(unsigned char c, char *udc_data);
+
protected:
/* LCD Bus control */
enum _LCDBus {
@@ -326,6 +364,7 @@
//Low level writes to LCD Bus (serial or parallel)
void _setEnable(bool value);
void _setRS(bool value);
+ void _setBL(bool value);
void _setData(int value);
void _setCS(bool value);
@@ -334,7 +373,7 @@
// Regular mbed pins bus
- DigitalOut _rs, _e, _e2;
+ DigitalOut _rs, _e, _bl, _e2;
BusOut _d;
// I2C bus
