LCD

Dependents:   stofzuigrobot

Committer:
firstsignupoftheweek
Date:
Wed Jul 03 09:51:08 2019 +0000
Revision:
0:f363e3d1f212
LCD

Who changed what in which revision?

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