SO1602A_i2c_oled

Fork of I2CLCD by Suga koubou

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?

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 */
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 }