IICLCD_LOWCOST

Committer:
tsuparit
Date:
Mon Mar 23 02:00:57 2015 +0000
Revision:
1:83adfb305748
Parent:
0:dbd7c46a32da
Child:
2:bb20bb35536c
Release new LCD low cost module

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