character LCD module to I2C adapter http://mbed.org/users/okini3939/notebook/i2c-lcd-library/
Dependents: i2clcd_lib WeatherPlatform_20110408 WeatherPlatform WeatherStation ... more
I2CLCD.cpp@2:bc4583ce560e, 2011-02-27 (annotated)
- Committer:
- okini3939
- Date:
- Sun Feb 27 14:28:40 2011 +0000
- Revision:
- 2:bc4583ce560e
- Parent:
- 1:bf21aa3f7cdc
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 | */ |
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 | } |