I2cLCD library that can display cursor.

Dependents:   LcdClock

Fork of I2cLCD by Junichi Katsu

Committer:
togayan
Date:
Mon Feb 17 08:13:14 2014 +0000
Revision:
2:4e32baaf019b
Parent:
1:f973d1359998
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 0:b3cc6ae3dfd8 1 #include "I2cLCD.h"
jksoft 0:b3cc6ae3dfd8 2 #include "mbed.h"
jksoft 0:b3cc6ae3dfd8 3
togayan 1:f973d1359998 4 #define I2CLCD_ADDR 0x7C
jksoft 0:b3cc6ae3dfd8 5
togayan 1:f973d1359998 6 #define RS_CMD 0x00
togayan 1:f973d1359998 7 #define RS_DATA 0x40
jksoft 0:b3cc6ae3dfd8 8
togayan 1:f973d1359998 9 #define FUNC_SET1 0x38
togayan 1:f973d1359998 10 #define FUNC_SET2 0x39
togayan 1:f973d1359998 11 #define INT_OSC 0x14
jksoft 0:b3cc6ae3dfd8 12
togayan 1:f973d1359998 13 #define CNTR_DEF 0x25
jksoft 0:b3cc6ae3dfd8 14
togayan 1:f973d1359998 15 unsigned char icon_data[]= {
jksoft 0:b3cc6ae3dfd8 16 0x00, 0x10,
jksoft 0:b3cc6ae3dfd8 17 0x02, 0x10,
jksoft 0:b3cc6ae3dfd8 18 0x04, 0x10,
jksoft 0:b3cc6ae3dfd8 19 0x06, 0x10,
togayan 1:f973d1359998 20
jksoft 0:b3cc6ae3dfd8 21 0x07, 0x10,
jksoft 0:b3cc6ae3dfd8 22 0x07, 0x08,
jksoft 0:b3cc6ae3dfd8 23 0x09, 0x10,
jksoft 0:b3cc6ae3dfd8 24 0x0B, 0x10,
togayan 1:f973d1359998 25
jksoft 0:b3cc6ae3dfd8 26 0x0D, 0x08,
jksoft 0:b3cc6ae3dfd8 27 0x0D, 0x04,
jksoft 0:b3cc6ae3dfd8 28 0x0D, 0x02,
jksoft 0:b3cc6ae3dfd8 29 0x0D, 0x10,
jksoft 0:b3cc6ae3dfd8 30
jksoft 0:b3cc6ae3dfd8 31 0x0F, 0x10,
jksoft 0:b3cc6ae3dfd8 32 };
jksoft 0:b3cc6ae3dfd8 33
togayan 1:f973d1359998 34 I2cLCD::I2cLCD(I2C& i2c, PinName rp) : _rs( rp ) , _i2c( i2c )
togayan 1:f973d1359998 35 {
jksoft 0:b3cc6ae3dfd8 36 contrast = CNTR_DEF;
jksoft 0:b3cc6ae3dfd8 37 icon = 0;
togayan 1:f973d1359998 38
jksoft 0:b3cc6ae3dfd8 39 wait(0.015);
jksoft 0:b3cc6ae3dfd8 40 // reset LOW->HIGH
jksoft 0:b3cc6ae3dfd8 41 _rs = 0;
jksoft 0:b3cc6ae3dfd8 42 wait(0.01);
jksoft 0:b3cc6ae3dfd8 43 _rs = 1;
jksoft 0:b3cc6ae3dfd8 44 wait(0.05);
togayan 1:f973d1359998 45
jksoft 0:b3cc6ae3dfd8 46 writeCommand(FUNC_SET1);
jksoft 0:b3cc6ae3dfd8 47 writeCommand(FUNC_SET2);
jksoft 0:b3cc6ae3dfd8 48 writeCommand(INT_OSC);
togayan 1:f973d1359998 49
jksoft 0:b3cc6ae3dfd8 50 writeCommand(0x70 | (contrast & 0xF));
jksoft 0:b3cc6ae3dfd8 51 writeCommand(0x5C | ((contrast >> 4) & 0x3));
togayan 1:f973d1359998 52
jksoft 0:b3cc6ae3dfd8 53 writeCommand(0x6C);
jksoft 0:b3cc6ae3dfd8 54 wait(0.3);
togayan 1:f973d1359998 55
jksoft 0:b3cc6ae3dfd8 56 writeCommand(0x38); // function set
jksoft 0:b3cc6ae3dfd8 57 writeCommand(0x0C); // Display On
togayan 1:f973d1359998 58
jksoft 0:b3cc6ae3dfd8 59 cls(); // Clear Display
jksoft 0:b3cc6ae3dfd8 60 }
jksoft 0:b3cc6ae3dfd8 61
togayan 1:f973d1359998 62 void I2cLCD::character(int column, int row, int c)
togayan 1:f973d1359998 63 {
jksoft 0:b3cc6ae3dfd8 64 int a = address(column, row);
jksoft 0:b3cc6ae3dfd8 65 writeCommand(a);
jksoft 0:b3cc6ae3dfd8 66 writeData(c);
jksoft 0:b3cc6ae3dfd8 67 }
jksoft 0:b3cc6ae3dfd8 68
togayan 1:f973d1359998 69 void I2cLCD::cls()
togayan 1:f973d1359998 70 {
jksoft 0:b3cc6ae3dfd8 71 writeCommand(0x01); // cls, and set cursor to 0
jksoft 0:b3cc6ae3dfd8 72 wait(0.00164f); // This command takes 1.64 ms
jksoft 0:b3cc6ae3dfd8 73 locate(0, 0);
jksoft 0:b3cc6ae3dfd8 74 }
jksoft 0:b3cc6ae3dfd8 75
togayan 1:f973d1359998 76 void I2cLCD::locate(int column, int row)
togayan 1:f973d1359998 77 {
jksoft 0:b3cc6ae3dfd8 78 _column = column;
jksoft 0:b3cc6ae3dfd8 79 _row = row;
jksoft 0:b3cc6ae3dfd8 80 }
jksoft 0:b3cc6ae3dfd8 81
togayan 1:f973d1359998 82 int I2cLCD::_putc(int value)
togayan 1:f973d1359998 83 {
jksoft 0:b3cc6ae3dfd8 84 if (value == '\n') {
jksoft 0:b3cc6ae3dfd8 85 _column = 0;
jksoft 0:b3cc6ae3dfd8 86 _row++;
jksoft 0:b3cc6ae3dfd8 87 if (_row >= rows()) {
jksoft 0:b3cc6ae3dfd8 88 _row = 0;
jksoft 0:b3cc6ae3dfd8 89 }
jksoft 0:b3cc6ae3dfd8 90 } else {
jksoft 0:b3cc6ae3dfd8 91 character(_column, _row, value);
jksoft 0:b3cc6ae3dfd8 92 _column++;
jksoft 0:b3cc6ae3dfd8 93 if (_column >= columns()) {
jksoft 0:b3cc6ae3dfd8 94 _column = 0;
jksoft 0:b3cc6ae3dfd8 95 _row++;
jksoft 0:b3cc6ae3dfd8 96 if (_row >= rows()) {
jksoft 0:b3cc6ae3dfd8 97 _row = 0;
jksoft 0:b3cc6ae3dfd8 98 }
jksoft 0:b3cc6ae3dfd8 99 }
jksoft 0:b3cc6ae3dfd8 100 }
jksoft 0:b3cc6ae3dfd8 101 return value;
jksoft 0:b3cc6ae3dfd8 102 }
jksoft 0:b3cc6ae3dfd8 103
togayan 1:f973d1359998 104 int I2cLCD::_getc()
togayan 1:f973d1359998 105 {
jksoft 0:b3cc6ae3dfd8 106 return -1;
jksoft 0:b3cc6ae3dfd8 107 }
jksoft 0:b3cc6ae3dfd8 108
jksoft 0:b3cc6ae3dfd8 109 void I2cLCD::writeCommand( int cmd )
jksoft 0:b3cc6ae3dfd8 110 {
jksoft 0:b3cc6ae3dfd8 111 char cmds[2];
togayan 1:f973d1359998 112
jksoft 0:b3cc6ae3dfd8 113 cmds[0] = RS_CMD;
jksoft 0:b3cc6ae3dfd8 114 cmds[1] = cmd;
togayan 1:f973d1359998 115
jksoft 0:b3cc6ae3dfd8 116 _i2c.write(I2CLCD_ADDR, cmds, 2);
jksoft 0:b3cc6ae3dfd8 117 }
jksoft 0:b3cc6ae3dfd8 118
jksoft 0:b3cc6ae3dfd8 119 void I2cLCD::writeData( int data )
jksoft 0:b3cc6ae3dfd8 120 {
jksoft 0:b3cc6ae3dfd8 121 char cmd[2];
togayan 1:f973d1359998 122
jksoft 0:b3cc6ae3dfd8 123 cmd[0] = RS_DATA;
jksoft 0:b3cc6ae3dfd8 124 cmd[1] = data;
togayan 1:f973d1359998 125
jksoft 0:b3cc6ae3dfd8 126 _i2c.write(I2CLCD_ADDR, cmd, 2);
jksoft 0:b3cc6ae3dfd8 127 }
jksoft 0:b3cc6ae3dfd8 128
togayan 1:f973d1359998 129 int I2cLCD::address(int column, int row)
togayan 1:f973d1359998 130 {
jksoft 0:b3cc6ae3dfd8 131 return 0x80 + (row * 0x40) + column;
jksoft 0:b3cc6ae3dfd8 132 }
jksoft 0:b3cc6ae3dfd8 133
togayan 1:f973d1359998 134 int I2cLCD::columns()
togayan 1:f973d1359998 135 {
jksoft 0:b3cc6ae3dfd8 136 return 16;
jksoft 0:b3cc6ae3dfd8 137 }
jksoft 0:b3cc6ae3dfd8 138
togayan 1:f973d1359998 139 int I2cLCD::rows()
togayan 1:f973d1359998 140 {
jksoft 0:b3cc6ae3dfd8 141 return 2;
jksoft 0:b3cc6ae3dfd8 142 }
jksoft 0:b3cc6ae3dfd8 143
jksoft 0:b3cc6ae3dfd8 144 void I2cLCD::seticon(IconType type)
jksoft 0:b3cc6ae3dfd8 145 {
jksoft 0:b3cc6ae3dfd8 146 icon |= type;
jksoft 0:b3cc6ae3dfd8 147 puticon( icon );
jksoft 0:b3cc6ae3dfd8 148 }
jksoft 0:b3cc6ae3dfd8 149
jksoft 0:b3cc6ae3dfd8 150 void I2cLCD::clearicon(IconType type)
jksoft 0:b3cc6ae3dfd8 151 {
jksoft 0:b3cc6ae3dfd8 152 icon &= ~type;
jksoft 0:b3cc6ae3dfd8 153 puticon( icon );
jksoft 0:b3cc6ae3dfd8 154 }
jksoft 0:b3cc6ae3dfd8 155
jksoft 0:b3cc6ae3dfd8 156 void I2cLCD::puticon(int flg)
jksoft 0:b3cc6ae3dfd8 157 {
jksoft 0:b3cc6ae3dfd8 158 static unsigned char icon_buff[16];
jksoft 0:b3cc6ae3dfd8 159 unsigned char i;
togayan 1:f973d1359998 160
togayan 1:f973d1359998 161 for(i=0; i<sizeof(icon_data)/2; i++) {
togayan 1:f973d1359998 162 if(flg & (0x1000>>i)) {
jksoft 0:b3cc6ae3dfd8 163 icon_buff[icon_data[i*2]] |= icon_data[i*2+1];
togayan 1:f973d1359998 164 } else {
jksoft 0:b3cc6ae3dfd8 165 icon_buff[icon_data[i*2]] &= ~icon_data[i*2+1];
jksoft 0:b3cc6ae3dfd8 166 }
jksoft 0:b3cc6ae3dfd8 167 }
jksoft 0:b3cc6ae3dfd8 168
togayan 1:f973d1359998 169 for(i=0; i<16; i++) {
jksoft 0:b3cc6ae3dfd8 170 writeCommand(0x39);
jksoft 0:b3cc6ae3dfd8 171 writeCommand(0x40+i);
jksoft 0:b3cc6ae3dfd8 172 writeData(icon_buff[i]);
jksoft 0:b3cc6ae3dfd8 173 }
jksoft 0:b3cc6ae3dfd8 174 }
togayan 2:4e32baaf019b 175
togayan 2:4e32baaf019b 176 void I2cLCD::cursor(bool isOn, int column, int row)
togayan 2:4e32baaf019b 177 {
togayan 2:4e32baaf019b 178 int a = address(column, row);
togayan 2:4e32baaf019b 179 writeCommand(a);
togayan 2:4e32baaf019b 180 writeCommand(isOn? 0x0F : 0x0C);
togayan 2:4e32baaf019b 181 }