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@0:b069b7027af2, 2010-10-14 (annotated)
- Committer:
- okini3939
- Date:
- Thu Oct 14 14:45:30 2010 +0000
- Revision:
- 0:b069b7027af2
- Child:
- 1:bf21aa3f7cdc
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 0:b069b7027af2 | 1 | /* |
okini3939 | 0:b069b7027af2 | 2 | * mbed library to use a I2C LCD |
okini3939 | 0:b069b7027af2 | 3 | * Copyright (c) 2010 Hiroshi Suga |
okini3939 | 0:b069b7027af2 | 4 | * Released under the MIT License: http://mbed.org/license/mit |
okini3939 | 0:b069b7027af2 | 5 | */ |
okini3939 | 0:b069b7027af2 | 6 | |
okini3939 | 0:b069b7027af2 | 7 | #include "mbed.h" |
okini3939 | 0:b069b7027af2 | 8 | #include "I2CLCD.h" |
okini3939 | 0:b069b7027af2 | 9 | |
okini3939 | 0:b069b7027af2 | 10 | #define I2CLCD_ADDR 0x7c |
okini3939 | 0:b069b7027af2 | 11 | |
okini3939 | 0:b069b7027af2 | 12 | |
okini3939 | 0:b069b7027af2 | 13 | int I2CLCD::_putc (int value) { |
okini3939 | 0:b069b7027af2 | 14 | |
okini3939 | 0:b069b7027af2 | 15 | if (value == '\n') { |
okini3939 | 0:b069b7027af2 | 16 | x = 0; |
okini3939 | 0:b069b7027af2 | 17 | y ++; |
okini3939 | 0:b069b7027af2 | 18 | if (y >= rows()) { |
okini3939 | 0:b069b7027af2 | 19 | y = 0; |
okini3939 | 0:b069b7027af2 | 20 | lcd_out(address(x, y), 0); |
okini3939 | 0:b069b7027af2 | 21 | } |
okini3939 | 0:b069b7027af2 | 22 | |
okini3939 | 0:b069b7027af2 | 23 | } else { |
okini3939 | 0:b069b7027af2 | 24 | |
okini3939 | 0:b069b7027af2 | 25 | lcd_out(address(x, y), 0); |
okini3939 | 0:b069b7027af2 | 26 | lcd_out(value, 1); |
okini3939 | 0:b069b7027af2 | 27 | x ++; |
okini3939 | 0:b069b7027af2 | 28 | if (x >= cols()) { |
okini3939 | 0:b069b7027af2 | 29 | x = 0; |
okini3939 | 0:b069b7027af2 | 30 | y ++; |
okini3939 | 0:b069b7027af2 | 31 | if (y >= rows()) { |
okini3939 | 0:b069b7027af2 | 32 | y = 0; |
okini3939 | 0:b069b7027af2 | 33 | lcd_out(address(x, y), 0); |
okini3939 | 0:b069b7027af2 | 34 | } |
okini3939 | 0:b069b7027af2 | 35 | } |
okini3939 | 0:b069b7027af2 | 36 | } |
okini3939 | 0:b069b7027af2 | 37 | |
okini3939 | 0:b069b7027af2 | 38 | return value; |
okini3939 | 0:b069b7027af2 | 39 | } |
okini3939 | 0:b069b7027af2 | 40 | |
okini3939 | 0:b069b7027af2 | 41 | int I2CLCD::_getc() { |
okini3939 | 0:b069b7027af2 | 42 | return lcd_in(0); |
okini3939 | 0:b069b7027af2 | 43 | } |
okini3939 | 0:b069b7027af2 | 44 | |
okini3939 | 0:b069b7027af2 | 45 | |
okini3939 | 0:b069b7027af2 | 46 | I2CLCD::I2CLCD (PinName p_sda, PinName p_scl, I2CLCDType p_type, I2CLCDConfig p_config) : i2c(p_sda, p_scl) { |
okini3939 | 0:b069b7027af2 | 47 | init(p_type, p_config); |
okini3939 | 0:b069b7027af2 | 48 | } |
okini3939 | 0:b069b7027af2 | 49 | |
okini3939 | 0:b069b7027af2 | 50 | I2CLCD::I2CLCD (I2C& p_i2c, I2CLCDType p_type, I2CLCDConfig p_config) : i2c(p_i2c) { |
okini3939 | 0:b069b7027af2 | 51 | init(p_type, p_config); |
okini3939 | 0:b069b7027af2 | 52 | } |
okini3939 | 0:b069b7027af2 | 53 | |
okini3939 | 0:b069b7027af2 | 54 | void I2CLCD::init (I2CLCDType p_type, I2CLCDConfig p_config) { |
okini3939 | 0:b069b7027af2 | 55 | |
okini3939 | 0:b069b7027af2 | 56 | type = p_type; |
okini3939 | 0:b069b7027af2 | 57 | |
okini3939 | 0:b069b7027af2 | 58 | lcd_cfg(p_config); |
okini3939 | 0:b069b7027af2 | 59 | |
okini3939 | 0:b069b7027af2 | 60 | wait(0.5); |
okini3939 | 0:b069b7027af2 | 61 | lcd_out(0x30, 0); |
okini3939 | 0:b069b7027af2 | 62 | wait(0.005); |
okini3939 | 0:b069b7027af2 | 63 | lcd_out(0x30, 0); |
okini3939 | 0:b069b7027af2 | 64 | wait(0.002); |
okini3939 | 0:b069b7027af2 | 65 | lcd_out(0x30, 0); |
okini3939 | 0:b069b7027af2 | 66 | |
okini3939 | 0:b069b7027af2 | 67 | lcd_out(0x38, 0); // func |
okini3939 | 0:b069b7027af2 | 68 | lcd_out(0x10, 0); // shift |
okini3939 | 0:b069b7027af2 | 69 | lcd_out(0x0c, 0); // display |
okini3939 | 0:b069b7027af2 | 70 | lcd_out(0x06, 0); // entry mode |
okini3939 | 0:b069b7027af2 | 71 | cls(); |
okini3939 | 0:b069b7027af2 | 72 | } |
okini3939 | 0:b069b7027af2 | 73 | |
okini3939 | 0:b069b7027af2 | 74 | void I2CLCD::cls() { |
okini3939 | 0:b069b7027af2 | 75 | lcd_out(0x01, 0); // clear |
okini3939 | 0:b069b7027af2 | 76 | wait(0.002); |
okini3939 | 0:b069b7027af2 | 77 | lcd_out(0x02, 0); // home |
okini3939 | 0:b069b7027af2 | 78 | wait(0.002); |
okini3939 | 0:b069b7027af2 | 79 | locate(0, 0); |
okini3939 | 0:b069b7027af2 | 80 | } |
okini3939 | 0:b069b7027af2 | 81 | |
okini3939 | 0:b069b7027af2 | 82 | void I2CLCD::locate(int col, int row) { |
okini3939 | 0:b069b7027af2 | 83 | x = col; |
okini3939 | 0:b069b7027af2 | 84 | y = row; |
okini3939 | 0:b069b7027af2 | 85 | lcd_out(address(x, y), 0); |
okini3939 | 0:b069b7027af2 | 86 | } |
okini3939 | 0:b069b7027af2 | 87 | |
okini3939 | 0:b069b7027af2 | 88 | int I2CLCD::address(int col, int row) { |
okini3939 | 0:b069b7027af2 | 89 | switch (type) { |
okini3939 | 0:b069b7027af2 | 90 | case LCD16x1: |
okini3939 | 0:b069b7027af2 | 91 | return (col < 8 ? 0x80 : 0xc0) + (col & 0x03); |
okini3939 | 0:b069b7027af2 | 92 | case LCD16x4: |
okini3939 | 0:b069b7027af2 | 93 | case LCD20x4: |
okini3939 | 0:b069b7027af2 | 94 | switch (row) { |
okini3939 | 0:b069b7027af2 | 95 | case 0: |
okini3939 | 0:b069b7027af2 | 96 | return 0x80 + col; |
okini3939 | 0:b069b7027af2 | 97 | case 1: |
okini3939 | 0:b069b7027af2 | 98 | return 0xc0 + col; |
okini3939 | 0:b069b7027af2 | 99 | case 2: |
okini3939 | 0:b069b7027af2 | 100 | return 0x94 + col; |
okini3939 | 0:b069b7027af2 | 101 | case 3: |
okini3939 | 0:b069b7027af2 | 102 | return 0xd4 + col; |
okini3939 | 0:b069b7027af2 | 103 | } |
okini3939 | 0:b069b7027af2 | 104 | case LCD16x2B: |
okini3939 | 0:b069b7027af2 | 105 | return 0x80 + (row * 40) + col; |
okini3939 | 0:b069b7027af2 | 106 | case LCD8x2: |
okini3939 | 0:b069b7027af2 | 107 | case LCD16x2: |
okini3939 | 0:b069b7027af2 | 108 | case LCD20x2: |
okini3939 | 0:b069b7027af2 | 109 | default: |
okini3939 | 0:b069b7027af2 | 110 | return 0x80 + (row * 0x40) + col; |
okini3939 | 0:b069b7027af2 | 111 | } |
okini3939 | 0:b069b7027af2 | 112 | } |
okini3939 | 0:b069b7027af2 | 113 | |
okini3939 | 0:b069b7027af2 | 114 | int I2CLCD::cols() { |
okini3939 | 0:b069b7027af2 | 115 | switch (type) { |
okini3939 | 0:b069b7027af2 | 116 | case LCD8x2: |
okini3939 | 0:b069b7027af2 | 117 | return 8; |
okini3939 | 0:b069b7027af2 | 118 | case LCD20x4: |
okini3939 | 0:b069b7027af2 | 119 | case LCD20x2: |
okini3939 | 0:b069b7027af2 | 120 | return 20; |
okini3939 | 0:b069b7027af2 | 121 | case LCD16x1: |
okini3939 | 0:b069b7027af2 | 122 | case LCD16x2: |
okini3939 | 0:b069b7027af2 | 123 | case LCD16x2B: |
okini3939 | 0:b069b7027af2 | 124 | case LCD16x4: |
okini3939 | 0:b069b7027af2 | 125 | default: |
okini3939 | 0:b069b7027af2 | 126 | return 16; |
okini3939 | 0:b069b7027af2 | 127 | } |
okini3939 | 0:b069b7027af2 | 128 | } |
okini3939 | 0:b069b7027af2 | 129 | |
okini3939 | 0:b069b7027af2 | 130 | int I2CLCD::rows() { |
okini3939 | 0:b069b7027af2 | 131 | switch (type) { |
okini3939 | 0:b069b7027af2 | 132 | case LCD16x1: |
okini3939 | 0:b069b7027af2 | 133 | return 1; |
okini3939 | 0:b069b7027af2 | 134 | case LCD16x4: |
okini3939 | 0:b069b7027af2 | 135 | case LCD20x4: |
okini3939 | 0:b069b7027af2 | 136 | return 4; |
okini3939 | 0:b069b7027af2 | 137 | case LCD8x2: |
okini3939 | 0:b069b7027af2 | 138 | case LCD16x2: |
okini3939 | 0:b069b7027af2 | 139 | case LCD16x2B: |
okini3939 | 0:b069b7027af2 | 140 | case LCD20x2: |
okini3939 | 0:b069b7027af2 | 141 | default: |
okini3939 | 0:b069b7027af2 | 142 | return 2; |
okini3939 | 0:b069b7027af2 | 143 | } |
okini3939 | 0:b069b7027af2 | 144 | } |
okini3939 | 0:b069b7027af2 | 145 | |
okini3939 | 0:b069b7027af2 | 146 | void I2CLCD::lcd_cfg (I2CLCDConfig cfg) { |
okini3939 | 0:b069b7027af2 | 147 | i2c.start(); |
okini3939 | 0:b069b7027af2 | 148 | i2c.write(I2CLCD_ADDR); |
okini3939 | 0:b069b7027af2 | 149 | i2c.write(LCDCFG_ENABLE | (cfg & 0x1f)); |
okini3939 | 0:b069b7027af2 | 150 | i2c.stop(); |
okini3939 | 0:b069b7027af2 | 151 | } |
okini3939 | 0:b069b7027af2 | 152 | |
okini3939 | 0:b069b7027af2 | 153 | void I2CLCD::lcd_out (int dat, int rs) { |
okini3939 | 0:b069b7027af2 | 154 | i2c.start(); |
okini3939 | 0:b069b7027af2 | 155 | i2c.write(I2CLCD_ADDR); |
okini3939 | 0:b069b7027af2 | 156 | i2c.write(rs ? 0x40 : 0); |
okini3939 | 0:b069b7027af2 | 157 | i2c.write(dat); |
okini3939 | 0:b069b7027af2 | 158 | i2c.stop(); |
okini3939 | 0:b069b7027af2 | 159 | } |
okini3939 | 0:b069b7027af2 | 160 | |
okini3939 | 0:b069b7027af2 | 161 | int I2CLCD::lcd_in (int rs) { |
okini3939 | 0:b069b7027af2 | 162 | int i; |
okini3939 | 0:b069b7027af2 | 163 | |
okini3939 | 0:b069b7027af2 | 164 | i2c.start(); |
okini3939 | 0:b069b7027af2 | 165 | i2c.write(I2CLCD_ADDR); |
okini3939 | 0:b069b7027af2 | 166 | i2c.write(rs ? 0x40 : 0); |
okini3939 | 0:b069b7027af2 | 167 | |
okini3939 | 0:b069b7027af2 | 168 | i2c.start(); |
okini3939 | 0:b069b7027af2 | 169 | i2c.write(I2CLCD_ADDR | 0x01); |
okini3939 | 0:b069b7027af2 | 170 | i = i2c.read(0); |
okini3939 | 0:b069b7027af2 | 171 | i2c.stop(); |
okini3939 | 0:b069b7027af2 | 172 | |
okini3939 | 0:b069b7027af2 | 173 | return i; |
okini3939 | 0:b069b7027af2 | 174 | } |