#include "LCD_I2C.h" #include //------------------------------ void send(LCD_I2C*, uint8_t, uint8_t); void write4bits(LCD_I2C*, uint8_t); void expanderWrite(LCD_I2C*, uint8_t); void pulseEnable(LCD_I2C*, uint8_t); void LCD_delay(unsigned long millisec){ usleep(1000 * millisec); } void LCD_delayMicro(unsigned long micro){ usleep(micro); } //------------------------------ void LCD_init(LCD_I2C* lcd_i2c, i2c* i2cbus, uint8_t lcd_addr, uint8_t lcd_cols, uint8_t lcd_rows){ LCD_initEx(lcd_i2c, i2cbus, lcd_addr, lcd_cols, lcd_rows, LCD_5x8DOTS); } void LCD_initEx(LCD_I2C* lcd_i2c, i2c* i2cbus, uint8_t lcd_addr, uint8_t lcd_cols, uint8_t lcd_rows, uint8_t charsize){ lcd_i2c->_addr = lcd_addr; lcd_i2c->_cols = lcd_cols; lcd_i2c->_rows = lcd_rows; lcd_i2c->_charsize = charsize; lcd_i2c->_backlightval = LCD_BACKLIGHT; lcd_i2c->_i2cbus = i2cbus; } void LCD_begin(LCD_I2C* lcd_i2c){ lcd_i2c->_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS; if (lcd_i2c->_rows > 1) lcd_i2c->_displayfunction |= LCD_2LINE; if ((lcd_i2c->_charsize != 0) && (lcd_i2c->_rows == 1)) lcd_i2c->_displayfunction |= LCD_5x10DOTS; LCD_delay(50); expanderWrite(lcd_i2c, lcd_i2c->_backlightval); LCD_delay(1000); write4bits(lcd_i2c, 0x03 << 4); LCD_delayMicro(4500); write4bits(lcd_i2c, 0x03 << 4); LCD_delayMicro(4500); write4bits(lcd_i2c, 0x03 << 4); LCD_delayMicro(150); write4bits(lcd_i2c, 0x02 << 4); LCD_command(lcd_i2c, LCD_FUNCTIONSET | lcd_i2c->_displayfunction); lcd_i2c->_displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF; LCD_display(lcd_i2c); LCD_clear(lcd_i2c); lcd_i2c->_displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT; LCD_command(lcd_i2c, LCD_ENTRYMODESET | lcd_i2c->_displaymode); LCD_home(lcd_i2c); } void LCD_clear(LCD_I2C* lcd_i2c){ LCD_command(lcd_i2c, LCD_CLEARDISPLAY); LCD_delayMicro(2000); } void LCD_home(LCD_I2C* lcd_i2c){ LCD_command(lcd_i2c, LCD_RETURNHOME); LCD_delayMicro(2000); } void LCD_noDisplay(LCD_I2C* lcd_i2c){ lcd_i2c->_displaycontrol &= ~LCD_DISPLAYON; LCD_command(lcd_i2c, LCD_DISPLAYCONTROL | lcd_i2c->_displaycontrol); } void LCD_display(LCD_I2C* lcd_i2c){ lcd_i2c->_displaycontrol |= LCD_DISPLAYON; LCD_command(lcd_i2c, LCD_DISPLAYCONTROL | lcd_i2c->_displaycontrol); } void LCD_noBlink(LCD_I2C* lcd_i2c){ lcd_i2c->_displaycontrol &= ~LCD_BLINKON; LCD_command(lcd_i2c, LCD_DISPLAYCONTROL | lcd_i2c->_displaycontrol); } void LCD_blink(LCD_I2C* lcd_i2c){ lcd_i2c->_displaycontrol |= LCD_BLINKON; LCD_command(lcd_i2c, LCD_DISPLAYCONTROL | lcd_i2c->_displaycontrol); } void LCD_noCursor(LCD_I2C* lcd_i2c){ lcd_i2c->_displaycontrol &= ~LCD_CURSORON; LCD_command(lcd_i2c, LCD_DISPLAYCONTROL | lcd_i2c->_displaycontrol); } void LCD_cursor(LCD_I2C* lcd_i2c){ lcd_i2c->_displaycontrol |= LCD_CURSORON; LCD_command(lcd_i2c, LCD_DISPLAYCONTROL | lcd_i2c->_displaycontrol); } void LCD_scrollDisplayLeft(LCD_I2C* lcd_i2c){ LCD_command(lcd_i2c, LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT); } void LCD_scrollDisplayRight(LCD_I2C* lcd_i2c){ LCD_command(lcd_i2c, LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT); } //void LCD_printLeft(LCD_I2C* lcd_i2c){} //void LCD_printRight(LCD_I2C* lcd_i2c){} void LCD_leftToRight(LCD_I2C* lcd_i2c){ lcd_i2c->_displaymode |= LCD_ENTRYLEFT; LCD_command(lcd_i2c, LCD_ENTRYMODESET | lcd_i2c->_displaymode); } void LCD_rightToLeft(LCD_I2C* lcd_i2c){ lcd_i2c->_displaymode &= ~LCD_ENTRYLEFT; LCD_command(lcd_i2c, LCD_ENTRYMODESET | lcd_i2c->_displaymode); } //void LCD_shiftIncrement(LCD_I2C* lcd_i2c){} //void LCD_shiftDecrement(LCD_I2C* lcd_i2c){} void LCD_noBacklight(LCD_I2C* lcd_i2c){ lcd_i2c->_backlightval=LCD_NOBACKLIGHT; expanderWrite(lcd_i2c, 0); } void LCD_backlight(LCD_I2C* lcd_i2c){ lcd_i2c->_backlightval=LCD_BACKLIGHT; expanderWrite(lcd_i2c, 0); } bool LCD_getBacklight(LCD_I2C* lcd_i2c){ return lcd_i2c->_backlightval == LCD_BACKLIGHT; } void LCD_autoscroll(LCD_I2C* lcd_i2c){ lcd_i2c->_displaymode |= LCD_ENTRYSHIFTINCREMENT; LCD_command(lcd_i2c, LCD_ENTRYMODESET | lcd_i2c->_displaymode); } void LCD_noAutoscroll(LCD_I2C* lcd_i2c){ lcd_i2c->_displaymode &= ~LCD_ENTRYSHIFTINCREMENT; LCD_command(lcd_i2c, LCD_ENTRYMODESET | lcd_i2c->_displaymode); } void LCD_createChar(LCD_I2C* lcd_i2c, uint8_t location, uint8_t charmap[]){ location &= 0x7; // we only have 8 locations 0-7 LCD_command(lcd_i2c, LCD_SETCGRAMADDR | (location << 3)); for (int i=0; i<8; i++) LCD_write(lcd_i2c, charmap[i]); } void LCD_setCursor(LCD_I2C* lcd_i2c, uint8_t col, uint8_t row){ int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 }; if (row > lcd_i2c->_rows) row = lcd_i2c->_rows-1; // we count rows starting w/0 LCD_command(lcd_i2c, LCD_SETDDRAMADDR | (col + row_offsets[row])); } void LCD_command(LCD_I2C* lcd_i2c, uint8_t value){ send(lcd_i2c, value, 0); } int LCD_write(LCD_I2C* lcd_i2c, uint8_t value){ send(lcd_i2c, value, Rs); return 1; } void LCD_blink_on(LCD_I2C* lcd_i2c) { LCD_blink(lcd_i2c); } void LCD_blink_off(LCD_I2C* lcd_i2c) { LCD_noBlink(lcd_i2c); } void LCD_cursor_on(LCD_I2C* lcd_i2c) { LCD_cursor(lcd_i2c); } void LCD_cursor_off(LCD_I2C* lcd_i2c) { LCD_noCursor(lcd_i2c); } void LCD_setBacklight(LCD_I2C* lcd_i2c, uint8_t new_val){ if (new_val) LCD_backlight(lcd_i2c); // turn backlight on else LCD_noBacklight(lcd_i2c); // turn backlight off } void LCD_load_custom_character(LCD_I2C* lcd_i2c, uint8_t char_num, uint8_t *rows){ LCD_createChar(lcd_i2c, char_num, rows); } void LCD_printstr(LCD_I2C* lcd_i2c, const char c[]){ for (size_t i=0; i_i2cbus); //address { uint8_t i2cAddr = lcd_i2c->_addr; i2cAddr <<= 1; i2cAddr &= -2; i2c_writeByte(lcd_i2c->_i2cbus, i2cAddr); } //data i2c_writeByte(lcd_i2c->_i2cbus, (int)(_data) | lcd_i2c->_backlightval); i2c_stop(lcd_i2c->_i2cbus); } void pulseEnable(LCD_I2C* lcd_i2c, uint8_t _data){ expanderWrite(lcd_i2c, _data | En); LCD_delayMicro(1); expanderWrite(lcd_i2c, _data & ~En); LCD_delayMicro(50); } //------------------------------