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:
Tue Feb 05 21:50:43 2013 +0000
Revision:
12:6bf9d9957d31
Parent:
11:9ec02df863a1
Child:
13:24506ba22480
Updated Documentation

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 12:6bf9d9957d31 3 * 2013, WH, Added LCD types, fixed LCD address issues, added Cursor and UDCs
simon 1:ac48b187213c 4 *
simon 1:ac48b187213c 5 * Permission is hereby granted, free of charge, to any person obtaining a copy
simon 1:ac48b187213c 6 * of this software and associated documentation files (the "Software"), to deal
simon 1:ac48b187213c 7 * in the Software without restriction, including without limitation the rights
simon 1:ac48b187213c 8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
simon 1:ac48b187213c 9 * copies of the Software, and to permit persons to whom the Software is
simon 1:ac48b187213c 10 * furnished to do so, subject to the following conditions:
simon 2:227356c7d12c 11 *
simon 1:ac48b187213c 12 * The above copyright notice and this permission notice shall be included in
simon 1:ac48b187213c 13 * all copies or substantial portions of the Software.
simon 2:227356c7d12c 14 *
simon 1:ac48b187213c 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
simon 1:ac48b187213c 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
simon 1:ac48b187213c 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
simon 1:ac48b187213c 18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
simon 1:ac48b187213c 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
simon 1:ac48b187213c 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
simon 1:ac48b187213c 21 * THE SOFTWARE.
simon 1:ac48b187213c 22 */
simon 1:ac48b187213c 23
simon 1:ac48b187213c 24 #ifndef MBED_TEXTLCD_H
simon 1:ac48b187213c 25 #define MBED_TEXTLCD_H
simon 1:ac48b187213c 26
simon 1:ac48b187213c 27 #include "mbed.h"
simon 2:227356c7d12c 28
simon 5:a53b3e2d6f1e 29 /** A TextLCD interface for driving 4-bit HD44780-based LCDs
simon 2:227356c7d12c 30 *
wim 10:dd9b3a696acd 31 * Currently supports 8x1, 8x2, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4 and 40x2 panels
simon 2:227356c7d12c 32 *
simon 2:227356c7d12c 33 * @code
simon 2:227356c7d12c 34 * #include "mbed.h"
simon 2:227356c7d12c 35 * #include "TextLCD.h"
simon 5:a53b3e2d6f1e 36 *
wim 11:9ec02df863a1 37 * TextLCD lcd(p15, p16, p17, p18, p19, p20); // RS, E, D4-D7
simon 5:a53b3e2d6f1e 38 *
simon 2:227356c7d12c 39 * int main() {
simon 2:227356c7d12c 40 * lcd.printf("Hello World!\n");
simon 2:227356c7d12c 41 * }
simon 2:227356c7d12c 42 * @endcode
simon 2:227356c7d12c 43 */
wim 8:03116f75b66e 44
wim 11:9ec02df863a1 45 /** User Defined Chars 5x7 dots */
wim 11:9ec02df863a1 46 const char udc_ae[] = {0x00, 0x00, 0x1B, 0x05, 0x1F, 0x14, 0x1F, 0x00}; //æ
wim 11:9ec02df863a1 47 const char udc_0e[] = {0x00, 0x00, 0x0E, 0x13, 0x15, 0x19, 0x0E, 0x00}; //ø
wim 11:9ec02df863a1 48 const char udc_ao[] = {0x0E, 0x0A, 0x0E, 0x01, 0x0F, 0x11, 0x0F, 0x00}; //å
wim 11:9ec02df863a1 49 const char udc_AE[] = {0x0F, 0x14, 0x14, 0x1F, 0x14, 0x14, 0x17, 0x00}; //Æ
wim 11:9ec02df863a1 50 const char udc_0E[] = {0x0E, 0x13, 0x15, 0x15, 0x15, 0x19, 0x0E, 0x00}; //Ø
wim 11:9ec02df863a1 51 const char udc_AA[] = {0x0E, 0x0A, 0x0E, 0x11, 0x1F, 0x11, 0x11, 0x00}; //Å
wim 11:9ec02df863a1 52
wim 11:9ec02df863a1 53 const char udc_0[] = {0x18, 0x14, 0x12, 0x11, 0x12, 0x14, 0x18, 0x00}; // |>
wim 11:9ec02df863a1 54 const char udc_1[] = {0x03, 0x05, 0x09, 0x11, 0x09, 0x05, 0x03, 0x00}; // <|
wim 11:9ec02df863a1 55 const char udc_2[] = {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00}; // |
wim 11:9ec02df863a1 56 const char udc_3[] = {0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00}; // ||
wim 11:9ec02df863a1 57 const char udc_4[] = {0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00}; // |||
wim 11:9ec02df863a1 58 const char udc_5[] = {0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00}; // =
wim 11:9ec02df863a1 59 const char udc_6[] = {0x15, 0x0a, 0x15, 0x0a, 0x15, 0x0a, 0x15, 0x00}; // checkerboard
wim 11:9ec02df863a1 60 const char udc_7[] = {0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x10, 0x00}; // \
wim 11:9ec02df863a1 61
wim 11:9ec02df863a1 62
wim 11:9ec02df863a1 63 /** A TextLCD interface for driving 4-bit HD44780-based LCDs
wim 11:9ec02df863a1 64 *
wim 11:9ec02df863a1 65 * Currently supports 8x1, 8x2, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4 and 40x2 panels
wim 11:9ec02df863a1 66 *
wim 11:9ec02df863a1 67 */
simon 1:ac48b187213c 68 class TextLCD : public Stream {
simon 1:ac48b187213c 69 public:
simon 1:ac48b187213c 70
simon 2:227356c7d12c 71 /** LCD panel format */
simon 1:ac48b187213c 72 enum LCDType {
wim 8:03116f75b66e 73 LCD8x1, /**< 8x1 LCD panel */
wim 8:03116f75b66e 74 LCD8x2, /**< 8x2 LCD panel */
wim 8:03116f75b66e 75 LCD16x2, /**< 16x2 LCD panel (default) */
wim 8:03116f75b66e 76 LCD16x2B, /**< 16x2 LCD panel alternate addressing */
wim 8:03116f75b66e 77 LCD16x4, /**< 16x4 LCD panel */
wim 8:03116f75b66e 78 LCD20x2, /**< 20x2 LCD panel */
wim 8:03116f75b66e 79 LCD20x4, /**< 20x4 LCD panel */
wim 9:0893d986e717 80 LCD24x2, /**< 24x2 LCD panel */
wim 10:dd9b3a696acd 81 LCD24x4, /**< 24x4 LCD panel, special mode KS0078 */
wim 9:0893d986e717 82 LCD40x2 /**< 40x2 LCD panel */
simon 1:ac48b187213c 83 };
simon 1:ac48b187213c 84
wim 10:dd9b3a696acd 85 /** LCD Cursor control */
wim 10:dd9b3a696acd 86 enum LCDCursor {
wim 12:6bf9d9957d31 87 CurOff_BlkOff, /**< Cursor Off, Blinking Char Off */
wim 12:6bf9d9957d31 88 CurOn_BlkOff, /**< Cursor On, Blinking Char Off */
wim 12:6bf9d9957d31 89 CurOff_BlkOn, /**< Cursor Off, Blinking Char On */
wim 12:6bf9d9957d31 90 CurOn_BlkOn, /**< Cursor On, Blinking Char On */
wim 10:dd9b3a696acd 91 };
wim 10:dd9b3a696acd 92
wim 10:dd9b3a696acd 93
simon 2:227356c7d12c 94 /** Create a TextLCD interface
simon 2:227356c7d12c 95 *
simon 2:227356c7d12c 96 * @param rs Instruction/data control line
simon 2:227356c7d12c 97 * @param e Enable line (clock)
simon 7:44f34c09bd37 98 * @param d4-d7 Data lines for using as a 4-bit interface
simon 2:227356c7d12c 99 * @param type Sets the panel size/addressing mode (default = LCD16x2)
simon 2:227356c7d12c 100 */
simon 7:44f34c09bd37 101 TextLCD(PinName rs, PinName e, PinName d4, PinName d5, PinName d6, PinName d7, LCDType type = LCD16x2);
simon 2:227356c7d12c 102
simon 2:227356c7d12c 103 #if DOXYGEN_ONLY
simon 2:227356c7d12c 104 /** Write a character to the LCD
simon 2:227356c7d12c 105 *
simon 2:227356c7d12c 106 * @param c The character to write to the display
simon 2:227356c7d12c 107 */
simon 2:227356c7d12c 108 int putc(int c);
simon 2:227356c7d12c 109
simon 2:227356c7d12c 110 /** Write a formated string to the LCD
simon 2:227356c7d12c 111 *
simon 2:227356c7d12c 112 * @param format A printf-style format string, followed by the
simon 2:227356c7d12c 113 * variables to use in formating the string.
simon 2:227356c7d12c 114 */
simon 2:227356c7d12c 115 int printf(const char* format, ...);
simon 2:227356c7d12c 116 #endif
simon 2:227356c7d12c 117
simon 2:227356c7d12c 118 /** Locate to a screen column and row
simon 2:227356c7d12c 119 *
simon 2:227356c7d12c 120 * @param column The horizontal position from the left, indexed from 0
simon 2:227356c7d12c 121 * @param row The vertical position from the top, indexed from 0
simon 2:227356c7d12c 122 */
simon 1:ac48b187213c 123 void locate(int column, int row);
simon 2:227356c7d12c 124
wim 10:dd9b3a696acd 125
wim 10:dd9b3a696acd 126 /** Return the memoryaddress of screen column and row location
wim 10:dd9b3a696acd 127 *
wim 10:dd9b3a696acd 128 * @param column The horizontal position from the left, indexed from 0
wim 10:dd9b3a696acd 129 * @param row The vertical position from the top, indexed from 0
wim 10:dd9b3a696acd 130 * @param return The memoryaddress of screen column and row location
wim 10:dd9b3a696acd 131 */
wim 9:0893d986e717 132 int getAddress(int column, int row);
wim 10:dd9b3a696acd 133
wim 10:dd9b3a696acd 134
wim 10:dd9b3a696acd 135 /** Set the memoryaddress of screen column and row location
wim 10:dd9b3a696acd 136 *
wim 10:dd9b3a696acd 137 * @param column The horizontal position from the left, indexed from 0
wim 10:dd9b3a696acd 138 * @param row The vertical position from the top, indexed from 0
wim 10:dd9b3a696acd 139 */
wim 9:0893d986e717 140 void setAddress(int column, int row);
wim 9:0893d986e717 141
wim 10:dd9b3a696acd 142
simon 2:227356c7d12c 143 /** Clear the screen and locate to 0,0 */
simon 1:ac48b187213c 144 void cls();
simon 2:227356c7d12c 145
wim 10:dd9b3a696acd 146 /** Return the number of rows
wim 10:dd9b3a696acd 147 *
wim 10:dd9b3a696acd 148 * @param return The number of rows
wim 10:dd9b3a696acd 149 */
simon 1:ac48b187213c 150 int rows();
wim 10:dd9b3a696acd 151
wim 10:dd9b3a696acd 152 /** Return the number of columns
wim 10:dd9b3a696acd 153 *
wim 10:dd9b3a696acd 154 * @param return The number of columns
wim 10:dd9b3a696acd 155 */
wim 10:dd9b3a696acd 156 int columns();
simon 2:227356c7d12c 157
wim 11:9ec02df863a1 158 /** Set the Cursormode
wim 11:9ec02df863a1 159 *
wim 11:9ec02df863a1 160 * @param show The Cursor mode (CurOff_BlkOff, CurOn_BlkOff, CurOff_BlkOn, CurOn_BlkOn)
wim 11:9ec02df863a1 161 */
wim 11:9ec02df863a1 162 void cursor(LCDCursor show);
wim 11:9ec02df863a1 163
wim 11:9ec02df863a1 164
wim 11:9ec02df863a1 165 /** Set User Defined Characters
wim 11:9ec02df863a1 166 *
wim 11:9ec02df863a1 167 * @param unsigned char c The Index of the UDC (0..7)
wim 12:6bf9d9957d31 168 * @param char *udc_data The bitpatterns for the UDC (8 bytes of 5 significant bits)
wim 11:9ec02df863a1 169 */
wim 11:9ec02df863a1 170 void setUDC(unsigned char c, char *udc_data);
wim 11:9ec02df863a1 171
simon 1:ac48b187213c 172 protected:
simon 1:ac48b187213c 173 // Stream implementation functions
simon 1:ac48b187213c 174 virtual int _putc(int value);
simon 1:ac48b187213c 175 virtual int _getc();
simon 1:ac48b187213c 176
wim 8:03116f75b66e 177 int address(int column, int row);
simon 2:227356c7d12c 178 void character(int column, int row, int c);
simon 1:ac48b187213c 179 void writeByte(int value);
simon 1:ac48b187213c 180 void writeCommand(int command);
simon 1:ac48b187213c 181 void writeData(int data);
simon 1:ac48b187213c 182
simon 1:ac48b187213c 183 DigitalOut _rs, _e;
simon 1:ac48b187213c 184 BusOut _d;
simon 1:ac48b187213c 185 LCDType _type;
simon 1:ac48b187213c 186
simon 1:ac48b187213c 187 int _column;
simon 1:ac48b187213c 188 int _row;
wim 10:dd9b3a696acd 189 LCDCursor _cursor;
simon 1:ac48b187213c 190 };
simon 1:ac48b187213c 191
simon 1:ac48b187213c 192 #endif