Library for the I2C connected LCD display EA DOGM204.
Example use of the LCD library.
main.cpp
include "mbed.h" #include "lcd_DOGM204_i2c.h" DOGM204I2C lcd(P0_0, P0_1, 0, 100000); int main() { lcd.init(); // Initialize display lcd.cls(); // Clear display lcd.display_set(DOGM204I2C::LCD_DISPLAY_ON); // optional | LCD_CURSOR_ON | LCD_BLINK_ON lcd.set_pos(DOGM204I2C::LCD_LINE1); lcd.write((char *)"*** Hello world *** "); lcd.set_pos(DOGM204I2C::LCD_LINE2); lcd.write((char *)"01234567890123456789"); lcd.set_pos(DOGM204I2C::LCD_LINE3); lcd.write((char *)"ABCDEFGHIJKLMNOPQRST"); lcd.set_pos(DOGM204I2C::LCD_LINE4); lcd.write((char *)"abcdefghijklmnopqrst"); }
Diff: lcd_DOGM204_i2c.cpp
- Revision:
- 0:ee339d42b34d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lcd_DOGM204_i2c.cpp Thu Jan 02 16:20:12 2020 +0000 @@ -0,0 +1,178 @@ +/** EA DOGM204 LCD class + * + * Provides access to the I2C connected Electronic Assembly DOGM204 LCD display + * with SSD1803A controller (www.lcd-module.de) + * + * Version: 1.00.000 + * Date : 02.01.2020 + * Author: Marjan Hanc, www.m-hub.eu + * + * Note: This library does not support SPI and 4/8-Bit I/O modes of the display. + * It is assumed, that the RS address selection pin is statically connected + * either to the GND (SA=0) or VCC (SA=1). + **/ + +#include "lcd_DOGM204_i2c.h" +#include "mbed.h" + +/*\brief Initialises the LCD with respective I2C interface + \param sda I2C SDA pin mapping + \param scl I2C SCL pin mapping + \param SA SA0 (selector) address of the LCD display + \param freq Frequency of the I2C clock +*/ + +DOGM204I2C::DOGM204I2C(PinName sda, PinName scl, char SA, int frequency) : i2c(sda,scl) { + + if (SA > 1) + error("DOGM204I2C: SA is out of range, must be 0..1\n"); + else + _baseAdr = LCD_ADR + (SA << 1); // sets the base address of the LCD + + if (frequency > Frequency_400KHz) + error("DOGM204I2C: I2C frequency out of range, must be less than 400 kHz\n"); + + i2c.frequency(frequency); +} + +/*\brief Sends command with one data byte to the LCD + \param cmd LCD command + \param dta Data byte + \return status Returns true, if the command was successful +*/ + +bool DOGM204I2C::lcd_i2c_write(char cmd, char dta) +{ + char data[] = {cmd, dta}; + + if (i2c.write(_baseAdr, data, 2)) { + + return false; + } + + return true; +} + +/*\brief Reads one byte (command status) of the LCD + \param cmd LCD command + \return data Data byte +*/ + +char DOGM204I2C::lcd_i2c_read(char cmd) +{ + char data[] = {cmd}; + + i2c.write(_baseAdr, data, 1); // note, that the base address occupies bits b1..b7 + i2c.read(_baseAdr + 1, data, 1); // and that the b0 is R=1/W=0 + + return(data[0]); +} + +/*\brief Writes single command to the LCD by checking the display status first + \note The command is not fail safe. If the display doesn't return "not busy" it might hang forever + \param cmd LCD command + \return stat Returns true if successful +*/ + +bool DOGM204I2C::lcd_write_cmd(char data) +{ + //check and wait, if LCD is busy + while(lcd_i2c_read(LCD_STATUS) & LCD_BUSY); + + // write command, control byte C0=0 & D/C = 0 + return lcd_i2c_write(0x80, data); +} + +/*\brief Writes data byte to the LCD by checking the display's busy flag BF first + \note The command is not fail safe. If the display doesn't return "not busy" it might hang forever. + \param data LCD data + \return stat Returns true if successful +*/ +bool DOGM204I2C::lcd_write_data(char data) +{ + //check and wait, if LCD is busy + while(lcd_i2c_read(LCD_STATUS) & LCD_BUSY); + //write data, control byte C0=0 & D/C = 1 + return lcd_i2c_write(0x40, data); +} + +// -- Public functions -- + +/* \brief Sets the LCD display to the provided mode + * \param mode LCD_DISPLAY_ON|OFF LCD_CURSOR_ON|OFF LCD_BLINK_ON|OFF + */ +void DOGM204I2C::display_set(char mode) +{ + if (!lcd_write_cmd(0x08+mode)) + error("DOGM204I2C: Write command in lcd_display_set() failed!\n"); +} + +/* \brief Sets the cursor to the given position counted from the origin + * \param pos position + */ +void DOGM204I2C::set_pos(char pos) +{ + if (!lcd_write_cmd(LCD_HOME+pos)) + error("DOGM204I2C: Write command in lcd_set_pos() failed!\n"); +} + +/* \brief Writes a single character at given position in the given line + * \param pos LCD_LINEx+position + */ +void DOGM204I2C::write_char(char line, char pos, char ch) +{ + char lcdpos = pos + 0x20 * line; + + if (!lcd_write_cmd(lcdpos)) + error("DOGM204I2C: Write command in lcd_write_char() failed!\n"); + else + if (!lcd_write_data(ch)) + error("DOGM204I2C: Write data in lcd_write_char() failed!\n"); +} + +/* \brief Writes null terminated string to the LCD + * \param s Null terminated string + */ +void DOGM204I2C::write(char *s) +{ + while(*s) + { + if (!lcd_write_data(*s++)) { + error("DOGM204I2C: Write data in lcd_write() failed!\n"); + break; + } + } +} + +/* \brief Clears the LCD display and sets the cursor to the top-left position + */ +void DOGM204I2C::cls() +{ + lcd_write_cmd(LCD_CLEAR); // Clear display + lcd_write_cmd(LCD_RTHOME); // Set cursor position to home (top left) +} + +/* \brief Initializes LCD display + * \note This sequence will set 4 lines, 5 dots, and top orientation at maximum + contrast with cursor off + */ +void DOGM204I2C::init() +{ + lcd_write_cmd(0x3A); // 8-Bit data length, extension Bit RE=1; REV=0 + lcd_write_cmd(LCD_4LINE_MODE | LCD_FONT_5DOT ); // 4 lines, 5 dots charset + + lcd_write_cmd(0x80); // Pixel shift 0 + + lcd_write_cmd(LCD_TOPVIEW); // Set LCD orientation + lcd_write_cmd(0x1E); // Bias setting BS1=1 + + lcd_write_cmd(0x39); // 8-Bit data length extension Bit RE=0; IS=1 + lcd_write_cmd(0x1B); // BS0=1 -> Bias=1/6 + + lcd_write_cmd(0x6E); // Divider ON and set value + lcd_write_cmd(0x57); // Booster ON and set contrast (BB1=C5, DB0=C4) + lcd_write_cmd(0x7B); // Set optimum contrast (DB3-DB0=C3-C0) + + lcd_write_cmd(0x38); // 8-Bit data length extension Bit RE=0; IS=0 +} +