IICLCD_LOWCOST

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?

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