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 Suga koubou

Committer:
okini3939
Date:
Thu Oct 14 14:45:30 2010 +0000
Revision:
0:b069b7027af2
Child:
1:bf21aa3f7cdc

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }