character LCD module to I2C adapter Reference http://mbed.org/users/okini3939/notebook/i2c-lcd-library/

Dependents:   JRO_CR2 frdm_test JRO_DDSv2 JRO_DDSv2_rev2019

Fork of I2CLCD by Suga koubou

Committer:
okini3939
Date:
Sun Feb 27 14:28:40 2011 +0000
Revision:
2:bc4583ce560e
Parent:
1:bf21aa3f7cdc
Child:
3:0c291dbc7acc

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:b069b7027af2 1 /*
okini3939 1:bf21aa3f7cdc 2 * mbed library for I2C LCD
okini3939 2:bc4583ce560e 3 * Copyright (c) 2011 Hiroshi Suga
okini3939 0:b069b7027af2 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 1:bf21aa3f7cdc 5 *
okini3939 2:bc4583ce560e 6 * This product includes:
okini3939 1:bf21aa3f7cdc 7 * mbed TextLCD Library, for a 4-bit LCD based on HD44780
okini3939 1:bf21aa3f7cdc 8 * Copyright (c) 2007-2010, sford
okini3939 0:b069b7027af2 9 */
okini3939 0:b069b7027af2 10
okini3939 2:bc4583ce560e 11 /** @file I2CLCD.cpp
okini3939 2:bc4583ce560e 12 * @brief I2C LCD library (mbed Phone Platform)
okini3939 2:bc4583ce560e 13 */
okini3939 2:bc4583ce560e 14
okini3939 0:b069b7027af2 15 #include "mbed.h"
okini3939 0:b069b7027af2 16 #include "I2CLCD.h"
okini3939 0:b069b7027af2 17
okini3939 2:bc4583ce560e 18 /**
okini3939 2:bc4583ce560e 19 * @brief put character to LCD
okini3939 2:bc4583ce560e 20 * @param value ASCII character code
okini3939 2:bc4583ce560e 21 * @retval value
okini3939 2:bc4583ce560e 22 */
okini3939 0:b069b7027af2 23 int I2CLCD::_putc (int value) {
okini3939 0:b069b7027af2 24
okini3939 0:b069b7027af2 25 if (value == '\n') {
okini3939 0:b069b7027af2 26 x = 0;
okini3939 0:b069b7027af2 27 y ++;
okini3939 0:b069b7027af2 28 if (y >= rows()) {
okini3939 0:b069b7027af2 29 y = 0;
okini3939 0:b069b7027af2 30 lcd_out(address(x, y), 0);
okini3939 0:b069b7027af2 31 }
okini3939 0:b069b7027af2 32
okini3939 0:b069b7027af2 33 } else {
okini3939 0:b069b7027af2 34
okini3939 0:b069b7027af2 35 lcd_out(address(x, y), 0);
okini3939 0:b069b7027af2 36 lcd_out(value, 1);
okini3939 0:b069b7027af2 37 x ++;
okini3939 0:b069b7027af2 38 if (x >= cols()) {
okini3939 0:b069b7027af2 39 x = 0;
okini3939 0:b069b7027af2 40 y ++;
okini3939 0:b069b7027af2 41 if (y >= rows()) {
okini3939 0:b069b7027af2 42 y = 0;
okini3939 0:b069b7027af2 43 lcd_out(address(x, y), 0);
okini3939 0:b069b7027af2 44 }
okini3939 0:b069b7027af2 45 }
okini3939 0:b069b7027af2 46 }
okini3939 0:b069b7027af2 47
okini3939 0:b069b7027af2 48 return value;
okini3939 0:b069b7027af2 49 }
okini3939 0:b069b7027af2 50
okini3939 2:bc4583ce560e 51 /**
okini3939 2:bc4583ce560e 52 * @brief get character from LCD
okini3939 2:bc4583ce560e 53 * @retval ASCII character code
okini3939 2:bc4583ce560e 54 */
okini3939 0:b069b7027af2 55 int I2CLCD::_getc() {
okini3939 0:b069b7027af2 56 return lcd_in(0);
okini3939 0:b069b7027af2 57 }
okini3939 0:b069b7027af2 58
okini3939 0:b069b7027af2 59
okini3939 2:bc4583ce560e 60 /**
okini3939 2:bc4583ce560e 61 * @brief put character to LCD
okini3939 2:bc4583ce560e 62 * @param p_sda port of I2C SDA
okini3939 2:bc4583ce560e 63 * @param p_scl port of I2C SCL
okini3939 2:bc4583ce560e 64 * @param p_i2caddr I2C address
okini3939 2:bc4583ce560e 65 */
okini3939 2:bc4583ce560e 66 I2CLCD::I2CLCD (PinName p_sda, PinName p_scl, int p_i2caddr, I2CLCDType p_type, I2CLCDConfig p_config) : i2c(p_sda, p_scl) {
okini3939 2:bc4583ce560e 67 init(p_i2caddr, p_type, p_config);
okini3939 0:b069b7027af2 68 }
okini3939 0:b069b7027af2 69
okini3939 2:bc4583ce560e 70 /**
okini3939 2:bc4583ce560e 71 * @brief put character to LCD
okini3939 2:bc4583ce560e 72 * @param p_i2c instance of I2C class
okini3939 2:bc4583ce560e 73 * @param p_i2caddr I2C address
okini3939 2:bc4583ce560e 74 */
okini3939 2:bc4583ce560e 75 I2CLCD::I2CLCD (I2C& p_i2c, int p_i2caddr, I2CLCDType p_type, I2CLCDConfig p_config) : i2c(p_i2c) {
okini3939 2:bc4583ce560e 76 init(p_i2caddr, p_type, p_config);
okini3939 0:b069b7027af2 77 }
okini3939 0:b069b7027af2 78
okini3939 2:bc4583ce560e 79 void I2CLCD::init (int p_i2caddr, I2CLCDType p_type, I2CLCDConfig p_config) {
okini3939 0:b069b7027af2 80
okini3939 2:bc4583ce560e 81 i2caddr = p_i2caddr;
okini3939 0:b069b7027af2 82 type = p_type;
okini3939 0:b069b7027af2 83
okini3939 0:b069b7027af2 84 lcd_cfg(p_config);
okini3939 0:b069b7027af2 85
okini3939 2:bc4583ce560e 86 wait_ms(500);
okini3939 0:b069b7027af2 87 lcd_out(0x30, 0);
okini3939 2:bc4583ce560e 88 wait_ms(5);
okini3939 0:b069b7027af2 89 lcd_out(0x30, 0);
okini3939 2:bc4583ce560e 90 wait_ms(2);
okini3939 0:b069b7027af2 91 lcd_out(0x30, 0);
okini3939 0:b069b7027af2 92
okini3939 0:b069b7027af2 93 lcd_out(0x38, 0); // func
okini3939 0:b069b7027af2 94 lcd_out(0x10, 0); // shift
okini3939 0:b069b7027af2 95 lcd_out(0x0c, 0); // display
okini3939 0:b069b7027af2 96 lcd_out(0x06, 0); // entry mode
okini3939 0:b069b7027af2 97 cls();
okini3939 0:b069b7027af2 98 }
okini3939 0:b069b7027af2 99
okini3939 0:b069b7027af2 100 void I2CLCD::cls() {
okini3939 0:b069b7027af2 101 lcd_out(0x01, 0); // clear
okini3939 2:bc4583ce560e 102 wait_ms(2);
okini3939 0:b069b7027af2 103 lcd_out(0x02, 0); // home
okini3939 2:bc4583ce560e 104 wait_ms(2);
okini3939 0:b069b7027af2 105 locate(0, 0);
okini3939 0:b069b7027af2 106 }
okini3939 0:b069b7027af2 107
okini3939 0:b069b7027af2 108 void I2CLCD::locate(int col, int row) {
okini3939 0:b069b7027af2 109 x = col;
okini3939 0:b069b7027af2 110 y = row;
okini3939 0:b069b7027af2 111 lcd_out(address(x, y), 0);
okini3939 0:b069b7027af2 112 }
okini3939 0:b069b7027af2 113
okini3939 0:b069b7027af2 114 int I2CLCD::address(int col, int row) {
okini3939 0:b069b7027af2 115 switch (type) {
okini3939 0:b069b7027af2 116 case LCD16x1:
okini3939 0:b069b7027af2 117 return (col < 8 ? 0x80 : 0xc0) + (col & 0x03);
okini3939 0:b069b7027af2 118 case LCD16x4:
okini3939 0:b069b7027af2 119 case LCD20x4:
okini3939 0:b069b7027af2 120 switch (row) {
okini3939 0:b069b7027af2 121 case 0:
okini3939 0:b069b7027af2 122 return 0x80 + col;
okini3939 0:b069b7027af2 123 case 1:
okini3939 0:b069b7027af2 124 return 0xc0 + col;
okini3939 0:b069b7027af2 125 case 2:
okini3939 0:b069b7027af2 126 return 0x94 + col;
okini3939 0:b069b7027af2 127 case 3:
okini3939 0:b069b7027af2 128 return 0xd4 + col;
okini3939 0:b069b7027af2 129 }
okini3939 0:b069b7027af2 130 case LCD16x2B:
okini3939 0:b069b7027af2 131 return 0x80 + (row * 40) + col;
okini3939 0:b069b7027af2 132 case LCD8x2:
okini3939 0:b069b7027af2 133 case LCD16x2:
okini3939 0:b069b7027af2 134 case LCD20x2:
okini3939 0:b069b7027af2 135 default:
okini3939 0:b069b7027af2 136 return 0x80 + (row * 0x40) + col;
okini3939 0:b069b7027af2 137 }
okini3939 0:b069b7027af2 138 }
okini3939 0:b069b7027af2 139
okini3939 0:b069b7027af2 140 int I2CLCD::cols() {
okini3939 0:b069b7027af2 141 switch (type) {
okini3939 0:b069b7027af2 142 case LCD8x2:
okini3939 0:b069b7027af2 143 return 8;
okini3939 0:b069b7027af2 144 case LCD20x4:
okini3939 0:b069b7027af2 145 case LCD20x2:
okini3939 0:b069b7027af2 146 return 20;
okini3939 0:b069b7027af2 147 case LCD16x1:
okini3939 0:b069b7027af2 148 case LCD16x2:
okini3939 0:b069b7027af2 149 case LCD16x2B:
okini3939 0:b069b7027af2 150 case LCD16x4:
okini3939 0:b069b7027af2 151 default:
okini3939 0:b069b7027af2 152 return 16;
okini3939 0:b069b7027af2 153 }
okini3939 0:b069b7027af2 154 }
okini3939 0:b069b7027af2 155
okini3939 0:b069b7027af2 156 int I2CLCD::rows() {
okini3939 0:b069b7027af2 157 switch (type) {
okini3939 0:b069b7027af2 158 case LCD16x1:
okini3939 0:b069b7027af2 159 return 1;
okini3939 0:b069b7027af2 160 case LCD16x4:
okini3939 0:b069b7027af2 161 case LCD20x4:
okini3939 0:b069b7027af2 162 return 4;
okini3939 0:b069b7027af2 163 case LCD8x2:
okini3939 0:b069b7027af2 164 case LCD16x2:
okini3939 0:b069b7027af2 165 case LCD16x2B:
okini3939 0:b069b7027af2 166 case LCD20x2:
okini3939 0:b069b7027af2 167 default:
okini3939 0:b069b7027af2 168 return 2;
okini3939 0:b069b7027af2 169 }
okini3939 0:b069b7027af2 170 }
okini3939 0:b069b7027af2 171
okini3939 0:b069b7027af2 172 void I2CLCD::lcd_cfg (I2CLCDConfig cfg) {
okini3939 0:b069b7027af2 173 i2c.start();
okini3939 2:bc4583ce560e 174 i2c.write(i2caddr);
okini3939 0:b069b7027af2 175 i2c.write(LCDCFG_ENABLE | (cfg & 0x1f));
okini3939 0:b069b7027af2 176 i2c.stop();
okini3939 0:b069b7027af2 177 }
okini3939 0:b069b7027af2 178
okini3939 2:bc4583ce560e 179 void I2CLCD::lcd_out (char dat, char rs) {
okini3939 0:b069b7027af2 180 i2c.start();
okini3939 2:bc4583ce560e 181 i2c.write(i2caddr);
okini3939 0:b069b7027af2 182 i2c.write(rs ? 0x40 : 0);
okini3939 0:b069b7027af2 183 i2c.write(dat);
okini3939 0:b069b7027af2 184 i2c.stop();
okini3939 0:b069b7027af2 185 }
okini3939 0:b069b7027af2 186
okini3939 2:bc4583ce560e 187 char I2CLCD::lcd_in (char rs) {
okini3939 2:bc4583ce560e 188 char i;
okini3939 0:b069b7027af2 189
okini3939 0:b069b7027af2 190 i2c.start();
okini3939 2:bc4583ce560e 191 i2c.write(i2caddr);
okini3939 0:b069b7027af2 192 i2c.write(rs ? 0x40 : 0);
okini3939 0:b069b7027af2 193
okini3939 0:b069b7027af2 194 i2c.start();
okini3939 2:bc4583ce560e 195 i2c.write(i2caddr | 0x01);
okini3939 0:b069b7027af2 196 i = i2c.read(0);
okini3939 0:b069b7027af2 197 i2c.stop();
okini3939 0:b069b7027af2 198
okini3939 0:b069b7027af2 199 return i;
okini3939 0:b069b7027af2 200 }