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:
miguelcordero191
Date:
Mon Feb 23 20:37:14 2015 +0000
Revision:
3:0c291dbc7acc
Parent:
2:bc4583ce560e
Some comments were added

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 */
miguelcordero191 3:0c291dbc7acc 23
miguelcordero191 3:0c291dbc7acc 24 void I2CLCD::printf(const char *text, int x, int y)
miguelcordero191 3:0c291dbc7acc 25 {
miguelcordero191 3:0c291dbc7acc 26 int n, len;
miguelcordero191 3:0c291dbc7acc 27
miguelcordero191 3:0c291dbc7acc 28 len = strlen(text);
miguelcordero191 3:0c291dbc7acc 29
miguelcordero191 3:0c291dbc7acc 30 i2c.start();
miguelcordero191 3:0c291dbc7acc 31 i2c.write(i2caddr);
miguelcordero191 3:0c291dbc7acc 32 i2c.write(0x00); //Comsend
miguelcordero191 3:0c291dbc7acc 33 i2c.write(address(x,y));
miguelcordero191 3:0c291dbc7acc 34 i2c.stop();
miguelcordero191 3:0c291dbc7acc 35
miguelcordero191 3:0c291dbc7acc 36 wait_us(200);
miguelcordero191 3:0c291dbc7acc 37
miguelcordero191 3:0c291dbc7acc 38 i2c.start();
miguelcordero191 3:0c291dbc7acc 39 i2c.write(i2caddr);
miguelcordero191 3:0c291dbc7acc 40 i2c.write(0x40); //Datasend
miguelcordero191 3:0c291dbc7acc 41 for(n=0; n<len; n++){
miguelcordero191 3:0c291dbc7acc 42 i2c.write(*text);
miguelcordero191 3:0c291dbc7acc 43 ++text;
miguelcordero191 3:0c291dbc7acc 44 }
miguelcordero191 3:0c291dbc7acc 45 i2c.stop();
miguelcordero191 3:0c291dbc7acc 46 wait_us(200);
miguelcordero191 3:0c291dbc7acc 47 }
miguelcordero191 3:0c291dbc7acc 48
okini3939 0:b069b7027af2 49 int I2CLCD::_putc (int value) {
okini3939 0:b069b7027af2 50
okini3939 0:b069b7027af2 51 if (value == '\n') {
okini3939 0:b069b7027af2 52 x = 0;
okini3939 0:b069b7027af2 53 y ++;
okini3939 0:b069b7027af2 54 if (y >= rows()) {
okini3939 0:b069b7027af2 55 y = 0;
okini3939 0:b069b7027af2 56 lcd_out(address(x, y), 0);
okini3939 0:b069b7027af2 57 }
okini3939 0:b069b7027af2 58
okini3939 0:b069b7027af2 59 } else {
okini3939 0:b069b7027af2 60
okini3939 0:b069b7027af2 61 lcd_out(address(x, y), 0);
okini3939 0:b069b7027af2 62 lcd_out(value, 1);
okini3939 0:b069b7027af2 63 x ++;
okini3939 0:b069b7027af2 64 if (x >= cols()) {
okini3939 0:b069b7027af2 65 x = 0;
okini3939 0:b069b7027af2 66 y ++;
okini3939 0:b069b7027af2 67 if (y >= rows()) {
okini3939 0:b069b7027af2 68 y = 0;
okini3939 0:b069b7027af2 69 lcd_out(address(x, y), 0);
okini3939 0:b069b7027af2 70 }
okini3939 0:b069b7027af2 71 }
okini3939 0:b069b7027af2 72 }
okini3939 0:b069b7027af2 73
okini3939 0:b069b7027af2 74 return value;
okini3939 0:b069b7027af2 75 }
okini3939 0:b069b7027af2 76
okini3939 2:bc4583ce560e 77 /**
okini3939 2:bc4583ce560e 78 * @brief get character from LCD
okini3939 2:bc4583ce560e 79 * @retval ASCII character code
okini3939 2:bc4583ce560e 80 */
okini3939 0:b069b7027af2 81 int I2CLCD::_getc() {
okini3939 0:b069b7027af2 82 return lcd_in(0);
okini3939 0:b069b7027af2 83 }
okini3939 0:b069b7027af2 84
okini3939 0:b069b7027af2 85
okini3939 2:bc4583ce560e 86 /**
okini3939 2:bc4583ce560e 87 * @brief put character to LCD
okini3939 2:bc4583ce560e 88 * @param p_sda port of I2C SDA
okini3939 2:bc4583ce560e 89 * @param p_scl port of I2C SCL
okini3939 2:bc4583ce560e 90 * @param p_i2caddr I2C address
okini3939 2:bc4583ce560e 91 */
okini3939 2:bc4583ce560e 92 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 93 init(p_i2caddr, p_type, p_config);
okini3939 0:b069b7027af2 94 }
okini3939 0:b069b7027af2 95
okini3939 2:bc4583ce560e 96 /**
okini3939 2:bc4583ce560e 97 * @brief put character to LCD
okini3939 2:bc4583ce560e 98 * @param p_i2c instance of I2C class
okini3939 2:bc4583ce560e 99 * @param p_i2caddr I2C address
okini3939 2:bc4583ce560e 100 */
okini3939 2:bc4583ce560e 101 I2CLCD::I2CLCD (I2C& p_i2c, int p_i2caddr, I2CLCDType p_type, I2CLCDConfig p_config) : i2c(p_i2c) {
okini3939 2:bc4583ce560e 102 init(p_i2caddr, p_type, p_config);
okini3939 0:b069b7027af2 103 }
okini3939 0:b069b7027af2 104
okini3939 2:bc4583ce560e 105 void I2CLCD::init (int p_i2caddr, I2CLCDType p_type, I2CLCDConfig p_config) {
okini3939 0:b069b7027af2 106
okini3939 2:bc4583ce560e 107 i2caddr = p_i2caddr;
okini3939 0:b069b7027af2 108 type = p_type;
miguelcordero191 3:0c291dbc7acc 109 /*
miguelcordero191 3:0c291dbc7acc 110 #ifndef LCD_NHD_C022BiZ
miguelcordero191 3:0c291dbc7acc 111 //lcd_cfg(p_config);
miguelcordero191 3:0c291dbc7acc 112 #endif
okini3939 2:bc4583ce560e 113 wait_ms(500);
okini3939 0:b069b7027af2 114 lcd_out(0x30, 0);
miguelcordero191 3:0c291dbc7acc 115 wait_us(50);
okini3939 0:b069b7027af2 116 lcd_out(0x30, 0);
miguelcordero191 3:0c291dbc7acc 117 wait_us(50);
miguelcordero191 3:0c291dbc7acc 118 lcd_out(0x39, 0);
miguelcordero191 3:0c291dbc7acc 119 wait_us(50);
miguelcordero191 3:0c291dbc7acc 120 lcd_out(0x14, 0); //Bias set
miguelcordero191 3:0c291dbc7acc 121 wait_us(50);
miguelcordero191 3:0c291dbc7acc 122 lcd_out(0x78, 0); //Constrast set
miguelcordero191 3:0c291dbc7acc 123 wait_us(50);
miguelcordero191 3:0c291dbc7acc 124 lcd_out(0x5E, 0); //Power/ Icon/ Constrast control
miguelcordero191 3:0c291dbc7acc 125 wait_us(50);
miguelcordero191 3:0c291dbc7acc 126 lcd_out(0x6A, 0); //Follower control
miguelcordero191 3:0c291dbc7acc 127 wait_ms(300);
miguelcordero191 3:0c291dbc7acc 128
miguelcordero191 3:0c291dbc7acc 129 lcd_out(INST_FUNC, 0); // func
miguelcordero191 3:0c291dbc7acc 130 wait_us(50);
miguelcordero191 3:0c291dbc7acc 131 lcd_out(INST_SHIFT, 0); // shift
miguelcordero191 3:0c291dbc7acc 132 wait_us(50);
miguelcordero191 3:0c291dbc7acc 133 lcd_out(INST_DISPLAY, 0); // display
miguelcordero191 3:0c291dbc7acc 134 wait_us(50);
miguelcordero191 3:0c291dbc7acc 135 lcd_out(INST_CLEAR, 0); // clear
miguelcordero191 3:0c291dbc7acc 136 wait_ms(5);
miguelcordero191 3:0c291dbc7acc 137 lcd_out(INST_ENTRY_MODE, 0); // entry mode
miguelcordero191 3:0c291dbc7acc 138 wait_us(50);
okini3939 0:b069b7027af2 139 cls();
miguelcordero191 3:0c291dbc7acc 140 wait_us(50);
miguelcordero191 3:0c291dbc7acc 141 */
miguelcordero191 3:0c291dbc7acc 142
miguelcordero191 3:0c291dbc7acc 143 i2c.frequency(100000);
miguelcordero191 3:0c291dbc7acc 144 wait_ms(100);
miguelcordero191 3:0c291dbc7acc 145 i2c.start();
miguelcordero191 3:0c291dbc7acc 146 i2c.write(i2caddr);
miguelcordero191 3:0c291dbc7acc 147 i2c.write(0x00); //Comsend
miguelcordero191 3:0c291dbc7acc 148 i2c.write(0x38);
miguelcordero191 3:0c291dbc7acc 149 wait_ms(10);
miguelcordero191 3:0c291dbc7acc 150 i2c.write(0x39);
miguelcordero191 3:0c291dbc7acc 151 wait_ms(10);
miguelcordero191 3:0c291dbc7acc 152 i2c.write(0x14);
miguelcordero191 3:0c291dbc7acc 153 i2c.write(0x78);
miguelcordero191 3:0c291dbc7acc 154 i2c.write(0x5E);
miguelcordero191 3:0c291dbc7acc 155 i2c.write(0x6D);
miguelcordero191 3:0c291dbc7acc 156 i2c.write(0x0C);
miguelcordero191 3:0c291dbc7acc 157 i2c.write(0x01);
miguelcordero191 3:0c291dbc7acc 158 i2c.write(0x06);
miguelcordero191 3:0c291dbc7acc 159 wait_ms(10);
miguelcordero191 3:0c291dbc7acc 160 i2c.stop();
okini3939 0:b069b7027af2 161 }
okini3939 0:b069b7027af2 162
okini3939 0:b069b7027af2 163 void I2CLCD::cls() {
okini3939 0:b069b7027af2 164 lcd_out(0x01, 0); // clear
okini3939 2:bc4583ce560e 165 wait_ms(2);
okini3939 0:b069b7027af2 166 lcd_out(0x02, 0); // home
okini3939 2:bc4583ce560e 167 wait_ms(2);
okini3939 0:b069b7027af2 168 locate(0, 0);
okini3939 0:b069b7027af2 169 }
okini3939 0:b069b7027af2 170
okini3939 0:b069b7027af2 171 void I2CLCD::locate(int col, int row) {
okini3939 0:b069b7027af2 172 x = col;
okini3939 0:b069b7027af2 173 y = row;
okini3939 0:b069b7027af2 174 lcd_out(address(x, y), 0);
okini3939 0:b069b7027af2 175 }
okini3939 0:b069b7027af2 176
okini3939 0:b069b7027af2 177 int I2CLCD::address(int col, int row) {
okini3939 0:b069b7027af2 178 switch (type) {
okini3939 0:b069b7027af2 179 case LCD16x1:
okini3939 0:b069b7027af2 180 return (col < 8 ? 0x80 : 0xc0) + (col & 0x03);
okini3939 0:b069b7027af2 181 case LCD16x4:
okini3939 0:b069b7027af2 182 case LCD20x4:
okini3939 0:b069b7027af2 183 switch (row) {
okini3939 0:b069b7027af2 184 case 0:
okini3939 0:b069b7027af2 185 return 0x80 + col;
okini3939 0:b069b7027af2 186 case 1:
okini3939 0:b069b7027af2 187 return 0xc0 + col;
okini3939 0:b069b7027af2 188 case 2:
okini3939 0:b069b7027af2 189 return 0x94 + col;
okini3939 0:b069b7027af2 190 case 3:
okini3939 0:b069b7027af2 191 return 0xd4 + col;
okini3939 0:b069b7027af2 192 }
okini3939 0:b069b7027af2 193 case LCD16x2B:
okini3939 0:b069b7027af2 194 return 0x80 + (row * 40) + col;
okini3939 0:b069b7027af2 195 case LCD8x2:
okini3939 0:b069b7027af2 196 case LCD16x2:
okini3939 0:b069b7027af2 197 case LCD20x2:
okini3939 0:b069b7027af2 198 default:
okini3939 0:b069b7027af2 199 return 0x80 + (row * 0x40) + col;
okini3939 0:b069b7027af2 200 }
okini3939 0:b069b7027af2 201 }
okini3939 0:b069b7027af2 202
okini3939 0:b069b7027af2 203 int I2CLCD::cols() {
okini3939 0:b069b7027af2 204 switch (type) {
okini3939 0:b069b7027af2 205 case LCD8x2:
okini3939 0:b069b7027af2 206 return 8;
okini3939 0:b069b7027af2 207 case LCD20x4:
okini3939 0:b069b7027af2 208 case LCD20x2:
okini3939 0:b069b7027af2 209 return 20;
okini3939 0:b069b7027af2 210 case LCD16x1:
okini3939 0:b069b7027af2 211 case LCD16x2:
okini3939 0:b069b7027af2 212 case LCD16x2B:
okini3939 0:b069b7027af2 213 case LCD16x4:
okini3939 0:b069b7027af2 214 default:
okini3939 0:b069b7027af2 215 return 16;
okini3939 0:b069b7027af2 216 }
okini3939 0:b069b7027af2 217 }
okini3939 0:b069b7027af2 218
okini3939 0:b069b7027af2 219 int I2CLCD::rows() {
okini3939 0:b069b7027af2 220 switch (type) {
okini3939 0:b069b7027af2 221 case LCD16x1:
okini3939 0:b069b7027af2 222 return 1;
okini3939 0:b069b7027af2 223 case LCD16x4:
okini3939 0:b069b7027af2 224 case LCD20x4:
okini3939 0:b069b7027af2 225 return 4;
okini3939 0:b069b7027af2 226 case LCD8x2:
okini3939 0:b069b7027af2 227 case LCD16x2:
okini3939 0:b069b7027af2 228 case LCD16x2B:
okini3939 0:b069b7027af2 229 case LCD20x2:
okini3939 0:b069b7027af2 230 default:
okini3939 0:b069b7027af2 231 return 2;
okini3939 0:b069b7027af2 232 }
okini3939 0:b069b7027af2 233 }
okini3939 0:b069b7027af2 234
okini3939 0:b069b7027af2 235 void I2CLCD::lcd_cfg (I2CLCDConfig cfg) {
okini3939 0:b069b7027af2 236 i2c.start();
okini3939 2:bc4583ce560e 237 i2c.write(i2caddr);
okini3939 0:b069b7027af2 238 i2c.write(LCDCFG_ENABLE | (cfg & 0x1f));
okini3939 0:b069b7027af2 239 i2c.stop();
okini3939 0:b069b7027af2 240 }
okini3939 0:b069b7027af2 241
miguelcordero191 3:0c291dbc7acc 242 void I2CLCD::lcd_out (char dat, char is_value) {
miguelcordero191 3:0c291dbc7acc 243
okini3939 0:b069b7027af2 244 i2c.start();
okini3939 2:bc4583ce560e 245 i2c.write(i2caddr);
miguelcordero191 3:0c291dbc7acc 246 i2c.write(is_value ? 0x40 : 0x00);
okini3939 0:b069b7027af2 247 i2c.write(dat);
okini3939 0:b069b7027af2 248 i2c.stop();
okini3939 0:b069b7027af2 249 }
okini3939 0:b069b7027af2 250
miguelcordero191 3:0c291dbc7acc 251 char I2CLCD::lcd_in (char is_value) {
okini3939 2:bc4583ce560e 252 char i;
okini3939 0:b069b7027af2 253
okini3939 0:b069b7027af2 254 i2c.start();
okini3939 2:bc4583ce560e 255 i2c.write(i2caddr);
miguelcordero191 3:0c291dbc7acc 256 i2c.write(is_value ? 0x40 : 0x00);
okini3939 0:b069b7027af2 257 i2c.start();
okini3939 2:bc4583ce560e 258 i2c.write(i2caddr | 0x01);
okini3939 0:b069b7027af2 259 i = i2c.read(0);
okini3939 0:b069b7027af2 260 i2c.stop();
okini3939 0:b069b7027af2 261
okini3939 0:b069b7027af2 262 return i;
okini3939 0:b069b7027af2 263 }