I2cLCD library that can display cursor.
Fork of I2cLCD by
I2cLCD.cpp@2:4e32baaf019b, 2014-02-17 (annotated)
- Committer:
- togayan
- Date:
- Mon Feb 17 08:13:14 2014 +0000
- Revision:
- 2:4e32baaf019b
- Parent:
- 1:f973d1359998
test
Who changed what in which revision?
User | Revision | Line number | New 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 | } |