TextLCD
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