Dependents:   lpclcd

Committer:
KatsushiOgawa
Date:
Tue May 29 09:25:22 2012 +0000
Revision:
0:8a9ac3d4afdf

        

Who changed what in which revision?

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