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:
simon
Date:
Thu May 27 17:52:15 2010 +0000
Revision:
2:227356c7d12c
Parent:
1:ac48b187213c
Child:
4:bf5b706f8d32

        

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 1:ac48b187213c 2 * Copyright (c) 2007-2010, sford
simon 1:ac48b187213c 3 *
simon 1:ac48b187213c 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
simon 1:ac48b187213c 5 * of this software and associated documentation files (the "Software"), to deal
simon 1:ac48b187213c 6 * in the Software without restriction, including without limitation the rights
simon 1:ac48b187213c 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
simon 1:ac48b187213c 8 * copies of the Software, and to permit persons to whom the Software is
simon 1:ac48b187213c 9 * furnished to do so, subject to the following conditions:
simon 1:ac48b187213c 10 *
simon 1:ac48b187213c 11 * The above copyright notice and this permission notice shall be included in
simon 1:ac48b187213c 12 * all copies or substantial portions of the Software.
simon 1:ac48b187213c 13 *
simon 1:ac48b187213c 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
simon 1:ac48b187213c 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
simon 1:ac48b187213c 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
simon 1:ac48b187213c 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
simon 1:ac48b187213c 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
simon 1:ac48b187213c 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
simon 1:ac48b187213c 20 * THE SOFTWARE.
simon 1:ac48b187213c 21 */
simon 1:ac48b187213c 22
simon 1:ac48b187213c 23 #include "TextLCD.h"
simon 1:ac48b187213c 24 #include "mbed.h"
simon 1:ac48b187213c 25
simon 1:ac48b187213c 26 TextLCD::TextLCD(PinName rs, PinName e, PinName d0, PinName d1,
simon 1:ac48b187213c 27 PinName d2, PinName d3, LCDType type) : _rs(rs),
simon 1:ac48b187213c 28 _e(e), _d(d0, d1, d2, d3),
simon 1:ac48b187213c 29 _type(type) {
simon 1:ac48b187213c 30
simon 1:ac48b187213c 31 _e = 1;
simon 1:ac48b187213c 32 _rs = 0; // command mode
simon 1:ac48b187213c 33
simon 1:ac48b187213c 34 wait(0.015); // Wait 15ms to ensure powered up
simon 1:ac48b187213c 35
simon 1:ac48b187213c 36 // send "Display Settings" 3 times (Only top nibble of 0x30 as we've got 4-bit bus)
simon 1:ac48b187213c 37 for (int i=0; i<3; i++) {
simon 1:ac48b187213c 38 writeByte(0x3);
simon 1:ac48b187213c 39 wait(0.00164); // this command takes 1.64ms, so wait for it
simon 1:ac48b187213c 40 }
simon 1:ac48b187213c 41 writeByte(0x2); // 4-bit mode
simon 1:ac48b187213c 42 wait(0.000040f); // most instructions take 40us
simon 1:ac48b187213c 43
simon 1:ac48b187213c 44 writeCommand(0x28); // Function set 001 BW N F - -
simon 1:ac48b187213c 45 writeCommand(0x0C);
simon 1:ac48b187213c 46 writeCommand(0x6); // Cursor Direction and Display Shift : 0000 01 CD S (CD 0-left, 1-right S(hift) 0-no, 1-yes
simon 1:ac48b187213c 47 cls();
simon 1:ac48b187213c 48 }
simon 1:ac48b187213c 49
simon 1:ac48b187213c 50 void TextLCD::character(int column, int row, int c) {
simon 1:ac48b187213c 51 int a = address(column, row);
simon 1:ac48b187213c 52 writeCommand(a);
simon 1:ac48b187213c 53 writeData(c);
simon 1:ac48b187213c 54 }
simon 1:ac48b187213c 55
simon 1:ac48b187213c 56 void TextLCD::cls() {
simon 1:ac48b187213c 57 writeCommand(0x01); // cls, and set cursor to 0
simon 1:ac48b187213c 58 wait(0.00164f); // This command takes 1.64 ms
simon 1:ac48b187213c 59 locate(0, 0);
simon 1:ac48b187213c 60 }
simon 1:ac48b187213c 61
simon 1:ac48b187213c 62 void TextLCD::locate(int column, int row) {
simon 1:ac48b187213c 63 _column = column;
simon 1:ac48b187213c 64 _row = row;
simon 1:ac48b187213c 65 }
simon 1:ac48b187213c 66
simon 1:ac48b187213c 67 int TextLCD::_putc(int value) {
simon 1:ac48b187213c 68 if (value == '\n') {
simon 1:ac48b187213c 69 _column = 0;
simon 1:ac48b187213c 70 _row++;
simon 1:ac48b187213c 71 if (_row >= rows()) {
simon 1:ac48b187213c 72 _row = 0;
simon 1:ac48b187213c 73 }
simon 1:ac48b187213c 74 } else {
simon 1:ac48b187213c 75 character(_column, _row, value);
simon 1:ac48b187213c 76 _column++;
simon 1:ac48b187213c 77 if (_column >= columns()) {
simon 1:ac48b187213c 78 _column = 0;
simon 1:ac48b187213c 79 _row++;
simon 1:ac48b187213c 80 if (_row >= rows()) {
simon 1:ac48b187213c 81 _row = 0;
simon 1:ac48b187213c 82 }
simon 1:ac48b187213c 83 }
simon 1:ac48b187213c 84 }
simon 1:ac48b187213c 85 return value;
simon 1:ac48b187213c 86 }
simon 1:ac48b187213c 87
simon 1:ac48b187213c 88 int TextLCD::_getc() {
simon 1:ac48b187213c 89 return -1;
simon 1:ac48b187213c 90 }
simon 1:ac48b187213c 91
simon 1:ac48b187213c 92 void TextLCD::writeByte(int value) {
simon 1:ac48b187213c 93 _d = value >> 4;
simon 1:ac48b187213c 94 wait(0.000040f); // most instructions take 40us
simon 1:ac48b187213c 95 _e = 0;
simon 1:ac48b187213c 96 wait(0.000040f);
simon 1:ac48b187213c 97 _e = 1;
simon 1:ac48b187213c 98 _d = value >> 0;
simon 1:ac48b187213c 99 wait(0.000040f);
simon 1:ac48b187213c 100 _e = 0;
simon 1:ac48b187213c 101 wait(0.000040f); // most instructions take 40us
simon 1:ac48b187213c 102 _e = 1;
simon 1:ac48b187213c 103 }
simon 1:ac48b187213c 104
simon 1:ac48b187213c 105 void TextLCD::writeCommand(int command) {
simon 1:ac48b187213c 106 _rs = 0;
simon 1:ac48b187213c 107 writeByte(command);
simon 1:ac48b187213c 108 }
simon 1:ac48b187213c 109
simon 1:ac48b187213c 110 void TextLCD::writeData(int data) {
simon 1:ac48b187213c 111 _rs = 1;
simon 1:ac48b187213c 112 writeByte(data);
simon 1:ac48b187213c 113 }
simon 1:ac48b187213c 114
simon 1:ac48b187213c 115 int TextLCD::address(int column, int row) {
simon 1:ac48b187213c 116 switch (_type) {
simon 1:ac48b187213c 117 case LCD20x4:
simon 1:ac48b187213c 118 switch (row) {
simon 1:ac48b187213c 119 case 0:
simon 1:ac48b187213c 120 return 0x80 + column;
simon 1:ac48b187213c 121 case 1:
simon 1:ac48b187213c 122 return 0xc0 + column;
simon 1:ac48b187213c 123 case 2:
simon 1:ac48b187213c 124 return 0x94 + column;
simon 1:ac48b187213c 125 case 3:
simon 1:ac48b187213c 126 return 0xd4 + column;
simon 1:ac48b187213c 127 }
simon 1:ac48b187213c 128 case LCD16x2B:
simon 1:ac48b187213c 129 return 0x80 + (row * 0x40) + column;
simon 1:ac48b187213c 130 case LCD16x2:
simon 1:ac48b187213c 131 case LCD20x2:
simon 1:ac48b187213c 132 default:
simon 1:ac48b187213c 133 return 0x80 + (row * 40) + column;
simon 1:ac48b187213c 134 }
simon 1:ac48b187213c 135 }
simon 1:ac48b187213c 136
simon 1:ac48b187213c 137 int TextLCD::columns() {
simon 1:ac48b187213c 138 switch (_type) {
simon 1:ac48b187213c 139 case LCD20x4:
simon 1:ac48b187213c 140 case LCD20x2:
simon 1:ac48b187213c 141 return 20;
simon 1:ac48b187213c 142 case LCD16x2:
simon 1:ac48b187213c 143 case LCD16x2B:
simon 1:ac48b187213c 144 default:
simon 1:ac48b187213c 145 return 16;
simon 1:ac48b187213c 146 }
simon 1:ac48b187213c 147 }
simon 1:ac48b187213c 148
simon 1:ac48b187213c 149 int TextLCD::rows() {
simon 1:ac48b187213c 150 switch (_type) {
simon 1:ac48b187213c 151 case LCD20x4:
simon 1:ac48b187213c 152 return 4;
simon 1:ac48b187213c 153 case LCD16x2:
simon 1:ac48b187213c 154 case LCD16x2B:
simon 1:ac48b187213c 155 case LCD20x2:
simon 1:ac48b187213c 156 default:
simon 1:ac48b187213c 157 return 2;
simon 1:ac48b187213c 158 }
simon 1:ac48b187213c 159 }