http://uk.farnell.com/batron/bthq21605v-cog-fsre-i2c/lcd-module-alphanumeric-2x16/dp/1220409
Dependents: PCF2119_16X2_LCD_test LPC1768BagSensor
Diff: PCF2119_16X2_LCD.cpp
- Revision:
- 0:581d2def0734
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PCF2119_16X2_LCD.cpp Fri May 13 13:25:10 2011 +0000 @@ -0,0 +1,142 @@ +#include "PC2119_16X2_LCD.h" +#include <stdarg.h> + +void PC2119_16X2_LCD::Init() { + // reset the LCD using external reset pin + _reset = 1; + wait_us(300); + _reset = 0; + wait_us(12000); + + char buf[15]; + buf[0] = INSTRUCTION_CTRL_BYTE; + buf[1] = (FUNCTION_SET | 0x01); // Function set + extended instruction set + buf[2] = CURSOR_DISLPAY_SHIFT; + buf[3] = ICON_CTRL; + buf[4] = VLCD_MULTIPLIER; //set Vlcd multiplier + buf[5] = VLCD_CONTRAST; //set Vlcd Contrast + + buf[6] = FUNCTION_SET; // basic instructions + buf[7] = DISPLAY_CTL; + buf[8] = ENTRY_MODE; + buf[9] = CLEAR_DISPLAY; + + _i2c.write(LCD_I2C_ADR, buf, 10); +} + + +PC2119_16X2_LCD::PC2119_16X2_LCD(PinName p_sda, PinName p_scl, PinName p_reset) : _i2c(p_sda, p_scl), _reset(p_reset) { + + PC2119_16X2_LCD::Init(); +} + +PC2119_16X2_LCD::PC2119_16X2_LCD(I2C& p_i2c, PinName p_reset) : _i2c(p_i2c), _reset(p_reset) { + + PC2119_16X2_LCD::Init(); + +} + +char PC2119_16X2_LCD::ascii_to_lcd(char ch) { + char c = BLANK_CHAR; // default: white space + + if ((ch>=' ') & (ch<='?')) + c = ASCII_OFFSET + ch; + if ((ch>='A') & (ch<='Z')) + c = ASCII_OFFSET + ch; + if ((ch>='a') & (ch<='z')) + c = ASCII_OFFSET + ch; + return c; +} + +void PC2119_16X2_LCD::write_xy(char c, char row, char column, bool raw) { + char buf[0x10]; + char adr; + + if (row == 0) // line offset + adr = column; + else + adr = DATA_CTRL_BYTE + column; + + buf[0] = INSTRUCTION_CTRL_BYTE; // Enter function setting + buf[1] = 0x80 + adr; // LCD adr counter set to "adr" + + _i2c.write(LCD_I2C_ADR,(char *)buf,2); + + buf[0] = DATA_CTRL_BYTE; // write to DDRAM + buf[1] = raw ? c : ascii_to_lcd(c); + + _i2c.write(LCD_I2C_ADR,(char *)buf,2); +} + +void PC2119_16X2_LCD::clear_line(char row) { + if (row == 0 || row == 1) { + char i=0; + do + write_xy(BLANK_CHAR, row, i); + while ((i++<16)); + } +} + +void PC2119_16X2_LCD::clear_display(void) { + clear_line(0); // clear 1st line + clear_line(1); // clear 2nd line + return; +} + +void PC2119_16X2_LCD::write(char *b) { + char buf[0x60]; + int a; + + buf[0]=INSTRUCTION_CTRL_BYTE; + buf[1]=0x80; + _i2c.write(LCD_I2C_ADR,(char *)buf,2); + + a=0; + buf[0]=DATA_CTRL_BYTE; + + while (a!=strlen(b)) { + buf[a+1]=ascii_to_lcd(b[a]); + a++; + } + buf[a+1]=INSTRUCTION_CTRL_BYTE; + + _i2c.write(LCD_I2C_ADR,buf,strlen(b)+1); + + buf[0]=0x80; + buf[1]=0x02; + _i2c.write(LCD_I2C_ADR,(char *)buf,2); +} + +void PC2119_16X2_LCD::printf(const char * format, ... ) { + // create and start the va_list + va_list listPointer ; + va_start( listPointer, format ) ; + + // vsprintf is an example of + // a function that works with + // an "already started" va_list + static char buf[ 1024 ] ; + vsprintf( buf, format, listPointer ) ; + + return write(buf); +} + +void PC2119_16X2_LCD::flip_display() { + _i2c.start(); + _i2c.write(LCD_I2C_ADR); + _i2c.write(INSTRUCTION_CTRL_BYTE); // Control byte for Instruction + _i2c.write(FUNCTION_SET | 0x01); // extended instruction mode + _i2c.write(0x07); // P=1; Q=1; + _i2c.write(FUNCTION_SET); + _i2c.stop(); +} + +void PC2119_16X2_LCD::unflip_display() { + _i2c.start(); + _i2c.write(LCD_I2C_ADR); + _i2c.write(INSTRUCTION_CTRL_BYTE); // Control byte for Instruction + _i2c.write(FUNCTION_SET | 0x01); + _i2c.write(0x04); // P=0; Q=0; + _i2c.write(FUNCTION_SET); + _i2c.stop(); +} \ No newline at end of file