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
I2CLCD.cpp@3:0c291dbc7acc, 2015-02-23 (annotated)
- 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?
User | Revision | Line number | New 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 | } |