SO1602A_i2c_oled
Fork of I2CLCD by
I2CLCD.cpp@3:61518c45ea07, 2015-01-07 (annotated)
- Committer:
- okp_mh
- Date:
- Wed Jan 07 00:55:10 2015 +0000
- Revision:
- 3:61518c45ea07
- Parent:
- 2:bc4583ce560e
SO1602A_i2c_oled
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; |
okp_mh | 3:61518c45ea07 | 83 | |
okini3939 | 0:b069b7027af2 | 84 | |
okini3939 | 0:b069b7027af2 | 85 | lcd_cfg(p_config); |
okini3939 | 0:b069b7027af2 | 86 | |
okini3939 | 2:bc4583ce560e | 87 | wait_ms(500); |
okini3939 | 0:b069b7027af2 | 88 | lcd_out(0x30, 0); |
okini3939 | 2:bc4583ce560e | 89 | wait_ms(5); |
okini3939 | 0:b069b7027af2 | 90 | lcd_out(0x30, 0); |
okini3939 | 2:bc4583ce560e | 91 | wait_ms(2); |
okini3939 | 0:b069b7027af2 | 92 | lcd_out(0x30, 0); |
okini3939 | 0:b069b7027af2 | 93 | |
okini3939 | 0:b069b7027af2 | 94 | lcd_out(0x38, 0); // func |
okini3939 | 0:b069b7027af2 | 95 | lcd_out(0x10, 0); // shift |
okini3939 | 0:b069b7027af2 | 96 | lcd_out(0x0c, 0); // display |
okini3939 | 0:b069b7027af2 | 97 | lcd_out(0x06, 0); // entry mode |
okini3939 | 0:b069b7027af2 | 98 | cls(); |
okini3939 | 0:b069b7027af2 | 99 | } |
okini3939 | 0:b069b7027af2 | 100 | |
okini3939 | 0:b069b7027af2 | 101 | void I2CLCD::cls() { |
okini3939 | 0:b069b7027af2 | 102 | lcd_out(0x01, 0); // clear |
okini3939 | 2:bc4583ce560e | 103 | wait_ms(2); |
okini3939 | 0:b069b7027af2 | 104 | lcd_out(0x02, 0); // home |
okini3939 | 2:bc4583ce560e | 105 | wait_ms(2); |
okini3939 | 0:b069b7027af2 | 106 | locate(0, 0); |
okini3939 | 0:b069b7027af2 | 107 | } |
okini3939 | 0:b069b7027af2 | 108 | |
okini3939 | 0:b069b7027af2 | 109 | void I2CLCD::locate(int col, int row) { |
okini3939 | 0:b069b7027af2 | 110 | x = col; |
okini3939 | 0:b069b7027af2 | 111 | y = row; |
okini3939 | 0:b069b7027af2 | 112 | lcd_out(address(x, y), 0); |
okp_mh | 3:61518c45ea07 | 113 | //oled_out(0x00+x+y*0x20+0x80,0); |
okp_mh | 3:61518c45ea07 | 114 | //lcd_out(0x00+x+y*0x20+0x80,0); |
okini3939 | 0:b069b7027af2 | 115 | } |
okini3939 | 0:b069b7027af2 | 116 | |
okini3939 | 0:b069b7027af2 | 117 | int I2CLCD::address(int col, int row) { |
okini3939 | 0:b069b7027af2 | 118 | switch (type) { |
okini3939 | 0:b069b7027af2 | 119 | case LCD16x1: |
okini3939 | 0:b069b7027af2 | 120 | return (col < 8 ? 0x80 : 0xc0) + (col & 0x03); |
okini3939 | 0:b069b7027af2 | 121 | case LCD16x4: |
okini3939 | 0:b069b7027af2 | 122 | case LCD20x4: |
okini3939 | 0:b069b7027af2 | 123 | switch (row) { |
okini3939 | 0:b069b7027af2 | 124 | case 0: |
okini3939 | 0:b069b7027af2 | 125 | return 0x80 + col; |
okini3939 | 0:b069b7027af2 | 126 | case 1: |
okini3939 | 0:b069b7027af2 | 127 | return 0xc0 + col; |
okini3939 | 0:b069b7027af2 | 128 | case 2: |
okini3939 | 0:b069b7027af2 | 129 | return 0x94 + col; |
okini3939 | 0:b069b7027af2 | 130 | case 3: |
okini3939 | 0:b069b7027af2 | 131 | return 0xd4 + col; |
okini3939 | 0:b069b7027af2 | 132 | } |
okini3939 | 0:b069b7027af2 | 133 | case LCD16x2B: |
okini3939 | 0:b069b7027af2 | 134 | return 0x80 + (row * 40) + col; |
okp_mh | 3:61518c45ea07 | 135 | |
okini3939 | 0:b069b7027af2 | 136 | case LCD8x2: |
okini3939 | 0:b069b7027af2 | 137 | case LCD16x2: |
okp_mh | 3:61518c45ea07 | 138 | return 0x00+col+row*0x20+0x80; //typeはLCD16x2になるのでここにSO1602A用に「return 0x00+col+row*0x20+0x80;」を追加する。 |
okp_mh | 3:61518c45ea07 | 139 | //ここを記入しないと「i2clcd.locate(6,1);」2行目が表示されない。 |
okini3939 | 0:b069b7027af2 | 140 | case LCD20x2: |
okini3939 | 0:b069b7027af2 | 141 | default: |
okini3939 | 0:b069b7027af2 | 142 | return 0x80 + (row * 0x40) + col; |
okini3939 | 0:b069b7027af2 | 143 | } |
okini3939 | 0:b069b7027af2 | 144 | } |
okini3939 | 0:b069b7027af2 | 145 | |
okini3939 | 0:b069b7027af2 | 146 | int I2CLCD::cols() { |
okini3939 | 0:b069b7027af2 | 147 | switch (type) { |
okini3939 | 0:b069b7027af2 | 148 | case LCD8x2: |
okini3939 | 0:b069b7027af2 | 149 | return 8; |
okini3939 | 0:b069b7027af2 | 150 | case LCD20x4: |
okini3939 | 0:b069b7027af2 | 151 | case LCD20x2: |
okini3939 | 0:b069b7027af2 | 152 | return 20; |
okini3939 | 0:b069b7027af2 | 153 | case LCD16x1: |
okini3939 | 0:b069b7027af2 | 154 | case LCD16x2: |
okini3939 | 0:b069b7027af2 | 155 | case LCD16x2B: |
okini3939 | 0:b069b7027af2 | 156 | case LCD16x4: |
okini3939 | 0:b069b7027af2 | 157 | default: |
okini3939 | 0:b069b7027af2 | 158 | return 16; |
okini3939 | 0:b069b7027af2 | 159 | } |
okini3939 | 0:b069b7027af2 | 160 | } |
okini3939 | 0:b069b7027af2 | 161 | |
okini3939 | 0:b069b7027af2 | 162 | int I2CLCD::rows() { |
okini3939 | 0:b069b7027af2 | 163 | switch (type) { |
okini3939 | 0:b069b7027af2 | 164 | case LCD16x1: |
okini3939 | 0:b069b7027af2 | 165 | return 1; |
okini3939 | 0:b069b7027af2 | 166 | case LCD16x4: |
okini3939 | 0:b069b7027af2 | 167 | case LCD20x4: |
okini3939 | 0:b069b7027af2 | 168 | return 4; |
okini3939 | 0:b069b7027af2 | 169 | case LCD8x2: |
okini3939 | 0:b069b7027af2 | 170 | case LCD16x2: |
okini3939 | 0:b069b7027af2 | 171 | case LCD16x2B: |
okini3939 | 0:b069b7027af2 | 172 | case LCD20x2: |
okini3939 | 0:b069b7027af2 | 173 | default: |
okini3939 | 0:b069b7027af2 | 174 | return 2; |
okini3939 | 0:b069b7027af2 | 175 | } |
okini3939 | 0:b069b7027af2 | 176 | } |
okini3939 | 0:b069b7027af2 | 177 | |
okini3939 | 0:b069b7027af2 | 178 | void I2CLCD::lcd_cfg (I2CLCDConfig cfg) { |
okini3939 | 0:b069b7027af2 | 179 | i2c.start(); |
okini3939 | 2:bc4583ce560e | 180 | i2c.write(i2caddr); |
okini3939 | 0:b069b7027af2 | 181 | i2c.write(LCDCFG_ENABLE | (cfg & 0x1f)); |
okini3939 | 0:b069b7027af2 | 182 | i2c.stop(); |
okini3939 | 0:b069b7027af2 | 183 | } |
okini3939 | 0:b069b7027af2 | 184 | |
okini3939 | 2:bc4583ce560e | 185 | void I2CLCD::lcd_out (char dat, char rs) { |
okini3939 | 0:b069b7027af2 | 186 | i2c.start(); |
okini3939 | 2:bc4583ce560e | 187 | i2c.write(i2caddr); |
okini3939 | 0:b069b7027af2 | 188 | i2c.write(rs ? 0x40 : 0); |
okini3939 | 0:b069b7027af2 | 189 | i2c.write(dat); |
okini3939 | 0:b069b7027af2 | 190 | i2c.stop(); |
okini3939 | 0:b069b7027af2 | 191 | } |
okini3939 | 0:b069b7027af2 | 192 | |
okini3939 | 2:bc4583ce560e | 193 | char I2CLCD::lcd_in (char rs) { |
okini3939 | 2:bc4583ce560e | 194 | char i; |
okini3939 | 0:b069b7027af2 | 195 | |
okini3939 | 0:b069b7027af2 | 196 | i2c.start(); |
okini3939 | 2:bc4583ce560e | 197 | i2c.write(i2caddr); |
okini3939 | 0:b069b7027af2 | 198 | i2c.write(rs ? 0x40 : 0); |
okini3939 | 0:b069b7027af2 | 199 | |
okini3939 | 0:b069b7027af2 | 200 | i2c.start(); |
okini3939 | 2:bc4583ce560e | 201 | i2c.write(i2caddr | 0x01); |
okini3939 | 0:b069b7027af2 | 202 | i = i2c.read(0); |
okini3939 | 0:b069b7027af2 | 203 | i2c.stop(); |
okini3939 | 0:b069b7027af2 | 204 | |
okini3939 | 0:b069b7027af2 | 205 | return i; |
okini3939 | 0:b069b7027af2 | 206 | } |