Updated for more display types. Fixed memoryaddress confusion in address() method. Added new getAddress() method. Added support for UDCs, Backlight control and other features such as control through I2C and SPI port expanders and controllers with native I2C and SPI interfaces. Refactored to fix issue with pins that are default declared as NC.

Dependents:   GPSDevice TestTextLCD SD to Flash Data Transfer DrumMachine ... more

Fork of TextLCD by Simon Ford

Example

Hello World! for the TextLCD

#include "mbed.h"
#include "TextLCD.h"
 
// Host PC Communication channels
Serial pc(USBTX, USBRX); // tx, rx
 
// I2C Communication
I2C i2c_lcd(p28,p27); // SDA, SCL
 
// 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, BL=NC, E2=NC, LCDTCtrl=HD44780
//TextLCD_SPI lcd(&spi_lcd, p8, TextLCD::LCD40x4);   // SPI bus, 74595 expander, 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_3V3   
//TextLCD_I2C_N lcd(&i2c_lcd, ST7032_SA, TextLCD::LCD16x2, NC, TextLCD::ST7032_3V3); // I2C bus, Slaveaddress, LCD Type, BL=NC, LCDTCtrl=ST7032_3V3  

int main() {
    pc.printf("LCD Test. Columns=%d, Rows=%d\n\r", lcd.columns(), lcd.rows());
    
    for (int row=0; row<lcd.rows(); row++) {
      int col=0;
      
      pc.printf("MemAddr(Col=%d, Row=%d)=0x%02X\n\r", col, row, lcd.getAddress(col, row));      
//      lcd.putc('-');
      lcd.putc('0' + row);      
      
      for (col=1; col<lcd.columns()-1; col++) {    
        lcd.putc('*');
      }
 
      pc.printf("MemAddr(Col=%d, Row=%d)=0x%02X\n\r", col, row, lcd.getAddress(col, row));      
      lcd.putc('+');
        
    }    
    
// Show cursor as blinking character
    lcd.setCursor(TextLCD::CurOff_BlkOn);
 
// Set and show user defined characters. A maximum of 8 UDCs are supported by the HD44780.
// They are defined by a 5x7 bitpattern. 
    lcd.setUDC(0, (char *) udc_0);  // Show |>
    lcd.putc(0);    
    lcd.setUDC(1, (char *) udc_1);  // Show <|
    lcd.putc(1);    

}

Handbook page

More info is here

