IICLCD_LOWCOST

Committer:
tsuparit
Date:
Wed Mar 18 03:36:40 2015 +0000
Revision:
0:dbd7c46a32da
Child:
1:83adfb305748
Done Sample for i2c LCD new low cost model

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 0:dbd7c46a32da 251 // Turn the display on/off (quickly)
tsuparit 0:dbd7c46a32da 252 void LiquidCrystal_I2CnoDisplay() {
tsuparit 0:dbd7c46a32da 253 _displaycontrol &= ~LCD_DISPLAYON;
tsuparit 0:dbd7c46a32da 254 LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol);
tsuparit 0:dbd7c46a32da 255 }
tsuparit 0:dbd7c46a32da 256 void LiquidCrystal_I2Cdisplay() {
tsuparit 0:dbd7c46a32da 257 _displaycontrol |= LCD_DISPLAYON;
tsuparit 0:dbd7c46a32da 258 LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol);
tsuparit 0:dbd7c46a32da 259 }
tsuparit 0:dbd7c46a32da 260
tsuparit 0:dbd7c46a32da 261 // Turns the underline cursor on/off
tsuparit 0:dbd7c46a32da 262 void LiquidCrystal_I2CnoCursor() {
tsuparit 0:dbd7c46a32da 263 _displaycontrol &= ~LCD_CURSORON;
tsuparit 0:dbd7c46a32da 264 LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol);
tsuparit 0:dbd7c46a32da 265 }
tsuparit 0:dbd7c46a32da 266 void LiquidCrystal_I2Ccursor() {
tsuparit 0:dbd7c46a32da 267 _displaycontrol |= LCD_CURSORON;
tsuparit 0:dbd7c46a32da 268 LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol);
tsuparit 0:dbd7c46a32da 269 }
tsuparit 0:dbd7c46a32da 270
tsuparit 0:dbd7c46a32da 271 // Turn on and off the blinking cursor
tsuparit 0:dbd7c46a32da 272 void LiquidCrystal_I2CnoBlink() {
tsuparit 0:dbd7c46a32da 273 _displaycontrol &= ~LCD_BLINKON;
tsuparit 0:dbd7c46a32da 274 LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol);
tsuparit 0:dbd7c46a32da 275 }
tsuparit 0:dbd7c46a32da 276 void LiquidCrystal_I2Cblink() {
tsuparit 0:dbd7c46a32da 277 _displaycontrol |= LCD_BLINKON;
tsuparit 0:dbd7c46a32da 278 LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol);
tsuparit 0:dbd7c46a32da 279 }
tsuparit 0:dbd7c46a32da 280
tsuparit 0:dbd7c46a32da 281 // These commands scroll the display without changing the RAM
tsuparit 0:dbd7c46a32da 282 void LiquidCrystal_I2CscrollDisplayLeft(void) {
tsuparit 0:dbd7c46a32da 283 LiquidCrystal_I2Ccommand(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT);
tsuparit 0:dbd7c46a32da 284 }
tsuparit 0:dbd7c46a32da 285 void LiquidCrystal_I2CscrollDisplayRight(void) {
tsuparit 0:dbd7c46a32da 286 LiquidCrystal_I2Ccommand(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT);
tsuparit 0:dbd7c46a32da 287 }
tsuparit 0:dbd7c46a32da 288
tsuparit 0:dbd7c46a32da 289 // This is for text that flows Left to Right
tsuparit 0:dbd7c46a32da 290 void LiquidCrystal_I2CleftToRight(void) {
tsuparit 0:dbd7c46a32da 291 _displaymode |= LCD_ENTRYLEFT;
tsuparit 0:dbd7c46a32da 292 LiquidCrystal_I2Ccommand(LCD_ENTRYMODESET | _displaymode);
tsuparit 0:dbd7c46a32da 293 }
tsuparit 0:dbd7c46a32da 294
tsuparit 0:dbd7c46a32da 295 // This is for text that flows Right to Left
tsuparit 0:dbd7c46a32da 296 void LiquidCrystal_I2CrightToLeft(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 will 'right justify' text from the cursor
tsuparit 0:dbd7c46a32da 302 void LiquidCrystal_I2Cautoscroll(void) {
tsuparit 0:dbd7c46a32da 303 _displaymode |= LCD_ENTRYSHIFTINCREMENT;
tsuparit 0:dbd7c46a32da 304 LiquidCrystal_I2Ccommand(LCD_ENTRYMODESET | _displaymode);
tsuparit 0:dbd7c46a32da 305 }
tsuparit 0:dbd7c46a32da 306
tsuparit 0:dbd7c46a32da 307 // This will 'left justify' text from the cursor
tsuparit 0:dbd7c46a32da 308 void LiquidCrystal_I2CnoAutoscroll(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 // Allows us to fill the first 8 CGRAM locations
tsuparit 0:dbd7c46a32da 314 // with custom characters
tsuparit 0:dbd7c46a32da 315 void LiquidCrystal_I2CcreateChar(uint8_t location, uint8_t charmap[]) {
tsuparit 0:dbd7c46a32da 316 location &= 0x7; // we only have 8 locations 0-7
tsuparit 0:dbd7c46a32da 317 LiquidCrystal_I2Ccommand(LCD_SETCGRAMADDR | (location << 3));
tsuparit 0:dbd7c46a32da 318 for (int i=0; i<8; i++) {
tsuparit 0:dbd7c46a32da 319 //write(charmap[i]);
tsuparit 0:dbd7c46a32da 320 send(charmap[i], Rs);
tsuparit 0:dbd7c46a32da 321 }
tsuparit 0:dbd7c46a32da 322 }
tsuparit 0:dbd7c46a32da 323
tsuparit 0:dbd7c46a32da 324 // Turn the (optional) backlight off/on
tsuparit 0:dbd7c46a32da 325 void LiquidCrystal_I2CnoBacklight(void) {
tsuparit 0:dbd7c46a32da 326 _backlightval=LCD_NOBACKLIGHT;
tsuparit 0:dbd7c46a32da 327 expanderWrite(0);
tsuparit 0:dbd7c46a32da 328 }
tsuparit 0:dbd7c46a32da 329
tsuparit 0:dbd7c46a32da 330 void LiquidCrystal_I2Cbacklight(void) {
tsuparit 0:dbd7c46a32da 331 _backlightval=LCD_BACKLIGHT;
tsuparit 0:dbd7c46a32da 332 expanderWrite(0);
tsuparit 0:dbd7c46a32da 333 }
tsuparit 0:dbd7c46a32da 334
tsuparit 0:dbd7c46a32da 335
tsuparit 0:dbd7c46a32da 336
tsuparit 0:dbd7c46a32da 337 /*********** mid level commands, for sending data/cmds */
tsuparit 0:dbd7c46a32da 338
tsuparit 0:dbd7c46a32da 339 inline void LiquidCrystal_I2Ccommand(uint8_t value) {
tsuparit 0:dbd7c46a32da 340 send(value, 0);
tsuparit 0:dbd7c46a32da 341 }
tsuparit 0:dbd7c46a32da 342
tsuparit 0:dbd7c46a32da 343
tsuparit 0:dbd7c46a32da 344 /************ low level data pushing commands **********/
tsuparit 0:dbd7c46a32da 345
tsuparit 0:dbd7c46a32da 346 // write either command or data
tsuparit 0:dbd7c46a32da 347 void send(uint8_t value, uint8_t mode) {
tsuparit 0:dbd7c46a32da 348 uint8_t highnib=value&0xf0;
tsuparit 0:dbd7c46a32da 349 uint8_t lownib=(value<<4)&0xf0;
tsuparit 0:dbd7c46a32da 350 write4bits((highnib)|mode);
tsuparit 0:dbd7c46a32da 351 write4bits((lownib)|mode);
tsuparit 0:dbd7c46a32da 352 }
tsuparit 0:dbd7c46a32da 353
tsuparit 0:dbd7c46a32da 354 void write4bits(uint8_t value) {
tsuparit 0:dbd7c46a32da 355 expanderWrite(value);
tsuparit 0:dbd7c46a32da 356 pulseEnable(value);
tsuparit 0:dbd7c46a32da 357 }
tsuparit 0:dbd7c46a32da 358
tsuparit 0:dbd7c46a32da 359 void expanderWrite(uint8_t _data)
tsuparit 0:dbd7c46a32da 360 {
tsuparit 0:dbd7c46a32da 361
tsuparit 0:dbd7c46a32da 362 /*
tsuparit 0:dbd7c46a32da 363 Wire.beginTransmission(_Addr);
tsuparit 0:dbd7c46a32da 364 printIIC((int)(_data) | _backlightval);
tsuparit 0:dbd7c46a32da 365 Wire.endTransmission();
tsuparit 0:dbd7c46a32da 366
tsuparit 0:dbd7c46a32da 367 */
tsuparit 0:dbd7c46a32da 368 char data[2];
tsuparit 0:dbd7c46a32da 369 data[0]= _data | _backlightval;
tsuparit 0:dbd7c46a32da 370 // data[1]=val;
tsuparit 0:dbd7c46a32da 371 char result=Wire.write(_Addr<<1,data,1);
tsuparit 0:dbd7c46a32da 372
tsuparit 0:dbd7c46a32da 373 }
tsuparit 0:dbd7c46a32da 374
tsuparit 0:dbd7c46a32da 375 void pulseEnable(uint8_t _data){
tsuparit 0:dbd7c46a32da 376 expanderWrite(_data | En); // En high
tsuparit 0:dbd7c46a32da 377 delayMicroseconds(1); // enable pulse must be >450ns
tsuparit 0:dbd7c46a32da 378
tsuparit 0:dbd7c46a32da 379 expanderWrite(_data & ~En); // En low
tsuparit 0:dbd7c46a32da 380 delayMicroseconds(50); // commands need > 37us to settle
tsuparit 0:dbd7c46a32da 381 }
tsuparit 0:dbd7c46a32da 382
tsuparit 0:dbd7c46a32da 383
tsuparit 0:dbd7c46a32da 384 // Alias functions
tsuparit 0:dbd7c46a32da 385
tsuparit 0:dbd7c46a32da 386 void LiquidCrystal_I2Ccursor_on(){
tsuparit 0:dbd7c46a32da 387 LiquidCrystal_I2Ccursor();
tsuparit 0:dbd7c46a32da 388 }
tsuparit 0:dbd7c46a32da 389
tsuparit 0:dbd7c46a32da 390 void LiquidCrystal_I2Ccursor_off(){
tsuparit 0:dbd7c46a32da 391 LiquidCrystal_I2CnoCursor();
tsuparit 0:dbd7c46a32da 392 }
tsuparit 0:dbd7c46a32da 393
tsuparit 0:dbd7c46a32da 394 void LiquidCrystal_I2Cblink_on(){
tsuparit 0:dbd7c46a32da 395 LiquidCrystal_I2Cblink();
tsuparit 0:dbd7c46a32da 396 }
tsuparit 0:dbd7c46a32da 397
tsuparit 0:dbd7c46a32da 398 void LiquidCrystal_I2Cblink_off(){
tsuparit 0:dbd7c46a32da 399 LiquidCrystal_I2CnoBlink();
tsuparit 0:dbd7c46a32da 400 }
tsuparit 0:dbd7c46a32da 401
tsuparit 0:dbd7c46a32da 402 void LiquidCrystal_I2Cload_custom_character(uint8_t char_num, uint8_t *rows){
tsuparit 0:dbd7c46a32da 403 LiquidCrystal_I2CcreateChar(char_num, rows);
tsuparit 0:dbd7c46a32da 404 }
tsuparit 0:dbd7c46a32da 405
tsuparit 0:dbd7c46a32da 406 void LiquidCrystal_I2CsetBacklight(uint8_t new_val){
tsuparit 0:dbd7c46a32da 407 if(new_val){
tsuparit 0:dbd7c46a32da 408 LiquidCrystal_I2Cbacklight(); // turn backlight on
tsuparit 0:dbd7c46a32da 409 }else{
tsuparit 0:dbd7c46a32da 410 LiquidCrystal_I2CnoBacklight(); // turn backlight off
tsuparit 0:dbd7c46a32da 411 }
tsuparit 0:dbd7c46a32da 412 }
tsuparit 0:dbd7c46a32da 413 /*
tsuparit 0:dbd7c46a32da 414 void LiquidCrystal_I2Cprintstr(const char c[]){
tsuparit 0:dbd7c46a32da 415 //This function is not identical to the function used for "real" I2C displays
tsuparit 0:dbd7c46a32da 416 //it's here so the user sketch doesn't have to be changed
tsuparit 0:dbd7c46a32da 417 //print(c);
tsuparit 0:dbd7c46a32da 418 send(c, Rs);
tsuparit 0:dbd7c46a32da 419
tsuparit 0:dbd7c46a32da 420 }
tsuparit 0:dbd7c46a32da 421 */
tsuparit 0:dbd7c46a32da 422
tsuparit 0:dbd7c46a32da 423 void LCDI2C4Bit_printIn( char value[] )
tsuparit 0:dbd7c46a32da 424 {
tsuparit 0:dbd7c46a32da 425 for ( char *p = value; *p != 0; p++ )
tsuparit 0:dbd7c46a32da 426 {
tsuparit 0:dbd7c46a32da 427 //LCDI2C4Bit_print(*p);
tsuparit 0:dbd7c46a32da 428 send(*p, Rs);
tsuparit 0:dbd7c46a32da 429 }
tsuparit 0:dbd7c46a32da 430 }
tsuparit 0:dbd7c46a32da 431
tsuparit 0:dbd7c46a32da 432
tsuparit 0:dbd7c46a32da 433 /*
tsuparit 0:dbd7c46a32da 434 ize_t LiquidCrystal_I2C::write(uint8_t value) {
tsuparit 0:dbd7c46a32da 435 send(value, Rs);
tsuparit 0:dbd7c46a32da 436 return 0;
tsuparit 0:dbd7c46a32da 437 }
tsuparit 0:dbd7c46a32da 438
tsuparit 0:dbd7c46a32da 439 #else
tsuparit 0:dbd7c46a32da 440 #include "WProgram.h"
tsuparit 0:dbd7c46a32da 441
tsuparit 0:dbd7c46a32da 442 #define printIIC(args) Wire.send(args)
tsuparit 0:dbd7c46a32da 443 inline void LiquidCrystal_I2C::write(uint8_t value) {
tsuparit 0:dbd7c46a32da 444 send(value, Rs);
tsuparit 0:dbd7c46a32da 445 }
tsuparit 0:dbd7c46a32da 446 */
tsuparit 0:dbd7c46a32da 447