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:
Sat May 10 21:34:51 2014 +0000
Revision:
25:6162b31128c9
Parent:
24:fb3399713710
Child:
26:bd897a001012
Added support for controllers with native SPI interface.

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