LCD
LiquidCrystal_I2C.cpp@0:f363e3d1f212, 2019-07-03 (annotated)
- Committer:
- firstsignupoftheweek
- Date:
- Wed Jul 03 09:51:08 2019 +0000
- Revision:
- 0:f363e3d1f212
LCD
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
firstsignupoftheweek | 0:f363e3d1f212 | 1 | #include "LiquidCrystal_I2C.h" |
firstsignupoftheweek | 0:f363e3d1f212 | 2 | #include "mbed.h" |
firstsignupoftheweek | 0:f363e3d1f212 | 3 | |
firstsignupoftheweek | 0:f363e3d1f212 | 4 | // When the display powers up, it is configured as follows: |
firstsignupoftheweek | 0:f363e3d1f212 | 5 | // |
firstsignupoftheweek | 0:f363e3d1f212 | 6 | // 1. Display clear |
firstsignupoftheweek | 0:f363e3d1f212 | 7 | // 2. Function set: |
firstsignupoftheweek | 0:f363e3d1f212 | 8 | // DL = 1; 8-bit interface data |
firstsignupoftheweek | 0:f363e3d1f212 | 9 | // N = 0; 1-line display |
firstsignupoftheweek | 0:f363e3d1f212 | 10 | // F = 0; 5x8 dot character font |
firstsignupoftheweek | 0:f363e3d1f212 | 11 | // 3. Display on/off control: |
firstsignupoftheweek | 0:f363e3d1f212 | 12 | // D = 0; Display off |
firstsignupoftheweek | 0:f363e3d1f212 | 13 | // C = 0; Cursor off |
firstsignupoftheweek | 0:f363e3d1f212 | 14 | // B = 0; Blinking off |
firstsignupoftheweek | 0:f363e3d1f212 | 15 | // 4. Entry mode set: |
firstsignupoftheweek | 0:f363e3d1f212 | 16 | // I/D = 1; Increment by 1 |
firstsignupoftheweek | 0:f363e3d1f212 | 17 | // S = 0; No shift |
firstsignupoftheweek | 0:f363e3d1f212 | 18 | // |
firstsignupoftheweek | 0:f363e3d1f212 | 19 | // Note, however, that resetting the Arduino doesn't reset the LCD, so we |
firstsignupoftheweek | 0:f363e3d1f212 | 20 | // can't assume that its in that state when a sketch starts (and the |
firstsignupoftheweek | 0:f363e3d1f212 | 21 | // LiquidCrystal constructor is called). |
firstsignupoftheweek | 0:f363e3d1f212 | 22 | |
firstsignupoftheweek | 0:f363e3d1f212 | 23 | |
firstsignupoftheweek | 0:f363e3d1f212 | 24 | I2C _i2c(PB_3, PB_10); // SDA, SCL |
firstsignupoftheweek | 0:f363e3d1f212 | 25 | |
firstsignupoftheweek | 0:f363e3d1f212 | 26 | LiquidCrystal_I2C::LiquidCrystal_I2C(unsigned char lcd_addr, unsigned char lcd_cols, unsigned char lcd_rows, unsigned char charsize) |
firstsignupoftheweek | 0:f363e3d1f212 | 27 | { |
firstsignupoftheweek | 0:f363e3d1f212 | 28 | _addr = lcd_addr; |
firstsignupoftheweek | 0:f363e3d1f212 | 29 | _cols = lcd_cols; |
firstsignupoftheweek | 0:f363e3d1f212 | 30 | _rows = lcd_rows; |
firstsignupoftheweek | 0:f363e3d1f212 | 31 | _charsize = charsize; |
firstsignupoftheweek | 0:f363e3d1f212 | 32 | _backlightval = LCD_BACKLIGHT; |
firstsignupoftheweek | 0:f363e3d1f212 | 33 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 34 | |
firstsignupoftheweek | 0:f363e3d1f212 | 35 | void LiquidCrystal_I2C::begin() { |
firstsignupoftheweek | 0:f363e3d1f212 | 36 | //Wire.begin(); |
firstsignupoftheweek | 0:f363e3d1f212 | 37 | _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS; |
firstsignupoftheweek | 0:f363e3d1f212 | 38 | |
firstsignupoftheweek | 0:f363e3d1f212 | 39 | if (_rows > 1) { |
firstsignupoftheweek | 0:f363e3d1f212 | 40 | _displayfunction |= LCD_2LINE; |
firstsignupoftheweek | 0:f363e3d1f212 | 41 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 42 | |
firstsignupoftheweek | 0:f363e3d1f212 | 43 | // for some 1 line displays you can select a 10 pixel high font |
firstsignupoftheweek | 0:f363e3d1f212 | 44 | if ((_charsize != 0) && (_rows == 1)) { |
firstsignupoftheweek | 0:f363e3d1f212 | 45 | _displayfunction |= LCD_5x10DOTS; |
firstsignupoftheweek | 0:f363e3d1f212 | 46 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 47 | |
firstsignupoftheweek | 0:f363e3d1f212 | 48 | // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION! |
firstsignupoftheweek | 0:f363e3d1f212 | 49 | // according to datasheet, we need at least 40ms after power rises above 2.7V |
firstsignupoftheweek | 0:f363e3d1f212 | 50 | // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50 |
firstsignupoftheweek | 0:f363e3d1f212 | 51 | wait_ms(50); |
firstsignupoftheweek | 0:f363e3d1f212 | 52 | |
firstsignupoftheweek | 0:f363e3d1f212 | 53 | // Now we pull both RS and R/W low to begin commands |
firstsignupoftheweek | 0:f363e3d1f212 | 54 | expanderWrite(_backlightval); // reset expanderand turn backlight off (Bit 8 =1) |
firstsignupoftheweek | 0:f363e3d1f212 | 55 | wait_ms(1000); |
firstsignupoftheweek | 0:f363e3d1f212 | 56 | |
firstsignupoftheweek | 0:f363e3d1f212 | 57 | //put the LCD into 4 bit mode |
firstsignupoftheweek | 0:f363e3d1f212 | 58 | // this is according to the hitachi HD44780 datasheet |
firstsignupoftheweek | 0:f363e3d1f212 | 59 | // figure 24, pg 46 |
firstsignupoftheweek | 0:f363e3d1f212 | 60 | |
firstsignupoftheweek | 0:f363e3d1f212 | 61 | // we start in 8bit mode, try to set 4 bit mode |
firstsignupoftheweek | 0:f363e3d1f212 | 62 | write4bits(0x03 << 4); |
firstsignupoftheweek | 0:f363e3d1f212 | 63 | wait_us(4500); // wait min 4.1ms |
firstsignupoftheweek | 0:f363e3d1f212 | 64 | |
firstsignupoftheweek | 0:f363e3d1f212 | 65 | // second try |
firstsignupoftheweek | 0:f363e3d1f212 | 66 | write4bits(0x03 << 4); |
firstsignupoftheweek | 0:f363e3d1f212 | 67 | wait_us(4500); // wait min 4.1ms |
firstsignupoftheweek | 0:f363e3d1f212 | 68 | |
firstsignupoftheweek | 0:f363e3d1f212 | 69 | // third go! |
firstsignupoftheweek | 0:f363e3d1f212 | 70 | write4bits(0x03 << 4); |
firstsignupoftheweek | 0:f363e3d1f212 | 71 | wait_us(150); |
firstsignupoftheweek | 0:f363e3d1f212 | 72 | |
firstsignupoftheweek | 0:f363e3d1f212 | 73 | // finally, set to 4-bit interface |
firstsignupoftheweek | 0:f363e3d1f212 | 74 | write4bits(0x02 << 4); |
firstsignupoftheweek | 0:f363e3d1f212 | 75 | |
firstsignupoftheweek | 0:f363e3d1f212 | 76 | // set # lines, font size, etc. |
firstsignupoftheweek | 0:f363e3d1f212 | 77 | command(LCD_FUNCTIONSET | _displayfunction); |
firstsignupoftheweek | 0:f363e3d1f212 | 78 | |
firstsignupoftheweek | 0:f363e3d1f212 | 79 | // turn the display on with no cursor or blinking default |
firstsignupoftheweek | 0:f363e3d1f212 | 80 | _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF; |
firstsignupoftheweek | 0:f363e3d1f212 | 81 | display(); |
firstsignupoftheweek | 0:f363e3d1f212 | 82 | |
firstsignupoftheweek | 0:f363e3d1f212 | 83 | // clear it off |
firstsignupoftheweek | 0:f363e3d1f212 | 84 | clear(); |
firstsignupoftheweek | 0:f363e3d1f212 | 85 | |
firstsignupoftheweek | 0:f363e3d1f212 | 86 | // Initialize to default text direction (for roman languages) |
firstsignupoftheweek | 0:f363e3d1f212 | 87 | _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT; |
firstsignupoftheweek | 0:f363e3d1f212 | 88 | |
firstsignupoftheweek | 0:f363e3d1f212 | 89 | // set the entry mode |
firstsignupoftheweek | 0:f363e3d1f212 | 90 | command(LCD_ENTRYMODESET | _displaymode); |
firstsignupoftheweek | 0:f363e3d1f212 | 91 | |
firstsignupoftheweek | 0:f363e3d1f212 | 92 | home(); |
firstsignupoftheweek | 0:f363e3d1f212 | 93 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 94 | |
firstsignupoftheweek | 0:f363e3d1f212 | 95 | /********** high level commands, for the user! */ |
firstsignupoftheweek | 0:f363e3d1f212 | 96 | void LiquidCrystal_I2C::clear(){ |
firstsignupoftheweek | 0:f363e3d1f212 | 97 | command(LCD_CLEARDISPLAY);// clear display, set cursor position to zero |
firstsignupoftheweek | 0:f363e3d1f212 | 98 | wait_us(2000); // this command takes a long time! |
firstsignupoftheweek | 0:f363e3d1f212 | 99 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 100 | |
firstsignupoftheweek | 0:f363e3d1f212 | 101 | void LiquidCrystal_I2C::home(){ |
firstsignupoftheweek | 0:f363e3d1f212 | 102 | command(LCD_RETURNHOME); // set cursor position to zero |
firstsignupoftheweek | 0:f363e3d1f212 | 103 | wait_us(2000); // this command takes a long time! |
firstsignupoftheweek | 0:f363e3d1f212 | 104 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 105 | |
firstsignupoftheweek | 0:f363e3d1f212 | 106 | void LiquidCrystal_I2C::setCursor(unsigned char col, unsigned char row){ |
firstsignupoftheweek | 0:f363e3d1f212 | 107 | int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 }; |
firstsignupoftheweek | 0:f363e3d1f212 | 108 | if (row > _rows) { |
firstsignupoftheweek | 0:f363e3d1f212 | 109 | row = _rows-1; // we count rows starting w/0 |
firstsignupoftheweek | 0:f363e3d1f212 | 110 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 111 | command(LCD_SETDDRAMADDR | (col + row_offsets[row])); |
firstsignupoftheweek | 0:f363e3d1f212 | 112 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 113 | |
firstsignupoftheweek | 0:f363e3d1f212 | 114 | // Turn the display on/off (quickly) |
firstsignupoftheweek | 0:f363e3d1f212 | 115 | void LiquidCrystal_I2C::noDisplay() { |
firstsignupoftheweek | 0:f363e3d1f212 | 116 | _displaycontrol &= ~LCD_DISPLAYON; |
firstsignupoftheweek | 0:f363e3d1f212 | 117 | command(LCD_DISPLAYCONTROL | _displaycontrol); |
firstsignupoftheweek | 0:f363e3d1f212 | 118 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 119 | void LiquidCrystal_I2C::display() { |
firstsignupoftheweek | 0:f363e3d1f212 | 120 | _displaycontrol |= LCD_DISPLAYON; |
firstsignupoftheweek | 0:f363e3d1f212 | 121 | command(LCD_DISPLAYCONTROL | _displaycontrol); |
firstsignupoftheweek | 0:f363e3d1f212 | 122 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 123 | |
firstsignupoftheweek | 0:f363e3d1f212 | 124 | // Turns the underline cursor on/off |
firstsignupoftheweek | 0:f363e3d1f212 | 125 | void LiquidCrystal_I2C::noCursor() { |
firstsignupoftheweek | 0:f363e3d1f212 | 126 | _displaycontrol &= ~LCD_CURSORON; |
firstsignupoftheweek | 0:f363e3d1f212 | 127 | command(LCD_DISPLAYCONTROL | _displaycontrol); |
firstsignupoftheweek | 0:f363e3d1f212 | 128 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 129 | void LiquidCrystal_I2C::cursor() { |
firstsignupoftheweek | 0:f363e3d1f212 | 130 | _displaycontrol |= LCD_CURSORON; |
firstsignupoftheweek | 0:f363e3d1f212 | 131 | command(LCD_DISPLAYCONTROL | _displaycontrol); |
firstsignupoftheweek | 0:f363e3d1f212 | 132 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 133 | |
firstsignupoftheweek | 0:f363e3d1f212 | 134 | // Turn on and off the blinking cursor |
firstsignupoftheweek | 0:f363e3d1f212 | 135 | void LiquidCrystal_I2C::noBlink() { |
firstsignupoftheweek | 0:f363e3d1f212 | 136 | _displaycontrol &= ~LCD_BLINKON; |
firstsignupoftheweek | 0:f363e3d1f212 | 137 | command(LCD_DISPLAYCONTROL | _displaycontrol); |
firstsignupoftheweek | 0:f363e3d1f212 | 138 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 139 | void LiquidCrystal_I2C::blink() { |
firstsignupoftheweek | 0:f363e3d1f212 | 140 | _displaycontrol |= LCD_BLINKON; |
firstsignupoftheweek | 0:f363e3d1f212 | 141 | command(LCD_DISPLAYCONTROL | _displaycontrol); |
firstsignupoftheweek | 0:f363e3d1f212 | 142 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 143 | |
firstsignupoftheweek | 0:f363e3d1f212 | 144 | // These commands scroll the display without changing the RAM |
firstsignupoftheweek | 0:f363e3d1f212 | 145 | void LiquidCrystal_I2C::scrollDisplayLeft(void) { |
firstsignupoftheweek | 0:f363e3d1f212 | 146 | command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT); |
firstsignupoftheweek | 0:f363e3d1f212 | 147 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 148 | void LiquidCrystal_I2C::scrollDisplayRight(void) { |
firstsignupoftheweek | 0:f363e3d1f212 | 149 | command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT); |
firstsignupoftheweek | 0:f363e3d1f212 | 150 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 151 | |
firstsignupoftheweek | 0:f363e3d1f212 | 152 | // This is for text that flows Left to Right |
firstsignupoftheweek | 0:f363e3d1f212 | 153 | void LiquidCrystal_I2C::leftToRight(void) { |
firstsignupoftheweek | 0:f363e3d1f212 | 154 | _displaymode |= LCD_ENTRYLEFT; |
firstsignupoftheweek | 0:f363e3d1f212 | 155 | command(LCD_ENTRYMODESET | _displaymode); |
firstsignupoftheweek | 0:f363e3d1f212 | 156 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 157 | |
firstsignupoftheweek | 0:f363e3d1f212 | 158 | // This is for text that flows Right to Left |
firstsignupoftheweek | 0:f363e3d1f212 | 159 | void LiquidCrystal_I2C::rightToLeft(void) { |
firstsignupoftheweek | 0:f363e3d1f212 | 160 | _displaymode &= ~LCD_ENTRYLEFT; |
firstsignupoftheweek | 0:f363e3d1f212 | 161 | command(LCD_ENTRYMODESET | _displaymode); |
firstsignupoftheweek | 0:f363e3d1f212 | 162 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 163 | |
firstsignupoftheweek | 0:f363e3d1f212 | 164 | // This will 'right justify' text from the cursor |
firstsignupoftheweek | 0:f363e3d1f212 | 165 | void LiquidCrystal_I2C::autoscroll(void) { |
firstsignupoftheweek | 0:f363e3d1f212 | 166 | _displaymode |= LCD_ENTRYSHIFTINCREMENT; |
firstsignupoftheweek | 0:f363e3d1f212 | 167 | command(LCD_ENTRYMODESET | _displaymode); |
firstsignupoftheweek | 0:f363e3d1f212 | 168 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 169 | |
firstsignupoftheweek | 0:f363e3d1f212 | 170 | // This will 'left justify' text from the cursor |
firstsignupoftheweek | 0:f363e3d1f212 | 171 | void LiquidCrystal_I2C::noAutoscroll(void) { |
firstsignupoftheweek | 0:f363e3d1f212 | 172 | _displaymode &= ~LCD_ENTRYSHIFTINCREMENT; |
firstsignupoftheweek | 0:f363e3d1f212 | 173 | command(LCD_ENTRYMODESET | _displaymode); |
firstsignupoftheweek | 0:f363e3d1f212 | 174 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 175 | |
firstsignupoftheweek | 0:f363e3d1f212 | 176 | // Allows us to fill the first 8 CGRAM locations |
firstsignupoftheweek | 0:f363e3d1f212 | 177 | // with custom characters |
firstsignupoftheweek | 0:f363e3d1f212 | 178 | void LiquidCrystal_I2C::createChar(unsigned char location, unsigned char charmap[]) { |
firstsignupoftheweek | 0:f363e3d1f212 | 179 | location &= 0x7; // we only have 8 locations 0-7 |
firstsignupoftheweek | 0:f363e3d1f212 | 180 | command(LCD_SETCGRAMADDR | (location << 3)); |
firstsignupoftheweek | 0:f363e3d1f212 | 181 | for (int i=0; i<8; i++) { |
firstsignupoftheweek | 0:f363e3d1f212 | 182 | write(charmap[i]); |
firstsignupoftheweek | 0:f363e3d1f212 | 183 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 184 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 185 | |
firstsignupoftheweek | 0:f363e3d1f212 | 186 | // Turn the (optional) backlight off/on |
firstsignupoftheweek | 0:f363e3d1f212 | 187 | void LiquidCrystal_I2C::noBacklight(void) { |
firstsignupoftheweek | 0:f363e3d1f212 | 188 | _backlightval=LCD_NOBACKLIGHT; |
firstsignupoftheweek | 0:f363e3d1f212 | 189 | expanderWrite(0); |
firstsignupoftheweek | 0:f363e3d1f212 | 190 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 191 | |
firstsignupoftheweek | 0:f363e3d1f212 | 192 | void LiquidCrystal_I2C::backlight(void) { |
firstsignupoftheweek | 0:f363e3d1f212 | 193 | _backlightval=LCD_BACKLIGHT; |
firstsignupoftheweek | 0:f363e3d1f212 | 194 | expanderWrite(0); |
firstsignupoftheweek | 0:f363e3d1f212 | 195 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 196 | bool LiquidCrystal_I2C::getBacklight() { |
firstsignupoftheweek | 0:f363e3d1f212 | 197 | return _backlightval == LCD_BACKLIGHT; |
firstsignupoftheweek | 0:f363e3d1f212 | 198 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 199 | |
firstsignupoftheweek | 0:f363e3d1f212 | 200 | |
firstsignupoftheweek | 0:f363e3d1f212 | 201 | /*********** mid level commands, for sending data/cmds */ |
firstsignupoftheweek | 0:f363e3d1f212 | 202 | |
firstsignupoftheweek | 0:f363e3d1f212 | 203 | inline void LiquidCrystal_I2C::command(unsigned char value) { |
firstsignupoftheweek | 0:f363e3d1f212 | 204 | send(value, 0); |
firstsignupoftheweek | 0:f363e3d1f212 | 205 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 206 | |
firstsignupoftheweek | 0:f363e3d1f212 | 207 | inline int LiquidCrystal_I2C::write(unsigned char value) { |
firstsignupoftheweek | 0:f363e3d1f212 | 208 | send(value, Rs); |
firstsignupoftheweek | 0:f363e3d1f212 | 209 | return 1; |
firstsignupoftheweek | 0:f363e3d1f212 | 210 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 211 | |
firstsignupoftheweek | 0:f363e3d1f212 | 212 | |
firstsignupoftheweek | 0:f363e3d1f212 | 213 | /************ low level data pushing commands **********/ |
firstsignupoftheweek | 0:f363e3d1f212 | 214 | |
firstsignupoftheweek | 0:f363e3d1f212 | 215 | // write either command or data |
firstsignupoftheweek | 0:f363e3d1f212 | 216 | void LiquidCrystal_I2C::send(unsigned char value, unsigned char mode) { |
firstsignupoftheweek | 0:f363e3d1f212 | 217 | unsigned char highnib=value&0xf0; |
firstsignupoftheweek | 0:f363e3d1f212 | 218 | unsigned char lownib=(value<<4)&0xf0; |
firstsignupoftheweek | 0:f363e3d1f212 | 219 | write4bits((highnib)|mode); |
firstsignupoftheweek | 0:f363e3d1f212 | 220 | write4bits((lownib)|mode); |
firstsignupoftheweek | 0:f363e3d1f212 | 221 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 222 | |
firstsignupoftheweek | 0:f363e3d1f212 | 223 | void LiquidCrystal_I2C::write4bits(unsigned char value) { |
firstsignupoftheweek | 0:f363e3d1f212 | 224 | expanderWrite(value); |
firstsignupoftheweek | 0:f363e3d1f212 | 225 | pulseEnable(value); |
firstsignupoftheweek | 0:f363e3d1f212 | 226 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 227 | |
firstsignupoftheweek | 0:f363e3d1f212 | 228 | void LiquidCrystal_I2C::expanderWrite(unsigned char _data){ |
firstsignupoftheweek | 0:f363e3d1f212 | 229 | char data_write[2]; |
firstsignupoftheweek | 0:f363e3d1f212 | 230 | data_write[0] = _data | _backlightval; |
firstsignupoftheweek | 0:f363e3d1f212 | 231 | //Wire.beginTransmission(_addr); |
firstsignupoftheweek | 0:f363e3d1f212 | 232 | //Wire.write((int)(_data) | _backlightval); |
firstsignupoftheweek | 0:f363e3d1f212 | 233 | //Wire.endTransmission(); |
firstsignupoftheweek | 0:f363e3d1f212 | 234 | _i2c.write(_addr, data_write, 1, 0); |
firstsignupoftheweek | 0:f363e3d1f212 | 235 | _i2c.stop(); |
firstsignupoftheweek | 0:f363e3d1f212 | 236 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 237 | |
firstsignupoftheweek | 0:f363e3d1f212 | 238 | void LiquidCrystal_I2C::pulseEnable(unsigned char _data){ |
firstsignupoftheweek | 0:f363e3d1f212 | 239 | expanderWrite(_data | En); // En high |
firstsignupoftheweek | 0:f363e3d1f212 | 240 | wait_us(1); // enable pulse must be >450ns |
firstsignupoftheweek | 0:f363e3d1f212 | 241 | |
firstsignupoftheweek | 0:f363e3d1f212 | 242 | expanderWrite(_data & ~En); // En low |
firstsignupoftheweek | 0:f363e3d1f212 | 243 | wait_us(50); // commands need > 37us to settle |
firstsignupoftheweek | 0:f363e3d1f212 | 244 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 245 | |
firstsignupoftheweek | 0:f363e3d1f212 | 246 | void LiquidCrystal_I2C::load_custom_character(unsigned char char_num, unsigned char *rows){ |
firstsignupoftheweek | 0:f363e3d1f212 | 247 | createChar(char_num, rows); |
firstsignupoftheweek | 0:f363e3d1f212 | 248 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 249 | |
firstsignupoftheweek | 0:f363e3d1f212 | 250 | void LiquidCrystal_I2C::setBacklight(unsigned char new_val){ |
firstsignupoftheweek | 0:f363e3d1f212 | 251 | if (new_val) { |
firstsignupoftheweek | 0:f363e3d1f212 | 252 | backlight(); // turn backlight on |
firstsignupoftheweek | 0:f363e3d1f212 | 253 | } else { |
firstsignupoftheweek | 0:f363e3d1f212 | 254 | noBacklight(); // turn backlight off |
firstsignupoftheweek | 0:f363e3d1f212 | 255 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 256 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 257 | |
firstsignupoftheweek | 0:f363e3d1f212 | 258 | void LiquidCrystal_I2C::printstr(const char c[]){ |
firstsignupoftheweek | 0:f363e3d1f212 | 259 | //This function is not identical to the function used for "real" I2C displays |
firstsignupoftheweek | 0:f363e3d1f212 | 260 | //it's here so the user sketch doesn't have to be changed |
firstsignupoftheweek | 0:f363e3d1f212 | 261 | //print(c); |
firstsignupoftheweek | 0:f363e3d1f212 | 262 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 263 | |
firstsignupoftheweek | 0:f363e3d1f212 | 264 | int LiquidCrystal_I2C::print(const char* text) { |
firstsignupoftheweek | 0:f363e3d1f212 | 265 | |
firstsignupoftheweek | 0:f363e3d1f212 | 266 | while (*text !=0) { |
firstsignupoftheweek | 0:f363e3d1f212 | 267 | //_putc(*text); |
firstsignupoftheweek | 0:f363e3d1f212 | 268 | send(*text, Rs); |
firstsignupoftheweek | 0:f363e3d1f212 | 269 | text++; |
firstsignupoftheweek | 0:f363e3d1f212 | 270 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 271 | return 0; |
firstsignupoftheweek | 0:f363e3d1f212 | 272 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 273 | |
firstsignupoftheweek | 0:f363e3d1f212 | 274 | /* |
firstsignupoftheweek | 0:f363e3d1f212 | 275 | void lcd_dat(unsigned char p) |
firstsignupoftheweek | 0:f363e3d1f212 | 276 | { |
firstsignupoftheweek | 0:f363e3d1f212 | 277 | PORTC |= (1 << RS)|(1 << EN); // RS = 1, EN = 1 (начало записи команды в LCD) |
firstsignupoftheweek | 0:f363e3d1f212 | 278 | PORTD = p; // Вывод команды на шину DB0-7 LCD |
firstsignupoftheweek | 0:f363e3d1f212 | 279 | _delay_us(100); // Длительность сигнала EN |
firstsignupoftheweek | 0:f363e3d1f212 | 280 | PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) |
firstsignupoftheweek | 0:f363e3d1f212 | 281 | _delay_us(100); // Пауза для выполнения команды |
firstsignupoftheweek | 0:f363e3d1f212 | 282 | } |
firstsignupoftheweek | 0:f363e3d1f212 | 283 | */ |