IICLCD_LOWCOST

Committer:
tsuparit
Date:
Mon May 18 09:37:54 2015 +0000
Revision:
2:bb20bb35536c
Parent:
1:83adfb305748
Child:
3:3468dc87d641
Add New Sensor ( micro-switch for part locking )

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