Committer:
wim
Date:
Mon May 13 19:29:13 2013 +0000
Revision:
20:e0da005a777f
Parent:
19:c747b9e2e7b8
Child:
21:9eb628d9e164
Added support for Backlight control; Added portdefinitions for I2C/TWI LCD2004 Module from DFROBOT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 1:ac48b187213c 1 /* mbed TextLCD Library, for a 4-bit LCD based on HD44780
simon 6:e4cb7ddee0d3 2 * Copyright (c) 2007-2010, sford, http://mbed.org
wim 13:24506ba22480 3 * 2013, v01: WH, Added LCD types, fixed LCD address issues, added Cursor and UDCs
wim 15:b70ebfffb258 4 * 2013, v02: WH, Added I2C and SPI bus interfaces
wim 15:b70ebfffb258 5 * 2013, v03: WH, Added support for LCD40x4 which uses 2 controllers
wim 17:652ab113bc2e 6 * 2013, v04: WH, Added support for Display On/Off, improved 4bit bootprocess
wim 18:bd65dc10f27f 7 * 2013, v05: WH, Added support for 8x2B, added some UDCs
wim 19:c747b9e2e7b8 8 * 2013, v06: WH, Added support for devices that use internal DC/DC converters
wim 20:e0da005a777f 9 * 2013, v07: WH, Added support for backlight and include portdefinitions for LCD2004 Module from DFROBOT
simon 1:ac48b187213c 10 *
simon 1:ac48b187213c 11 * Permission is hereby granted, free of charge, to any person obtaining a copy
simon 1:ac48b187213c 12 * of this software and associated documentation files (the "Software"), to deal
simon 1:ac48b187213c 13 * in the Software without restriction, including without limitation the rights
simon 1:ac48b187213c 14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
simon 1:ac48b187213c 15 * copies of the Software, and to permit persons to whom the Software is
simon 1:ac48b187213c 16 * furnished to do so, subject to the following conditions:
simon 2:227356c7d12c 17 *
simon 1:ac48b187213c 18 * The above copyright notice and this permission notice shall be included in
simon 1:ac48b187213c 19 * all copies or substantial portions of the Software.
simon 2:227356c7d12c 20 *
simon 1:ac48b187213c 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
simon 1:ac48b187213c 22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
simon 1:ac48b187213c 23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
simon 1:ac48b187213c 24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
simon 1:ac48b187213c 25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
simon 1:ac48b187213c 26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
simon 1:ac48b187213c 27 * THE SOFTWARE.
simon 1:ac48b187213c 28 */
simon 1:ac48b187213c 29
simon 1:ac48b187213c 30 #ifndef MBED_TEXTLCD_H
simon 1:ac48b187213c 31 #define MBED_TEXTLCD_H
simon 1:ac48b187213c 32
simon 1:ac48b187213c 33 #include "mbed.h"
simon 2:227356c7d12c 34
wim 15:b70ebfffb258 35
simon 5:a53b3e2d6f1e 36 /** A TextLCD interface for driving 4-bit HD44780-based LCDs
simon 2:227356c7d12c 37 *
wim 16:c276b75e6585 38 * Currently supports 8x1, 8x2, 12x4, 16x1, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2 and 40x4 panels
wim 16:c276b75e6585 39 * Interface options include direct mbed pins, I2C portexpander (PCF8474) or SPI bus shiftregister (74595)
wim 19:c747b9e2e7b8 40 * Supports some controllers that provide internal DC/DC converters for VLCD or VLED.
simon 2:227356c7d12c 41 *
simon 2:227356c7d12c 42 * @code
simon 2:227356c7d12c 43 * #include "mbed.h"
simon 2:227356c7d12c 44 * #include "TextLCD.h"
simon 5:a53b3e2d6f1e 45 *
wim 16:c276b75e6585 46 * // I2C Communication
wim 16:c276b75e6585 47 * I2C i2c_lcd(p28,p27); // SDA, SCL
wim 16:c276b75e6585 48 *
wim 16:c276b75e6585 49 * // SPI Communication
wim 16:c276b75e6585 50 * SPI spi_lcd(p5, NC, p7); // MOSI, MISO, SCLK
wim 16:c276b75e6585 51 *
wim 20:e0da005a777f 52 * TextLCD lcd(p15, p16, p17, p18, p19, p20); // RS, E, D4-D7, LCDType=LCD16x2, BL=NC, E2=NC, LCDTCtrl=HD44780
wim 16:c276b75e6585 53 * //TextLCD lcd(&spi_lcd, p8, TextLCD::LCD40x4); // SPI bus, CS pin, LCD Type
wim 16:c276b75e6585 54 * //TextLCD lcd(&i2c_lcd, 0x42, TextLCD::LCD20x4); // I2C bus, PCF8574 Slaveaddress, LCD Type
wim 19:c747b9e2e7b8 55 * //TextLCD lcd(&i2c_lcd, 0x42, TextLCD::LCD16x2, TextLCD::WS0010); // I2C bus, PCF8574 Slaveaddress, LCD Type, Device Type
simon 5:a53b3e2d6f1e 56 *
simon 2:227356c7d12c 57 * int main() {
wim 16:c276b75e6585 58 * lcd.printf("Hello World!\n");
simon 2:227356c7d12c 59 * }
simon 2:227356c7d12c 60 * @endcode
simon 2:227356c7d12c 61 */
wim 8:03116f75b66e 62
wim 16:c276b75e6585 63 //Pin Defines for I2C PCF8574 and SPI 74595 Bus interfaces
wim 13:24506ba22480 64 //LCD and serial portexpanders should be wired accordingly
wim 20:e0da005a777f 65 //
wim 20:e0da005a777f 66 #if (1)
wim 20:e0da005a777f 67 //Definitions for hardware used by WH
wim 13:24506ba22480 68 //Note: LCD RW pin must be connected to GND
wim 15:b70ebfffb258 69 // E2 is used for LCD40x4 (second controller)
wim 13:24506ba22480 70 // BL may be used for future expansion to control backlight
wim 15:b70ebfffb258 71 #define D_LCD_PIN_D4 0
wim 15:b70ebfffb258 72 #define D_LCD_PIN_D5 1
wim 15:b70ebfffb258 73 #define D_LCD_PIN_D6 2
wim 15:b70ebfffb258 74 #define D_LCD_PIN_D7 3
wim 15:b70ebfffb258 75 #define D_LCD_PIN_RS 4
wim 15:b70ebfffb258 76 #define D_LCD_PIN_E 5
wim 15:b70ebfffb258 77 #define D_LCD_PIN_E2 6
wim 15:b70ebfffb258 78 #define D_LCD_PIN_BL 7
wim 13:24506ba22480 79
wim 20:e0da005a777f 80 #define D_LCD_PIN_RW D_LCD_PIN_E2
wim 20:e0da005a777f 81
wim 20:e0da005a777f 82 #else
wim 20:e0da005a777f 83
wim 20:e0da005a777f 84 //Definitions for LCD2004 Module from DFROBOT, See http://arduino-info.wikispaces.com/LCD-Blue-I2C
wim 20:e0da005a777f 85 //This hardware is different from earlier/different Arduino I2C LCD displays
wim 20:e0da005a777f 86 //Note: LCD RW pin must be kept LOW
wim 20:e0da005a777f 87 // E2 is not available on default Arduino hardware and does not support LCD40x4 (second controller)
wim 20:e0da005a777f 88 // BL is used to control backlight
wim 20:e0da005a777f 89 #define D_LCD_PIN_RS 0
wim 20:e0da005a777f 90 #define D_LCD_PIN_RW 1
wim 20:e0da005a777f 91 #define D_LCD_PIN_E 2
wim 20:e0da005a777f 92 #define D_LCD_PIN_BL 3
wim 20:e0da005a777f 93 #define D_LCD_PIN_D4 4
wim 20:e0da005a777f 94 #define D_LCD_PIN_D5 5
wim 20:e0da005a777f 95 #define D_LCD_PIN_D6 6
wim 20:e0da005a777f 96 #define D_LCD_PIN_D7 7
wim 20:e0da005a777f 97
wim 20:e0da005a777f 98 #define D_LCD_PIN_E2 D_LCD_PIN_RW
wim 20:e0da005a777f 99 #endif
wim 13:24506ba22480 100
wim 13:24506ba22480 101 //Bitpattern Defines for I2C PCF8574 and SPI 74595 Bus
wim 13:24506ba22480 102 //
wim 13:24506ba22480 103 #define D_LCD_D4 (1<<D_LCD_PIN_D4)
wim 13:24506ba22480 104 #define D_LCD_D5 (1<<D_LCD_PIN_D5)
wim 13:24506ba22480 105 #define D_LCD_D6 (1<<D_LCD_PIN_D6)
wim 13:24506ba22480 106 #define D_LCD_D7 (1<<D_LCD_PIN_D7)
wim 13:24506ba22480 107 #define D_LCD_RS (1<<D_LCD_PIN_RS)
wim 13:24506ba22480 108 #define D_LCD_E (1<<D_LCD_PIN_E)
wim 13:24506ba22480 109 #define D_LCD_E2 (1<<D_LCD_PIN_E2)
wim 13:24506ba22480 110 #define D_LCD_BL (1<<D_LCD_PIN_BL)
wim 20:e0da005a777f 111 //#define D_LCD_RW (1<<D_LCD_PIN_RW)
wim 20:e0da005a777f 112
wim 20:e0da005a777f 113
wim 20:e0da005a777f 114 #define D_LCD_BUS_MSK (D_LCD_D4 | D_LCD_D5 | D_LCD_D6 | D_LCD_D7)
wim 20:e0da005a777f 115 #define D_LCD_BUS_DEF 0x00
wim 13:24506ba22480 116
wim 13:24506ba22480 117
wim 13:24506ba22480 118 /** Some sample User Defined Chars 5x7 dots */
wim 11:9ec02df863a1 119 const char udc_ae[] = {0x00, 0x00, 0x1B, 0x05, 0x1F, 0x14, 0x1F, 0x00}; //æ
wim 11:9ec02df863a1 120 const char udc_0e[] = {0x00, 0x00, 0x0E, 0x13, 0x15, 0x19, 0x0E, 0x00}; //ø
wim 11:9ec02df863a1 121 const char udc_ao[] = {0x0E, 0x0A, 0x0E, 0x01, 0x0F, 0x11, 0x0F, 0x00}; //Ã¥
wim 11:9ec02df863a1 122 const char udc_AE[] = {0x0F, 0x14, 0x14, 0x1F, 0x14, 0x14, 0x17, 0x00}; //Æ
wim 11:9ec02df863a1 123 const char udc_0E[] = {0x0E, 0x13, 0x15, 0x15, 0x15, 0x19, 0x0E, 0x00}; //Ø
wim 18:bd65dc10f27f 124 const char udc_Ao[] = {0x0E, 0x0A, 0x0E, 0x11, 0x1F, 0x11, 0x11, 0x00}; //Ã…
wim 18:bd65dc10f27f 125 const char udc_PO[] = {0x04, 0x0A, 0x0A, 0x1F, 0x1B, 0x1B, 0x1F, 0x00}; //Padlock Open
wim 18:bd65dc10f27f 126 const char udc_PC[] = {0x1C, 0x10, 0x08, 0x1F, 0x1B, 0x1B, 0x1F, 0x00}; //Padlock Closed
wim 11:9ec02df863a1 127
wim 11:9ec02df863a1 128 const char udc_0[] = {0x18, 0x14, 0x12, 0x11, 0x12, 0x14, 0x18, 0x00}; // |>
wim 11:9ec02df863a1 129 const char udc_1[] = {0x03, 0x05, 0x09, 0x11, 0x09, 0x05, 0x03, 0x00}; // <|
wim 11:9ec02df863a1 130 const char udc_2[] = {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00}; // |
wim 11:9ec02df863a1 131 const char udc_3[] = {0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00}; // ||
wim 11:9ec02df863a1 132 const char udc_4[] = {0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00}; // |||
wim 11:9ec02df863a1 133 const char udc_5[] = {0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00}; // =
wim 11:9ec02df863a1 134 const char udc_6[] = {0x15, 0x0a, 0x15, 0x0a, 0x15, 0x0a, 0x15, 0x00}; // checkerboard
wim 11:9ec02df863a1 135 const char udc_7[] = {0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x10, 0x00}; // \
wim 11:9ec02df863a1 136
wim 13:24506ba22480 137 const char udc_degr[] = {0x06, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00}; // Degree symbol
wim 13:24506ba22480 138
wim 13:24506ba22480 139 const char udc_TM_T[] = {0x1F, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00}; // Trademark T
wim 13:24506ba22480 140 const char udc_TM_M[] = {0x11, 0x1B, 0x15, 0x11, 0x00, 0x00, 0x00, 0x00}; // Trademark M
wim 13:24506ba22480 141
wim 13:24506ba22480 142 //const char udc_Bat_Hi[] = {0x0E, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00}; // Battery Full
wim 13:24506ba22480 143 //const char udc_Bat_Ha[] = {0x0E, 0x11, 0x13, 0x17, 0x1F, 0x1F, 0x1F, 0x00}; // Battery Half
wim 13:24506ba22480 144 //const char udc_Bat_Lo[] = {0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x00}; // Battery Low
wim 13:24506ba22480 145 const char udc_Bat_Hi[] = {0x0E, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00}; // Battery Full
wim 13:24506ba22480 146 const char udc_Bat_Ha[] = {0x0E, 0x11, 0x11, 0x1F, 0x1F, 0x1F, 0x1F, 0x00}; // Battery Half
wim 13:24506ba22480 147 const char udc_Bat_Lo[] = {0x0E, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x1F, 0x00}; // Battery Low
wim 18:bd65dc10f27f 148 const char udc_AC[] = {0x0A, 0x0A, 0x1F, 0x11, 0x0E, 0x04, 0x04, 0x00}; // AC Power
wim 13:24506ba22480 149
wim 18:bd65dc10f27f 150 //const char udc_smiley[] = {0x00, 0x0A, 0x00, 0x04, 0x11, 0x0E, 0x00, 0x00}; // Smiley
wim 18:bd65dc10f27f 151 //const char udc_droopy[] = {0x00, 0x0A, 0x00, 0x04, 0x00, 0x0E, 0x11, 0x00}; // Droopey
wim 18:bd65dc10f27f 152 //const char udc_note[] = {0x01, 0x03, 0x05, 0x09, 0x0B, 0x1B, 0x18, 0x00}; // Note
wim 18:bd65dc10f27f 153
wim 18:bd65dc10f27f 154 //const char udc_bar_1[] = {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00}; // Bar 1
wim 18:bd65dc10f27f 155 //const char udc_bar_2[] = {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00}; // Bar 11
wim 18:bd65dc10f27f 156 //const char udc_bar_3[] = {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x00}; // Bar 111
wim 18:bd65dc10f27f 157 //const char udc_bar_4[] = {0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x00}; // Bar 1111
wim 18:bd65dc10f27f 158 //const char udc_bar_5[] = {0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00}; // Bar 11111
wim 13:24506ba22480 159
wim 11:9ec02df863a1 160
wim 11:9ec02df863a1 161 /** A TextLCD interface for driving 4-bit HD44780-based LCDs
wim 11:9ec02df863a1 162 *
wim 16:c276b75e6585 163 * Currently supports 8x1, 8x2, 12x2, 12x4, 16x1, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2 and 40x4 panels
wim 11:9ec02df863a1 164 *
wim 11:9ec02df863a1 165 */
simon 1:ac48b187213c 166 class TextLCD : public Stream {
simon 1:ac48b187213c 167 public:
simon 1:ac48b187213c 168
simon 2:227356c7d12c 169 /** LCD panel format */
simon 1:ac48b187213c 170 enum LCDType {
wim 8:03116f75b66e 171 LCD8x1, /**< 8x1 LCD panel */
wim 13:24506ba22480 172 LCD8x2, /**< 8x2 LCD panel */
wim 18:bd65dc10f27f 173 LCD8x2B, /**< 8x2 LCD panel (actually 16x1) */
wim 15:b70ebfffb258 174 LCD12x2, /**< 12x2 LCD panel */
wim 15:b70ebfffb258 175 LCD12x4, /**< 12x4 LCD panel */
wim 13:24506ba22480 176 LCD16x1, /**< 16x1 LCD panel (actually 8x2) */
wim 8:03116f75b66e 177 LCD16x2, /**< 16x2 LCD panel (default) */
wim 8:03116f75b66e 178 LCD16x2B, /**< 16x2 LCD panel alternate addressing */
wim 8:03116f75b66e 179 LCD16x4, /**< 16x4 LCD panel */
wim 8:03116f75b66e 180 LCD20x2, /**< 20x2 LCD panel */
wim 8:03116f75b66e 181 LCD20x4, /**< 20x4 LCD panel */
wim 9:0893d986e717 182 LCD24x2, /**< 24x2 LCD panel */
wim 10:dd9b3a696acd 183 LCD24x4, /**< 24x4 LCD panel, special mode KS0078 */
wim 15:b70ebfffb258 184 LCD40x2, /**< 40x2 LCD panel */
wim 15:b70ebfffb258 185 LCD40x4 /**< 40x4 LCD panel, Two controller version */
simon 1:ac48b187213c 186 };
simon 1:ac48b187213c 187
wim 19:c747b9e2e7b8 188 /** LCD Controller Device */
wim 19:c747b9e2e7b8 189 enum LCDCtrl {
wim 19:c747b9e2e7b8 190 HD44780, /**< HD44780 (default) */
wim 19:c747b9e2e7b8 191 WS0010, /**< WS0010 OLED Controller */
wim 20:e0da005a777f 192 ST7036 /**< ST7036 */
wim 19:c747b9e2e7b8 193 };
wim 19:c747b9e2e7b8 194
wim 19:c747b9e2e7b8 195
wim 10:dd9b3a696acd 196 /** LCD Cursor control */
wim 10:dd9b3a696acd 197 enum LCDCursor {
wim 17:652ab113bc2e 198 CurOff_BlkOff = 0x00, /**< Cursor Off, Blinking Char Off */
wim 17:652ab113bc2e 199 CurOn_BlkOff = 0x02, /**< Cursor On, Blinking Char Off */
wim 17:652ab113bc2e 200 CurOff_BlkOn = 0x01, /**< Cursor Off, Blinking Char On */
wim 17:652ab113bc2e 201 CurOn_BlkOn = 0x03 /**< Cursor On, Blinking Char On */
wim 17:652ab113bc2e 202 };
wim 17:652ab113bc2e 203
wim 17:652ab113bc2e 204
wim 17:652ab113bc2e 205 /** LCD Display control */
wim 17:652ab113bc2e 206 enum LCDMode {
wim 17:652ab113bc2e 207 DispOff = 0x00, /**< Display Off */
wim 17:652ab113bc2e 208 DispOn = 0x04 /**< Display On */
wim 10:dd9b3a696acd 209 };
wim 10:dd9b3a696acd 210
wim 20:e0da005a777f 211 /** LCD Backlight control */
wim 20:e0da005a777f 212 enum LCDBacklight {
wim 20:e0da005a777f 213 LightOff, /**< Backlight Off */
wim 20:e0da005a777f 214 LightOn /**< Backlight On */
wim 20:e0da005a777f 215 };
wim 10:dd9b3a696acd 216
wim 15:b70ebfffb258 217 /** Create a TextLCD interface for using regular mbed pins
simon 2:227356c7d12c 218 *
simon 2:227356c7d12c 219 * @param rs Instruction/data control line
simon 2:227356c7d12c 220 * @param e Enable line (clock)
simon 7:44f34c09bd37 221 * @param d4-d7 Data lines for using as a 4-bit interface
simon 2:227356c7d12c 222 * @param type Sets the panel size/addressing mode (default = LCD16x2)
wim 20:e0da005a777f 223 * @param bl Backlight control line (optional, default = NC)
wim 19:c747b9e2e7b8 224 * @param e2 Enable2 line (clock for second controller, LCD40x4 only)
wim 19:c747b9e2e7b8 225 * @param ctrl LCD controller (default = HD44780)
simon 2:227356c7d12c 226 */
wim 20:e0da005a777f 227 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);
wim 13:24506ba22480 228
wim 13:24506ba22480 229 /** Create a TextLCD interface using an I2C PC8574 portexpander
wim 13:24506ba22480 230 *
wim 13:24506ba22480 231 * @param i2c I2C Bus
wim 13:24506ba22480 232 * @param deviceAddress I2C slave address (PCF8574)
wim 13:24506ba22480 233 * @param type Sets the panel size/addressing mode (default = LCD16x2)
wim 19:c747b9e2e7b8 234 * @param ctrl LCD controller (default = HD44780)
wim 13:24506ba22480 235 */
wim 19:c747b9e2e7b8 236 TextLCD(I2C *i2c, char deviceAddress, LCDType type = LCD16x2, LCDCtrl ctrl = HD44780);
wim 13:24506ba22480 237
wim 13:24506ba22480 238
wim 13:24506ba22480 239 /** Create a TextLCD interface using an SPI 74595 portexpander
wim 13:24506ba22480 240 *
wim 13:24506ba22480 241 * @param spi SPI Bus
wim 13:24506ba22480 242 * @param cs chip select pin (active low)
wim 13:24506ba22480 243 * @param type Sets the panel size/addressing mode (default = LCD16x2)
wim 19:c747b9e2e7b8 244 * @param ctrl LCD controller (default = HD44780)
wim 13:24506ba22480 245 */
wim 19:c747b9e2e7b8 246 TextLCD(SPI *spi, PinName cs, LCDType type = LCD16x2, LCDCtrl ctrl = HD44780);
wim 13:24506ba22480 247
simon 2:227356c7d12c 248
simon 2:227356c7d12c 249 #if DOXYGEN_ONLY
simon 2:227356c7d12c 250 /** Write a character to the LCD
simon 2:227356c7d12c 251 *
simon 2:227356c7d12c 252 * @param c The character to write to the display
simon 2:227356c7d12c 253 */
simon 2:227356c7d12c 254 int putc(int c);
simon 2:227356c7d12c 255
simon 2:227356c7d12c 256 /** Write a formated string to the LCD
simon 2:227356c7d12c 257 *
simon 2:227356c7d12c 258 * @param format A printf-style format string, followed by the
simon 2:227356c7d12c 259 * variables to use in formating the string.
simon 2:227356c7d12c 260 */
simon 2:227356c7d12c 261 int printf(const char* format, ...);
simon 2:227356c7d12c 262 #endif
simon 2:227356c7d12c 263
simon 2:227356c7d12c 264 /** Locate to a screen column and row
simon 2:227356c7d12c 265 *
simon 2:227356c7d12c 266 * @param column The horizontal position from the left, indexed from 0
simon 2:227356c7d12c 267 * @param row The vertical position from the top, indexed from 0
simon 2:227356c7d12c 268 */
simon 1:ac48b187213c 269 void locate(int column, int row);
simon 2:227356c7d12c 270
wim 10:dd9b3a696acd 271
wim 10:dd9b3a696acd 272 /** Return the memoryaddress of screen column and row location
wim 10:dd9b3a696acd 273 *
wim 10:dd9b3a696acd 274 * @param column The horizontal position from the left, indexed from 0
wim 10:dd9b3a696acd 275 * @param row The vertical position from the top, indexed from 0
wim 10:dd9b3a696acd 276 * @param return The memoryaddress of screen column and row location
wim 10:dd9b3a696acd 277 */
wim 9:0893d986e717 278 int getAddress(int column, int row);
wim 10:dd9b3a696acd 279
wim 10:dd9b3a696acd 280
wim 10:dd9b3a696acd 281 /** Set the memoryaddress of screen column and row location
wim 10:dd9b3a696acd 282 *
wim 10:dd9b3a696acd 283 * @param column The horizontal position from the left, indexed from 0
wim 10:dd9b3a696acd 284 * @param row The vertical position from the top, indexed from 0
wim 10:dd9b3a696acd 285 */
wim 9:0893d986e717 286 void setAddress(int column, int row);
wim 9:0893d986e717 287
wim 10:dd9b3a696acd 288
simon 2:227356c7d12c 289 /** Clear the screen and locate to 0,0 */
simon 1:ac48b187213c 290 void cls();
simon 2:227356c7d12c 291
wim 10:dd9b3a696acd 292 /** Return the number of rows
wim 10:dd9b3a696acd 293 *
wim 10:dd9b3a696acd 294 * @param return The number of rows
wim 10:dd9b3a696acd 295 */
simon 1:ac48b187213c 296 int rows();
wim 10:dd9b3a696acd 297
wim 10:dd9b3a696acd 298 /** Return the number of columns
wim 10:dd9b3a696acd 299 *
wim 10:dd9b3a696acd 300 * @param return The number of columns
wim 10:dd9b3a696acd 301 */
wim 10:dd9b3a696acd 302 int columns();
simon 2:227356c7d12c 303
wim 11:9ec02df863a1 304 /** Set the Cursormode
wim 11:9ec02df863a1 305 *
wim 17:652ab113bc2e 306 * @param cursorMode The Cursor mode (CurOff_BlkOff, CurOn_BlkOff, CurOff_BlkOn, CurOn_BlkOn)
wim 11:9ec02df863a1 307 */
wim 17:652ab113bc2e 308 void setCursor(LCDCursor cursorMode);
wim 17:652ab113bc2e 309
wim 17:652ab113bc2e 310
wim 17:652ab113bc2e 311 /** Set the Displaymode
wim 17:652ab113bc2e 312 *
wim 17:652ab113bc2e 313 * @param displayMode The Display mode (DispOff, DispOn)
wim 17:652ab113bc2e 314 */
wim 17:652ab113bc2e 315 void setMode(TextLCD::LCDMode displayMode);
wim 11:9ec02df863a1 316
wim 20:e0da005a777f 317 /** Set the Backlight mode
wim 20:e0da005a777f 318 *
wim 20:e0da005a777f 319 * @param backlightMode The Backlight mode (LightOff, LightOn)
wim 20:e0da005a777f 320 */
wim 20:e0da005a777f 321 void setBacklight(TextLCD::LCDBacklight backlightMode);
wim 20:e0da005a777f 322
wim 11:9ec02df863a1 323
wim 11:9ec02df863a1 324 /** Set User Defined Characters
wim 11:9ec02df863a1 325 *
wim 11:9ec02df863a1 326 * @param unsigned char c The Index of the UDC (0..7)
wim 12:6bf9d9957d31 327 * @param char *udc_data The bitpatterns for the UDC (8 bytes of 5 significant bits)
wim 11:9ec02df863a1 328 */
wim 11:9ec02df863a1 329 void setUDC(unsigned char c, char *udc_data);
wim 11:9ec02df863a1 330
wim 20:e0da005a777f 331
simon 1:ac48b187213c 332 protected:
wim 14:0c32b66b14b8 333 /* LCD Bus control */
wim 13:24506ba22480 334 enum _LCDBus {
wim 14:0c32b66b14b8 335 _PinBus, /*< Regular mbed pins */
wim 14:0c32b66b14b8 336 _I2CBus, /*< I2C PCF8574 Portexpander */
wim 15:b70ebfffb258 337 _SPIBus /*< SPI 74595 Shiftregister */
wim 13:24506ba22480 338 };
wim 13:24506ba22480 339
wim 15:b70ebfffb258 340 /* LCD controller select, mainly used for LCD40x4 */
wim 19:c747b9e2e7b8 341 enum _LCDCtrl_Idx {
wim 15:b70ebfffb258 342 _LCDCtrl_0, /*< Primary */
wim 15:b70ebfffb258 343 _LCDCtrl_1, /*< Secondary */
wim 15:b70ebfffb258 344 };
wim 15:b70ebfffb258 345
simon 1:ac48b187213c 346 // Stream implementation functions
simon 1:ac48b187213c 347 virtual int _putc(int value);
simon 1:ac48b187213c 348 virtual int _getc();
simon 1:ac48b187213c 349
wim 15:b70ebfffb258 350 //Low level methods for LCD controller
wim 13:24506ba22480 351 void _init();
wim 15:b70ebfffb258 352 void _initCtrl();
wim 13:24506ba22480 353 int _address(int column, int row);
wim 15:b70ebfffb258 354 void _setCursor(TextLCD::LCDCursor show);
wim 17:652ab113bc2e 355 void _setUDC(unsigned char c, char *udc_data);
wim 17:652ab113bc2e 356 void _setCursorAndDisplayMode(TextLCD::LCDMode displayMode, TextLCD::LCDCursor cursorType);
wim 13:24506ba22480 357
wim 15:b70ebfffb258 358 //Low level write operations to LCD controller
wim 17:652ab113bc2e 359 void _writeNibble(int value);
wim 15:b70ebfffb258 360 void _writeByte(int value);
wim 15:b70ebfffb258 361 void _writeCommand(int command);
wim 15:b70ebfffb258 362 void _writeData(int data);
wim 15:b70ebfffb258 363
wim 13:24506ba22480 364 //Low level writes to LCD Bus (serial or parallel)
wim 13:24506ba22480 365 void _setEnable(bool value);
wim 13:24506ba22480 366 void _setRS(bool value);
wim 20:e0da005a777f 367 void _setBL(bool value);
wim 13:24506ba22480 368 void _setData(int value);
wim 14:0c32b66b14b8 369 void _setCS(bool value);
wim 14:0c32b66b14b8 370
wim 13:24506ba22480 371 //Low level writes to LCD serial bus only
wim 13:24506ba22480 372 void _writeBus();
wim 13:24506ba22480 373
wim 13:24506ba22480 374
wim 13:24506ba22480 375 // Regular mbed pins bus
wim 20:e0da005a777f 376 DigitalOut _rs, _e, _bl, _e2;
simon 1:ac48b187213c 377 BusOut _d;
wim 13:24506ba22480 378
wim 13:24506ba22480 379 // I2C bus
wim 13:24506ba22480 380 I2C *_i2c;
wim 13:24506ba22480 381 unsigned char _slaveAddress;
wim 13:24506ba22480 382
wim 13:24506ba22480 383 // SPI bus
wim 14:0c32b66b14b8 384 SPI *_spi;
wim 14:0c32b66b14b8 385 DigitalOut _cs;
wim 13:24506ba22480 386
wim 13:24506ba22480 387 //Bus Interface type
wim 13:24506ba22480 388 _LCDBus _busType;
wim 13:24506ba22480 389
wim 15:b70ebfffb258 390 // Internal bus mirror value for serial bus only
wim 13:24506ba22480 391 char _lcd_bus;
wim 13:24506ba22480 392
wim 13:24506ba22480 393 //Display type
simon 1:ac48b187213c 394 LCDType _type;
simon 1:ac48b187213c 395
wim 17:652ab113bc2e 396 //Display type
wim 17:652ab113bc2e 397 LCDMode _currentMode;
wim 17:652ab113bc2e 398
wim 19:c747b9e2e7b8 399 //Controller type
wim 19:c747b9e2e7b8 400 LCDCtrl _ctrl;
wim 19:c747b9e2e7b8 401
wim 15:b70ebfffb258 402 //Controller select, mainly used for LCD40x4
wim 19:c747b9e2e7b8 403 _LCDCtrl_Idx _ctrl_idx;
wim 15:b70ebfffb258 404
wim 13:24506ba22480 405 // Cursor
simon 1:ac48b187213c 406 int _column;
simon 1:ac48b187213c 407 int _row;
wim 15:b70ebfffb258 408 LCDCursor _currentCursor;
simon 1:ac48b187213c 409 };
simon 1:ac48b187213c 410
simon 1:ac48b187213c 411 #endif