IICLCD_LOWCOST
LiquidCrystal_I2C.h@3:3468dc87d641, 2015-09-23 (annotated)
- Committer:
- tsuparit
- Date:
- Wed Sep 23 07:59:20 2015 +0000
- Revision:
- 3:3468dc87d641
- Parent:
- 2:bb20bb35536c
Test pilot timer 12 Hr.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tsuparit | 0:dbd7c46a32da | 1 | |
tsuparit | 0:dbd7c46a32da | 2 | //Header // |
tsuparit | 0:dbd7c46a32da | 3 | |
tsuparit | 0:dbd7c46a32da | 4 | // commands |
tsuparit | 0:dbd7c46a32da | 5 | #define LCD_CLEARDISPLAY 0x01 |
tsuparit | 0:dbd7c46a32da | 6 | #define LCD_RETURNHOME 0x02 |
tsuparit | 0:dbd7c46a32da | 7 | #define LCD_ENTRYMODESET 0x04 |
tsuparit | 0:dbd7c46a32da | 8 | #define LCD_DISPLAYCONTROL 0x08 |
tsuparit | 0:dbd7c46a32da | 9 | #define LCD_CURSORSHIFT 0x10 |
tsuparit | 0:dbd7c46a32da | 10 | #define LCD_FUNCTIONSET 0x20 |
tsuparit | 0:dbd7c46a32da | 11 | #define LCD_SETCGRAMADDR 0x40 |
tsuparit | 0:dbd7c46a32da | 12 | #define LCD_SETDDRAMADDR 0x80 |
tsuparit | 0:dbd7c46a32da | 13 | |
tsuparit | 0:dbd7c46a32da | 14 | // flags for display entry mode |
tsuparit | 0:dbd7c46a32da | 15 | #define LCD_ENTRYRIGHT 0x00 |
tsuparit | 0:dbd7c46a32da | 16 | #define LCD_ENTRYLEFT 0x02 |
tsuparit | 0:dbd7c46a32da | 17 | #define LCD_ENTRYSHIFTINCREMENT 0x01 |
tsuparit | 0:dbd7c46a32da | 18 | #define LCD_ENTRYSHIFTDECREMENT 0x00 |
tsuparit | 0:dbd7c46a32da | 19 | |
tsuparit | 0:dbd7c46a32da | 20 | // flags for display on/off control |
tsuparit | 0:dbd7c46a32da | 21 | #define LCD_DISPLAYON 0x04 |
tsuparit | 0:dbd7c46a32da | 22 | #define LCD_DISPLAYOFF 0x00 |
tsuparit | 0:dbd7c46a32da | 23 | #define LCD_CURSORON 0x02 |
tsuparit | 0:dbd7c46a32da | 24 | #define LCD_CURSOROFF 0x00 |
tsuparit | 0:dbd7c46a32da | 25 | #define LCD_BLINKON 0x01 |
tsuparit | 0:dbd7c46a32da | 26 | #define LCD_BLINKOFF 0x00 |
tsuparit | 0:dbd7c46a32da | 27 | |
tsuparit | 0:dbd7c46a32da | 28 | // flags for display/cursor shift |
tsuparit | 0:dbd7c46a32da | 29 | #define LCD_DISPLAYMOVE 0x08 |
tsuparit | 0:dbd7c46a32da | 30 | #define LCD_CURSORMOVE 0x00 |
tsuparit | 0:dbd7c46a32da | 31 | #define LCD_MOVERIGHT 0x04 |
tsuparit | 0:dbd7c46a32da | 32 | #define LCD_MOVELEFT 0x00 |
tsuparit | 0:dbd7c46a32da | 33 | |
tsuparit | 0:dbd7c46a32da | 34 | // flags for function set |
tsuparit | 0:dbd7c46a32da | 35 | #define LCD_8BITMODE 0x10 |
tsuparit | 0:dbd7c46a32da | 36 | #define LCD_4BITMODE 0x00 |
tsuparit | 0:dbd7c46a32da | 37 | #define LCD_2LINE 0x08 |
tsuparit | 0:dbd7c46a32da | 38 | #define LCD_1LINE 0x00 |
tsuparit | 0:dbd7c46a32da | 39 | #define LCD_5x10DOTS 0x04 |
tsuparit | 0:dbd7c46a32da | 40 | #define LCD_5x8DOTS 0x00 |
tsuparit | 0:dbd7c46a32da | 41 | |
tsuparit | 0:dbd7c46a32da | 42 | // flags for backlight control |
tsuparit | 0:dbd7c46a32da | 43 | #define LCD_BACKLIGHT 0x08 |
tsuparit | 0:dbd7c46a32da | 44 | #define LCD_NOBACKLIGHT 0x00 |
tsuparit | 0:dbd7c46a32da | 45 | |
tsuparit | 0:dbd7c46a32da | 46 | #define En 4 //B00000100 // Enable bit |
tsuparit | 0:dbd7c46a32da | 47 | #define Rw 2 //B00000010 // Read/Write bit |
tsuparit | 0:dbd7c46a32da | 48 | #define Rs 1 //B00000001 // Register select bit |
tsuparit | 0:dbd7c46a32da | 49 | |
tsuparit | 0:dbd7c46a32da | 50 | //public |
tsuparit | 0:dbd7c46a32da | 51 | |
tsuparit | 0:dbd7c46a32da | 52 | void LiquidCrystal_I2Cbegin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS ); |
tsuparit | 2:bb20bb35536c | 53 | void LCDI2C4Bit_clear(); |
tsuparit | 0:dbd7c46a32da | 54 | void LiquidCrystal_I2Cclear(); |
tsuparit | 0:dbd7c46a32da | 55 | void LiquidCrystal_I2Chome(); |
tsuparit | 0:dbd7c46a32da | 56 | void LiquidCrystal_I2CnoDisplay(); |
tsuparit | 0:dbd7c46a32da | 57 | void LiquidCrystal_I2Cdisplay(); |
tsuparit | 0:dbd7c46a32da | 58 | void LiquidCrystal_I2CnoBlink(); |
tsuparit | 0:dbd7c46a32da | 59 | void LiquidCrystal_I2Cblink(); |
tsuparit | 0:dbd7c46a32da | 60 | void LiquidCrystal_I2CnoCursor(); |
tsuparit | 0:dbd7c46a32da | 61 | void LiquidCrystal_I2Ccursor(); |
tsuparit | 0:dbd7c46a32da | 62 | void LiquidCrystal_I2CscrollDisplayLeft(); |
tsuparit | 0:dbd7c46a32da | 63 | void LiquidCrystal_I2CscrollDisplayRight(); |
tsuparit | 0:dbd7c46a32da | 64 | void LiquidCrystal_I2CprintLeft(); |
tsuparit | 0:dbd7c46a32da | 65 | void LiquidCrystal_I2CprintRight(); |
tsuparit | 0:dbd7c46a32da | 66 | void LiquidCrystal_I2CleftToRight(); |
tsuparit | 0:dbd7c46a32da | 67 | void LiquidCrystal_I2CrightToLeft(); |
tsuparit | 0:dbd7c46a32da | 68 | void LiquidCrystal_I2CshiftIncrement(); |
tsuparit | 0:dbd7c46a32da | 69 | void LiquidCrystal_I2CshiftDecrement(); |
tsuparit | 0:dbd7c46a32da | 70 | void LiquidCrystal_I2CnoBacklight(); |
tsuparit | 0:dbd7c46a32da | 71 | void LiquidCrystal_I2Cbacklight(); |
tsuparit | 0:dbd7c46a32da | 72 | void LiquidCrystal_I2Cautoscroll(); |
tsuparit | 0:dbd7c46a32da | 73 | void LiquidCrystal_I2CnoAutoscroll(); |
tsuparit | 0:dbd7c46a32da | 74 | void LiquidCrystal_I2CcreateChar(uint8_t, uint8_t[]); |
tsuparit | 0:dbd7c46a32da | 75 | void LiquidCrystal_I2CsetCursor(uint8_t, uint8_t); |
tsuparit | 0:dbd7c46a32da | 76 | void LiquidCrystal_I2Cwrite(uint8_t); |
tsuparit | 0:dbd7c46a32da | 77 | void LiquidCrystal_I2Ccommand(uint8_t); |
tsuparit | 0:dbd7c46a32da | 78 | void LiquidCrystal_I2Cinit(); |
tsuparit | 0:dbd7c46a32da | 79 | |
tsuparit | 0:dbd7c46a32da | 80 | //private |
tsuparit | 0:dbd7c46a32da | 81 | void init_priv(); |
tsuparit | 0:dbd7c46a32da | 82 | void send(uint8_t, uint8_t); |
tsuparit | 0:dbd7c46a32da | 83 | void write4bits(uint8_t); |
tsuparit | 0:dbd7c46a32da | 84 | void expanderWrite(uint8_t); |
tsuparit | 0:dbd7c46a32da | 85 | void pulseEnable(uint8_t); |
tsuparit | 0:dbd7c46a32da | 86 | |
tsuparit | 0:dbd7c46a32da | 87 | //YWROBOT |
tsuparit | 0:dbd7c46a32da | 88 | //last updated on 21/12/2011 |
tsuparit | 0:dbd7c46a32da | 89 | //Tim Starling Fix the reset bug (Thanks Tim) |
tsuparit | 0:dbd7c46a32da | 90 | //wiki doc http://www.dfrobot.com/wiki/index.php?title=I2C/TWI_LCD1602_Module_(SKU:_DFR0063) |
tsuparit | 0:dbd7c46a32da | 91 | //Support Forum: http://www.dfrobot.com/forum/ |
tsuparit | 0:dbd7c46a32da | 92 | //Compatible with the Arduino IDE 1.0 |
tsuparit | 0:dbd7c46a32da | 93 | //Library version:1.1 |
tsuparit | 0:dbd7c46a32da | 94 | |
tsuparit | 0:dbd7c46a32da | 95 | I2C Wire(PTC11, PTC10); //SDA , SCL |
tsuparit | 0:dbd7c46a32da | 96 | |
tsuparit | 0:dbd7c46a32da | 97 | // When the display powers up, it is configured as follows: |
tsuparit | 0:dbd7c46a32da | 98 | // |
tsuparit | 0:dbd7c46a32da | 99 | // 1. Display clear |
tsuparit | 0:dbd7c46a32da | 100 | // 2. Function set: |
tsuparit | 0:dbd7c46a32da | 101 | // DL = 1; 8-bit interface data |
tsuparit | 0:dbd7c46a32da | 102 | // N = 0; 1-line display |
tsuparit | 0:dbd7c46a32da | 103 | // F = 0; 5x8 dot character font |
tsuparit | 0:dbd7c46a32da | 104 | // 3. Display on/off control: |
tsuparit | 0:dbd7c46a32da | 105 | // D = 0; Display off |
tsuparit | 0:dbd7c46a32da | 106 | // C = 0; Cursor off |
tsuparit | 0:dbd7c46a32da | 107 | // B = 0; Blinking off |
tsuparit | 0:dbd7c46a32da | 108 | // 4. Entry mode set: |
tsuparit | 0:dbd7c46a32da | 109 | // I/D = 1; Increment by 1 |
tsuparit | 0:dbd7c46a32da | 110 | // S = 0; No shift |
tsuparit | 0:dbd7c46a32da | 111 | // |
tsuparit | 0:dbd7c46a32da | 112 | // Note, however, that resetting the Arduino doesn't reset the LCD, so we |
tsuparit | 0:dbd7c46a32da | 113 | // can't assume that its in that state when a sketch starts (and the |
tsuparit | 0:dbd7c46a32da | 114 | // LiquidCrystal constructor is called). |
tsuparit | 0:dbd7c46a32da | 115 | |
tsuparit | 0:dbd7c46a32da | 116 | |
tsuparit | 0:dbd7c46a32da | 117 | |
tsuparit | 0:dbd7c46a32da | 118 | |
tsuparit | 0:dbd7c46a32da | 119 | |
tsuparit | 0:dbd7c46a32da | 120 | |
tsuparit | 0:dbd7c46a32da | 121 | uint8_t _Addr; |
tsuparit | 0:dbd7c46a32da | 122 | uint8_t _displayfunction; |
tsuparit | 0:dbd7c46a32da | 123 | uint8_t _displaycontrol; |
tsuparit | 0:dbd7c46a32da | 124 | uint8_t _displaymode; |
tsuparit | 0:dbd7c46a32da | 125 | uint8_t _numlines; |
tsuparit | 0:dbd7c46a32da | 126 | uint8_t _cols; |
tsuparit | 0:dbd7c46a32da | 127 | uint8_t _rows; |
tsuparit | 0:dbd7c46a32da | 128 | uint8_t _backlightval; |
tsuparit | 0:dbd7c46a32da | 129 | |
tsuparit | 0:dbd7c46a32da | 130 | |
tsuparit | 0:dbd7c46a32da | 131 | void delay(int msec) |
tsuparit | 0:dbd7c46a32da | 132 | { |
tsuparit | 0:dbd7c46a32da | 133 | wait_ms(msec); |
tsuparit | 0:dbd7c46a32da | 134 | } |
tsuparit | 0:dbd7c46a32da | 135 | |
tsuparit | 0:dbd7c46a32da | 136 | void delayMicroseconds(int microsec) |
tsuparit | 0:dbd7c46a32da | 137 | { |
tsuparit | 0:dbd7c46a32da | 138 | wait_us(microsec); |
tsuparit | 0:dbd7c46a32da | 139 | } |
tsuparit | 0:dbd7c46a32da | 140 | |
tsuparit | 2:bb20bb35536c | 141 | void LCDI2C4Bit_clear() |
tsuparit | 2:bb20bb35536c | 142 | { |
tsuparit | 2:bb20bb35536c | 143 | LiquidCrystal_I2Cclear(); |
tsuparit | 2:bb20bb35536c | 144 | } |
tsuparit | 0:dbd7c46a32da | 145 | |
tsuparit | 0:dbd7c46a32da | 146 | void LiquidCrystal_I2C_SETUP(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows) |
tsuparit | 0:dbd7c46a32da | 147 | { |
tsuparit | 0:dbd7c46a32da | 148 | _Addr = lcd_Addr; |
tsuparit | 0:dbd7c46a32da | 149 | _cols = lcd_cols; |
tsuparit | 0:dbd7c46a32da | 150 | _rows = lcd_rows; |
tsuparit | 0:dbd7c46a32da | 151 | _backlightval = LCD_NOBACKLIGHT; |
tsuparit | 0:dbd7c46a32da | 152 | } |
tsuparit | 0:dbd7c46a32da | 153 | |
tsuparit | 0:dbd7c46a32da | 154 | |
tsuparit | 0:dbd7c46a32da | 155 | |
tsuparit | 0:dbd7c46a32da | 156 | |
tsuparit | 0:dbd7c46a32da | 157 | void LiquidCrystal_I2Cinit(){ |
tsuparit | 0:dbd7c46a32da | 158 | init_priv(); |
tsuparit | 0:dbd7c46a32da | 159 | |
tsuparit | 0:dbd7c46a32da | 160 | } |
tsuparit | 0:dbd7c46a32da | 161 | |
tsuparit | 0:dbd7c46a32da | 162 | |
tsuparit | 0:dbd7c46a32da | 163 | |
tsuparit | 0:dbd7c46a32da | 164 | |
tsuparit | 0:dbd7c46a32da | 165 | void init_priv() |
tsuparit | 0:dbd7c46a32da | 166 | { |
tsuparit | 0:dbd7c46a32da | 167 | // Wire.begin(); |
tsuparit | 0:dbd7c46a32da | 168 | _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS; |
tsuparit | 0:dbd7c46a32da | 169 | LiquidCrystal_I2Cbegin(_cols, _rows); |
tsuparit | 0:dbd7c46a32da | 170 | |
tsuparit | 0:dbd7c46a32da | 171 | |
tsuparit | 0:dbd7c46a32da | 172 | } |
tsuparit | 0:dbd7c46a32da | 173 | |
tsuparit | 0:dbd7c46a32da | 174 | void LiquidCrystal_I2Cbegin(uint8_t cols, uint8_t lines, uint8_t dotsize) { |
tsuparit | 0:dbd7c46a32da | 175 | if (lines > 1) { |
tsuparit | 0:dbd7c46a32da | 176 | _displayfunction |= LCD_2LINE; |
tsuparit | 0:dbd7c46a32da | 177 | } |
tsuparit | 0:dbd7c46a32da | 178 | _numlines = lines; |
tsuparit | 0:dbd7c46a32da | 179 | |
tsuparit | 0:dbd7c46a32da | 180 | // for some 1 line displays you can select a 10 pixel high font |
tsuparit | 0:dbd7c46a32da | 181 | if ((dotsize != 0) && (lines == 1)) { |
tsuparit | 0:dbd7c46a32da | 182 | _displayfunction |= LCD_5x10DOTS; |
tsuparit | 0:dbd7c46a32da | 183 | } |
tsuparit | 0:dbd7c46a32da | 184 | |
tsuparit | 0:dbd7c46a32da | 185 | // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION! |
tsuparit | 0:dbd7c46a32da | 186 | // according to datasheet, we need at least 40ms after power rises above 2.7V |
tsuparit | 0:dbd7c46a32da | 187 | // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50 |
tsuparit | 0:dbd7c46a32da | 188 | delay(50); |
tsuparit | 0:dbd7c46a32da | 189 | |
tsuparit | 0:dbd7c46a32da | 190 | // Now we pull both RS and R/W low to begin commands |
tsuparit | 0:dbd7c46a32da | 191 | expanderWrite(_backlightval); // reset expanderand turn backlight off (Bit 8 =1) |
tsuparit | 0:dbd7c46a32da | 192 | delay(1000); |
tsuparit | 0:dbd7c46a32da | 193 | |
tsuparit | 0:dbd7c46a32da | 194 | //put the LCD into 4 bit mode |
tsuparit | 0:dbd7c46a32da | 195 | // this is according to the hitachi HD44780 datasheet |
tsuparit | 0:dbd7c46a32da | 196 | // figure 24, pg 46 |
tsuparit | 0:dbd7c46a32da | 197 | |
tsuparit | 0:dbd7c46a32da | 198 | // we start in 8bit mode, try to set 4 bit mode |
tsuparit | 0:dbd7c46a32da | 199 | write4bits(0x03 << 4); |
tsuparit | 0:dbd7c46a32da | 200 | delayMicroseconds(4500); // wait min 4.1ms |
tsuparit | 0:dbd7c46a32da | 201 | |
tsuparit | 0:dbd7c46a32da | 202 | // second try |
tsuparit | 0:dbd7c46a32da | 203 | write4bits(0x03 << 4); |
tsuparit | 0:dbd7c46a32da | 204 | delayMicroseconds(4500); // wait min 4.1ms |
tsuparit | 0:dbd7c46a32da | 205 | |
tsuparit | 0:dbd7c46a32da | 206 | // third go! |
tsuparit | 0:dbd7c46a32da | 207 | write4bits(0x03 << 4); |
tsuparit | 0:dbd7c46a32da | 208 | delayMicroseconds(150); |
tsuparit | 0:dbd7c46a32da | 209 | |
tsuparit | 0:dbd7c46a32da | 210 | // finally, set to 4-bit interface |
tsuparit | 0:dbd7c46a32da | 211 | write4bits(0x02 << 4); |
tsuparit | 0:dbd7c46a32da | 212 | |
tsuparit | 0:dbd7c46a32da | 213 | |
tsuparit | 0:dbd7c46a32da | 214 | // set # lines, font size, etc. |
tsuparit | 0:dbd7c46a32da | 215 | LiquidCrystal_I2Ccommand(LCD_FUNCTIONSET | _displayfunction); |
tsuparit | 0:dbd7c46a32da | 216 | |
tsuparit | 0:dbd7c46a32da | 217 | // turn the display on with no cursor or blinking default |
tsuparit | 0:dbd7c46a32da | 218 | _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF; |
tsuparit | 0:dbd7c46a32da | 219 | LiquidCrystal_I2Cdisplay(); |
tsuparit | 0:dbd7c46a32da | 220 | |
tsuparit | 0:dbd7c46a32da | 221 | // clear it off |
tsuparit | 0:dbd7c46a32da | 222 | LiquidCrystal_I2Cclear(); |
tsuparit | 0:dbd7c46a32da | 223 | |
tsuparit | 0:dbd7c46a32da | 224 | // Initialize to default text direction (for roman languages) |
tsuparit | 0:dbd7c46a32da | 225 | _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT; |
tsuparit | 0:dbd7c46a32da | 226 | |
tsuparit | 0:dbd7c46a32da | 227 | // set the entry mode |
tsuparit | 0:dbd7c46a32da | 228 | LiquidCrystal_I2Ccommand(LCD_ENTRYMODESET | _displaymode); |
tsuparit | 0:dbd7c46a32da | 229 | |
tsuparit | 0:dbd7c46a32da | 230 | LiquidCrystal_I2Chome(); |
tsuparit | 0:dbd7c46a32da | 231 | |
tsuparit | 0:dbd7c46a32da | 232 | } |
tsuparit | 0:dbd7c46a32da | 233 | |
tsuparit | 0:dbd7c46a32da | 234 | /********** high level commands, for the user! */ |
tsuparit | 0:dbd7c46a32da | 235 | void LiquidCrystal_I2Cclear(){ |
tsuparit | 0:dbd7c46a32da | 236 | LiquidCrystal_I2Ccommand(LCD_CLEARDISPLAY);// clear display, set cursor position to zero |
tsuparit | 0:dbd7c46a32da | 237 | delayMicroseconds(2000); // this command takes a long time! |
tsuparit | 0:dbd7c46a32da | 238 | } |
tsuparit | 0:dbd7c46a32da | 239 | |
tsuparit | 0:dbd7c46a32da | 240 | void LiquidCrystal_I2Chome(){ |
tsuparit | 0:dbd7c46a32da | 241 | LiquidCrystal_I2Ccommand(LCD_RETURNHOME); // set cursor position to zero |
tsuparit | 0:dbd7c46a32da | 242 | delayMicroseconds(2000); // this command takes a long time! |
tsuparit | 0:dbd7c46a32da | 243 | } |
tsuparit | 0:dbd7c46a32da | 244 | |
tsuparit | 0:dbd7c46a32da | 245 | void LiquidCrystal_I2CsetCursor(uint8_t col, uint8_t row){ |
tsuparit | 0:dbd7c46a32da | 246 | int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 }; |
tsuparit | 0:dbd7c46a32da | 247 | if ( row > _numlines ) { |
tsuparit | 0:dbd7c46a32da | 248 | row = _numlines-1; // we count rows starting w/0 |
tsuparit | 0:dbd7c46a32da | 249 | } |
tsuparit | 0:dbd7c46a32da | 250 | LiquidCrystal_I2Ccommand(LCD_SETDDRAMADDR | (col + row_offsets[row])); |
tsuparit | 0:dbd7c46a32da | 251 | } |
tsuparit | 0:dbd7c46a32da | 252 | |
tsuparit | 1:83adfb305748 | 253 | void LCDI2C4Bit_cursorTo(uint8_t col, uint8_t row) |
tsuparit | 1:83adfb305748 | 254 | { |
tsuparit | 1:83adfb305748 | 255 | if (col==2) col=1; |
tsuparit | 1:83adfb305748 | 256 | LiquidCrystal_I2CsetCursor(row,col); |
tsuparit | 1:83adfb305748 | 257 | } |
tsuparit | 1:83adfb305748 | 258 | |
tsuparit | 0:dbd7c46a32da | 259 | // Turn the display on/off (quickly) |
tsuparit | 0:dbd7c46a32da | 260 | void LiquidCrystal_I2CnoDisplay() { |
tsuparit | 0:dbd7c46a32da | 261 | _displaycontrol &= ~LCD_DISPLAYON; |
tsuparit | 0:dbd7c46a32da | 262 | LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol); |
tsuparit | 0:dbd7c46a32da | 263 | } |
tsuparit | 0:dbd7c46a32da | 264 | void LiquidCrystal_I2Cdisplay() { |
tsuparit | 0:dbd7c46a32da | 265 | _displaycontrol |= LCD_DISPLAYON; |
tsuparit | 0:dbd7c46a32da | 266 | LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol); |
tsuparit | 0:dbd7c46a32da | 267 | } |
tsuparit | 0:dbd7c46a32da | 268 | |
tsuparit | 0:dbd7c46a32da | 269 | // Turns the underline cursor on/off |
tsuparit | 0:dbd7c46a32da | 270 | void LiquidCrystal_I2CnoCursor() { |
tsuparit | 0:dbd7c46a32da | 271 | _displaycontrol &= ~LCD_CURSORON; |
tsuparit | 0:dbd7c46a32da | 272 | LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol); |
tsuparit | 0:dbd7c46a32da | 273 | } |
tsuparit | 0:dbd7c46a32da | 274 | void LiquidCrystal_I2Ccursor() { |
tsuparit | 0:dbd7c46a32da | 275 | _displaycontrol |= LCD_CURSORON; |
tsuparit | 0:dbd7c46a32da | 276 | LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol); |
tsuparit | 0:dbd7c46a32da | 277 | } |
tsuparit | 0:dbd7c46a32da | 278 | |
tsuparit | 0:dbd7c46a32da | 279 | // Turn on and off the blinking cursor |
tsuparit | 0:dbd7c46a32da | 280 | void LiquidCrystal_I2CnoBlink() { |
tsuparit | 0:dbd7c46a32da | 281 | _displaycontrol &= ~LCD_BLINKON; |
tsuparit | 0:dbd7c46a32da | 282 | LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol); |
tsuparit | 0:dbd7c46a32da | 283 | } |
tsuparit | 0:dbd7c46a32da | 284 | void LiquidCrystal_I2Cblink() { |
tsuparit | 0:dbd7c46a32da | 285 | _displaycontrol |= LCD_BLINKON; |
tsuparit | 0:dbd7c46a32da | 286 | LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol); |
tsuparit | 0:dbd7c46a32da | 287 | } |
tsuparit | 0:dbd7c46a32da | 288 | |
tsuparit | 0:dbd7c46a32da | 289 | // These commands scroll the display without changing the RAM |
tsuparit | 0:dbd7c46a32da | 290 | void LiquidCrystal_I2CscrollDisplayLeft(void) { |
tsuparit | 0:dbd7c46a32da | 291 | LiquidCrystal_I2Ccommand(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT); |
tsuparit | 0:dbd7c46a32da | 292 | } |
tsuparit | 0:dbd7c46a32da | 293 | void LiquidCrystal_I2CscrollDisplayRight(void) { |
tsuparit | 0:dbd7c46a32da | 294 | LiquidCrystal_I2Ccommand(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT); |
tsuparit | 0:dbd7c46a32da | 295 | } |
tsuparit | 0:dbd7c46a32da | 296 | |
tsuparit | 0:dbd7c46a32da | 297 | // This is for text that flows Left to Right |
tsuparit | 0:dbd7c46a32da | 298 | void LiquidCrystal_I2CleftToRight(void) { |
tsuparit | 0:dbd7c46a32da | 299 | _displaymode |= LCD_ENTRYLEFT; |
tsuparit | 0:dbd7c46a32da | 300 | LiquidCrystal_I2Ccommand(LCD_ENTRYMODESET | _displaymode); |
tsuparit | 0:dbd7c46a32da | 301 | } |
tsuparit | 0:dbd7c46a32da | 302 | |
tsuparit | 0:dbd7c46a32da | 303 | // This is for text that flows Right to Left |
tsuparit | 0:dbd7c46a32da | 304 | void LiquidCrystal_I2CrightToLeft(void) { |
tsuparit | 0:dbd7c46a32da | 305 | _displaymode &= ~LCD_ENTRYLEFT; |
tsuparit | 0:dbd7c46a32da | 306 | LiquidCrystal_I2Ccommand(LCD_ENTRYMODESET | _displaymode); |
tsuparit | 0:dbd7c46a32da | 307 | } |
tsuparit | 0:dbd7c46a32da | 308 | |
tsuparit | 0:dbd7c46a32da | 309 | // This will 'right justify' text from the cursor |
tsuparit | 0:dbd7c46a32da | 310 | void LiquidCrystal_I2Cautoscroll(void) { |
tsuparit | 0:dbd7c46a32da | 311 | _displaymode |= LCD_ENTRYSHIFTINCREMENT; |
tsuparit | 0:dbd7c46a32da | 312 | LiquidCrystal_I2Ccommand(LCD_ENTRYMODESET | _displaymode); |
tsuparit | 0:dbd7c46a32da | 313 | } |
tsuparit | 0:dbd7c46a32da | 314 | |
tsuparit | 0:dbd7c46a32da | 315 | // This will 'left justify' text from the cursor |
tsuparit | 0:dbd7c46a32da | 316 | void LiquidCrystal_I2CnoAutoscroll(void) { |
tsuparit | 0:dbd7c46a32da | 317 | _displaymode &= ~LCD_ENTRYSHIFTINCREMENT; |
tsuparit | 0:dbd7c46a32da | 318 | LiquidCrystal_I2Ccommand(LCD_ENTRYMODESET | _displaymode); |
tsuparit | 0:dbd7c46a32da | 319 | } |
tsuparit | 0:dbd7c46a32da | 320 | |
tsuparit | 0:dbd7c46a32da | 321 | // Allows us to fill the first 8 CGRAM locations |
tsuparit | 0:dbd7c46a32da | 322 | // with custom characters |
tsuparit | 0:dbd7c46a32da | 323 | void LiquidCrystal_I2CcreateChar(uint8_t location, uint8_t charmap[]) { |
tsuparit | 0:dbd7c46a32da | 324 | location &= 0x7; // we only have 8 locations 0-7 |
tsuparit | 0:dbd7c46a32da | 325 | LiquidCrystal_I2Ccommand(LCD_SETCGRAMADDR | (location << 3)); |
tsuparit | 0:dbd7c46a32da | 326 | for (int i=0; i<8; i++) { |
tsuparit | 0:dbd7c46a32da | 327 | //write(charmap[i]); |
tsuparit | 0:dbd7c46a32da | 328 | send(charmap[i], Rs); |
tsuparit | 0:dbd7c46a32da | 329 | } |
tsuparit | 0:dbd7c46a32da | 330 | } |
tsuparit | 0:dbd7c46a32da | 331 | |
tsuparit | 0:dbd7c46a32da | 332 | // Turn the (optional) backlight off/on |
tsuparit | 0:dbd7c46a32da | 333 | void LiquidCrystal_I2CnoBacklight(void) { |
tsuparit | 0:dbd7c46a32da | 334 | _backlightval=LCD_NOBACKLIGHT; |
tsuparit | 0:dbd7c46a32da | 335 | expanderWrite(0); |
tsuparit | 0:dbd7c46a32da | 336 | } |
tsuparit | 0:dbd7c46a32da | 337 | |
tsuparit | 0:dbd7c46a32da | 338 | void LiquidCrystal_I2Cbacklight(void) { |
tsuparit | 0:dbd7c46a32da | 339 | _backlightval=LCD_BACKLIGHT; |
tsuparit | 0:dbd7c46a32da | 340 | expanderWrite(0); |
tsuparit | 0:dbd7c46a32da | 341 | } |
tsuparit | 0:dbd7c46a32da | 342 | |
tsuparit | 0:dbd7c46a32da | 343 | |
tsuparit | 0:dbd7c46a32da | 344 | |
tsuparit | 0:dbd7c46a32da | 345 | /*********** mid level commands, for sending data/cmds */ |
tsuparit | 0:dbd7c46a32da | 346 | |
tsuparit | 0:dbd7c46a32da | 347 | inline void LiquidCrystal_I2Ccommand(uint8_t value) { |
tsuparit | 0:dbd7c46a32da | 348 | send(value, 0); |
tsuparit | 0:dbd7c46a32da | 349 | } |
tsuparit | 0:dbd7c46a32da | 350 | |
tsuparit | 0:dbd7c46a32da | 351 | |
tsuparit | 0:dbd7c46a32da | 352 | /************ low level data pushing commands **********/ |
tsuparit | 0:dbd7c46a32da | 353 | |
tsuparit | 0:dbd7c46a32da | 354 | // write either command or data |
tsuparit | 0:dbd7c46a32da | 355 | void send(uint8_t value, uint8_t mode) { |
tsuparit | 0:dbd7c46a32da | 356 | uint8_t highnib=value&0xf0; |
tsuparit | 0:dbd7c46a32da | 357 | uint8_t lownib=(value<<4)&0xf0; |
tsuparit | 0:dbd7c46a32da | 358 | write4bits((highnib)|mode); |
tsuparit | 0:dbd7c46a32da | 359 | write4bits((lownib)|mode); |
tsuparit | 0:dbd7c46a32da | 360 | } |
tsuparit | 0:dbd7c46a32da | 361 | |
tsuparit | 0:dbd7c46a32da | 362 | void write4bits(uint8_t value) { |
tsuparit | 0:dbd7c46a32da | 363 | expanderWrite(value); |
tsuparit | 0:dbd7c46a32da | 364 | pulseEnable(value); |
tsuparit | 0:dbd7c46a32da | 365 | } |
tsuparit | 0:dbd7c46a32da | 366 | |
tsuparit | 0:dbd7c46a32da | 367 | void expanderWrite(uint8_t _data) |
tsuparit | 0:dbd7c46a32da | 368 | { |
tsuparit | 0:dbd7c46a32da | 369 | |
tsuparit | 0:dbd7c46a32da | 370 | /* |
tsuparit | 0:dbd7c46a32da | 371 | Wire.beginTransmission(_Addr); |
tsuparit | 0:dbd7c46a32da | 372 | printIIC((int)(_data) | _backlightval); |
tsuparit | 0:dbd7c46a32da | 373 | Wire.endTransmission(); |
tsuparit | 0:dbd7c46a32da | 374 | |
tsuparit | 0:dbd7c46a32da | 375 | */ |
tsuparit | 0:dbd7c46a32da | 376 | char data[2]; |
tsuparit | 0:dbd7c46a32da | 377 | data[0]= _data | _backlightval; |
tsuparit | 0:dbd7c46a32da | 378 | // data[1]=val; |
tsuparit | 0:dbd7c46a32da | 379 | char result=Wire.write(_Addr<<1,data,1); |
tsuparit | 0:dbd7c46a32da | 380 | |
tsuparit | 0:dbd7c46a32da | 381 | } |
tsuparit | 0:dbd7c46a32da | 382 | |
tsuparit | 0:dbd7c46a32da | 383 | void pulseEnable(uint8_t _data){ |
tsuparit | 0:dbd7c46a32da | 384 | expanderWrite(_data | En); // En high |
tsuparit | 0:dbd7c46a32da | 385 | delayMicroseconds(1); // enable pulse must be >450ns |
tsuparit | 0:dbd7c46a32da | 386 | |
tsuparit | 0:dbd7c46a32da | 387 | expanderWrite(_data & ~En); // En low |
tsuparit | 0:dbd7c46a32da | 388 | delayMicroseconds(50); // commands need > 37us to settle |
tsuparit | 0:dbd7c46a32da | 389 | } |
tsuparit | 0:dbd7c46a32da | 390 | |
tsuparit | 0:dbd7c46a32da | 391 | |
tsuparit | 0:dbd7c46a32da | 392 | // Alias functions |
tsuparit | 0:dbd7c46a32da | 393 | |
tsuparit | 0:dbd7c46a32da | 394 | void LiquidCrystal_I2Ccursor_on(){ |
tsuparit | 0:dbd7c46a32da | 395 | LiquidCrystal_I2Ccursor(); |
tsuparit | 0:dbd7c46a32da | 396 | } |
tsuparit | 0:dbd7c46a32da | 397 | |
tsuparit | 0:dbd7c46a32da | 398 | void LiquidCrystal_I2Ccursor_off(){ |
tsuparit | 0:dbd7c46a32da | 399 | LiquidCrystal_I2CnoCursor(); |
tsuparit | 0:dbd7c46a32da | 400 | } |
tsuparit | 0:dbd7c46a32da | 401 | |
tsuparit | 0:dbd7c46a32da | 402 | void LiquidCrystal_I2Cblink_on(){ |
tsuparit | 0:dbd7c46a32da | 403 | LiquidCrystal_I2Cblink(); |
tsuparit | 0:dbd7c46a32da | 404 | } |
tsuparit | 0:dbd7c46a32da | 405 | |
tsuparit | 0:dbd7c46a32da | 406 | void LiquidCrystal_I2Cblink_off(){ |
tsuparit | 0:dbd7c46a32da | 407 | LiquidCrystal_I2CnoBlink(); |
tsuparit | 0:dbd7c46a32da | 408 | } |
tsuparit | 0:dbd7c46a32da | 409 | |
tsuparit | 0:dbd7c46a32da | 410 | void LiquidCrystal_I2Cload_custom_character(uint8_t char_num, uint8_t *rows){ |
tsuparit | 0:dbd7c46a32da | 411 | LiquidCrystal_I2CcreateChar(char_num, rows); |
tsuparit | 0:dbd7c46a32da | 412 | } |
tsuparit | 0:dbd7c46a32da | 413 | |
tsuparit | 0:dbd7c46a32da | 414 | void LiquidCrystal_I2CsetBacklight(uint8_t new_val){ |
tsuparit | 0:dbd7c46a32da | 415 | if(new_val){ |
tsuparit | 0:dbd7c46a32da | 416 | LiquidCrystal_I2Cbacklight(); // turn backlight on |
tsuparit | 0:dbd7c46a32da | 417 | }else{ |
tsuparit | 0:dbd7c46a32da | 418 | LiquidCrystal_I2CnoBacklight(); // turn backlight off |
tsuparit | 0:dbd7c46a32da | 419 | } |
tsuparit | 0:dbd7c46a32da | 420 | } |
tsuparit | 0:dbd7c46a32da | 421 | /* |
tsuparit | 0:dbd7c46a32da | 422 | void LiquidCrystal_I2Cprintstr(const char c[]){ |
tsuparit | 0:dbd7c46a32da | 423 | //This function is not identical to the function used for "real" I2C displays |
tsuparit | 0:dbd7c46a32da | 424 | //it's here so the user sketch doesn't have to be changed |
tsuparit | 0:dbd7c46a32da | 425 | //print(c); |
tsuparit | 0:dbd7c46a32da | 426 | send(c, Rs); |
tsuparit | 0:dbd7c46a32da | 427 | |
tsuparit | 0:dbd7c46a32da | 428 | } |
tsuparit | 0:dbd7c46a32da | 429 | */ |
tsuparit | 0:dbd7c46a32da | 430 | |
tsuparit | 0:dbd7c46a32da | 431 | void LCDI2C4Bit_printIn( char value[] ) |
tsuparit | 0:dbd7c46a32da | 432 | { |
tsuparit | 0:dbd7c46a32da | 433 | for ( char *p = value; *p != 0; p++ ) |
tsuparit | 0:dbd7c46a32da | 434 | { |
tsuparit | 0:dbd7c46a32da | 435 | //LCDI2C4Bit_print(*p); |
tsuparit | 0:dbd7c46a32da | 436 | send(*p, Rs); |
tsuparit | 0:dbd7c46a32da | 437 | } |
tsuparit | 0:dbd7c46a32da | 438 | } |
tsuparit | 0:dbd7c46a32da | 439 | |
tsuparit | 0:dbd7c46a32da | 440 | |
tsuparit | 0:dbd7c46a32da | 441 | /* |
tsuparit | 0:dbd7c46a32da | 442 | ize_t LiquidCrystal_I2C::write(uint8_t value) { |
tsuparit | 0:dbd7c46a32da | 443 | send(value, Rs); |
tsuparit | 0:dbd7c46a32da | 444 | return 0; |
tsuparit | 0:dbd7c46a32da | 445 | } |
tsuparit | 0:dbd7c46a32da | 446 | |
tsuparit | 0:dbd7c46a32da | 447 | #else |
tsuparit | 0:dbd7c46a32da | 448 | #include "WProgram.h" |
tsuparit | 0:dbd7c46a32da | 449 | |
tsuparit | 0:dbd7c46a32da | 450 | #define printIIC(args) Wire.send(args) |
tsuparit | 0:dbd7c46a32da | 451 | inline void LiquidCrystal_I2C::write(uint8_t value) { |
tsuparit | 0:dbd7c46a32da | 452 | send(value, Rs); |
tsuparit | 0:dbd7c46a32da | 453 | } |
tsuparit | 0:dbd7c46a32da | 454 | */ |
tsuparit | 0:dbd7c46a32da | 455 |