http://uk.farnell.com/batron/bthq21605v-cog-fsre-i2c/lcd-module-alphanumeric-2x16/dp/1220409
Dependents: PCF2119_16X2_LCD_test LPC1768BagSensor
PCF2119_16X2_LCD.cpp@0:581d2def0734, 2011-05-13 (annotated)
- Committer:
- ssozonoff
- Date:
- Fri May 13 13:25:10 2011 +0000
- Revision:
- 0:581d2def0734
Basic driver for the Batron 16x2 Alphanumeric I2C LCD display
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ssozonoff | 0:581d2def0734 | 1 | #include "PC2119_16X2_LCD.h" |
ssozonoff | 0:581d2def0734 | 2 | #include <stdarg.h> |
ssozonoff | 0:581d2def0734 | 3 | |
ssozonoff | 0:581d2def0734 | 4 | void PC2119_16X2_LCD::Init() { |
ssozonoff | 0:581d2def0734 | 5 | // reset the LCD using external reset pin |
ssozonoff | 0:581d2def0734 | 6 | _reset = 1; |
ssozonoff | 0:581d2def0734 | 7 | wait_us(300); |
ssozonoff | 0:581d2def0734 | 8 | _reset = 0; |
ssozonoff | 0:581d2def0734 | 9 | wait_us(12000); |
ssozonoff | 0:581d2def0734 | 10 | |
ssozonoff | 0:581d2def0734 | 11 | char buf[15]; |
ssozonoff | 0:581d2def0734 | 12 | buf[0] = INSTRUCTION_CTRL_BYTE; |
ssozonoff | 0:581d2def0734 | 13 | buf[1] = (FUNCTION_SET | 0x01); // Function set + extended instruction set |
ssozonoff | 0:581d2def0734 | 14 | buf[2] = CURSOR_DISLPAY_SHIFT; |
ssozonoff | 0:581d2def0734 | 15 | buf[3] = ICON_CTRL; |
ssozonoff | 0:581d2def0734 | 16 | buf[4] = VLCD_MULTIPLIER; //set Vlcd multiplier |
ssozonoff | 0:581d2def0734 | 17 | buf[5] = VLCD_CONTRAST; //set Vlcd Contrast |
ssozonoff | 0:581d2def0734 | 18 | |
ssozonoff | 0:581d2def0734 | 19 | buf[6] = FUNCTION_SET; // basic instructions |
ssozonoff | 0:581d2def0734 | 20 | buf[7] = DISPLAY_CTL; |
ssozonoff | 0:581d2def0734 | 21 | buf[8] = ENTRY_MODE; |
ssozonoff | 0:581d2def0734 | 22 | buf[9] = CLEAR_DISPLAY; |
ssozonoff | 0:581d2def0734 | 23 | |
ssozonoff | 0:581d2def0734 | 24 | _i2c.write(LCD_I2C_ADR, buf, 10); |
ssozonoff | 0:581d2def0734 | 25 | } |
ssozonoff | 0:581d2def0734 | 26 | |
ssozonoff | 0:581d2def0734 | 27 | |
ssozonoff | 0:581d2def0734 | 28 | PC2119_16X2_LCD::PC2119_16X2_LCD(PinName p_sda, PinName p_scl, PinName p_reset) : _i2c(p_sda, p_scl), _reset(p_reset) { |
ssozonoff | 0:581d2def0734 | 29 | |
ssozonoff | 0:581d2def0734 | 30 | PC2119_16X2_LCD::Init(); |
ssozonoff | 0:581d2def0734 | 31 | } |
ssozonoff | 0:581d2def0734 | 32 | |
ssozonoff | 0:581d2def0734 | 33 | PC2119_16X2_LCD::PC2119_16X2_LCD(I2C& p_i2c, PinName p_reset) : _i2c(p_i2c), _reset(p_reset) { |
ssozonoff | 0:581d2def0734 | 34 | |
ssozonoff | 0:581d2def0734 | 35 | PC2119_16X2_LCD::Init(); |
ssozonoff | 0:581d2def0734 | 36 | |
ssozonoff | 0:581d2def0734 | 37 | } |
ssozonoff | 0:581d2def0734 | 38 | |
ssozonoff | 0:581d2def0734 | 39 | char PC2119_16X2_LCD::ascii_to_lcd(char ch) { |
ssozonoff | 0:581d2def0734 | 40 | char c = BLANK_CHAR; // default: white space |
ssozonoff | 0:581d2def0734 | 41 | |
ssozonoff | 0:581d2def0734 | 42 | if ((ch>=' ') & (ch<='?')) |
ssozonoff | 0:581d2def0734 | 43 | c = ASCII_OFFSET + ch; |
ssozonoff | 0:581d2def0734 | 44 | if ((ch>='A') & (ch<='Z')) |
ssozonoff | 0:581d2def0734 | 45 | c = ASCII_OFFSET + ch; |
ssozonoff | 0:581d2def0734 | 46 | if ((ch>='a') & (ch<='z')) |
ssozonoff | 0:581d2def0734 | 47 | c = ASCII_OFFSET + ch; |
ssozonoff | 0:581d2def0734 | 48 | return c; |
ssozonoff | 0:581d2def0734 | 49 | } |
ssozonoff | 0:581d2def0734 | 50 | |
ssozonoff | 0:581d2def0734 | 51 | void PC2119_16X2_LCD::write_xy(char c, char row, char column, bool raw) { |
ssozonoff | 0:581d2def0734 | 52 | char buf[0x10]; |
ssozonoff | 0:581d2def0734 | 53 | char adr; |
ssozonoff | 0:581d2def0734 | 54 | |
ssozonoff | 0:581d2def0734 | 55 | if (row == 0) // line offset |
ssozonoff | 0:581d2def0734 | 56 | adr = column; |
ssozonoff | 0:581d2def0734 | 57 | else |
ssozonoff | 0:581d2def0734 | 58 | adr = DATA_CTRL_BYTE + column; |
ssozonoff | 0:581d2def0734 | 59 | |
ssozonoff | 0:581d2def0734 | 60 | buf[0] = INSTRUCTION_CTRL_BYTE; // Enter function setting |
ssozonoff | 0:581d2def0734 | 61 | buf[1] = 0x80 + adr; // LCD adr counter set to "adr" |
ssozonoff | 0:581d2def0734 | 62 | |
ssozonoff | 0:581d2def0734 | 63 | _i2c.write(LCD_I2C_ADR,(char *)buf,2); |
ssozonoff | 0:581d2def0734 | 64 | |
ssozonoff | 0:581d2def0734 | 65 | buf[0] = DATA_CTRL_BYTE; // write to DDRAM |
ssozonoff | 0:581d2def0734 | 66 | buf[1] = raw ? c : ascii_to_lcd(c); |
ssozonoff | 0:581d2def0734 | 67 | |
ssozonoff | 0:581d2def0734 | 68 | _i2c.write(LCD_I2C_ADR,(char *)buf,2); |
ssozonoff | 0:581d2def0734 | 69 | } |
ssozonoff | 0:581d2def0734 | 70 | |
ssozonoff | 0:581d2def0734 | 71 | void PC2119_16X2_LCD::clear_line(char row) { |
ssozonoff | 0:581d2def0734 | 72 | if (row == 0 || row == 1) { |
ssozonoff | 0:581d2def0734 | 73 | char i=0; |
ssozonoff | 0:581d2def0734 | 74 | do |
ssozonoff | 0:581d2def0734 | 75 | write_xy(BLANK_CHAR, row, i); |
ssozonoff | 0:581d2def0734 | 76 | while ((i++<16)); |
ssozonoff | 0:581d2def0734 | 77 | } |
ssozonoff | 0:581d2def0734 | 78 | } |
ssozonoff | 0:581d2def0734 | 79 | |
ssozonoff | 0:581d2def0734 | 80 | void PC2119_16X2_LCD::clear_display(void) { |
ssozonoff | 0:581d2def0734 | 81 | clear_line(0); // clear 1st line |
ssozonoff | 0:581d2def0734 | 82 | clear_line(1); // clear 2nd line |
ssozonoff | 0:581d2def0734 | 83 | return; |
ssozonoff | 0:581d2def0734 | 84 | } |
ssozonoff | 0:581d2def0734 | 85 | |
ssozonoff | 0:581d2def0734 | 86 | void PC2119_16X2_LCD::write(char *b) { |
ssozonoff | 0:581d2def0734 | 87 | char buf[0x60]; |
ssozonoff | 0:581d2def0734 | 88 | int a; |
ssozonoff | 0:581d2def0734 | 89 | |
ssozonoff | 0:581d2def0734 | 90 | buf[0]=INSTRUCTION_CTRL_BYTE; |
ssozonoff | 0:581d2def0734 | 91 | buf[1]=0x80; |
ssozonoff | 0:581d2def0734 | 92 | _i2c.write(LCD_I2C_ADR,(char *)buf,2); |
ssozonoff | 0:581d2def0734 | 93 | |
ssozonoff | 0:581d2def0734 | 94 | a=0; |
ssozonoff | 0:581d2def0734 | 95 | buf[0]=DATA_CTRL_BYTE; |
ssozonoff | 0:581d2def0734 | 96 | |
ssozonoff | 0:581d2def0734 | 97 | while (a!=strlen(b)) { |
ssozonoff | 0:581d2def0734 | 98 | buf[a+1]=ascii_to_lcd(b[a]); |
ssozonoff | 0:581d2def0734 | 99 | a++; |
ssozonoff | 0:581d2def0734 | 100 | } |
ssozonoff | 0:581d2def0734 | 101 | buf[a+1]=INSTRUCTION_CTRL_BYTE; |
ssozonoff | 0:581d2def0734 | 102 | |
ssozonoff | 0:581d2def0734 | 103 | _i2c.write(LCD_I2C_ADR,buf,strlen(b)+1); |
ssozonoff | 0:581d2def0734 | 104 | |
ssozonoff | 0:581d2def0734 | 105 | buf[0]=0x80; |
ssozonoff | 0:581d2def0734 | 106 | buf[1]=0x02; |
ssozonoff | 0:581d2def0734 | 107 | _i2c.write(LCD_I2C_ADR,(char *)buf,2); |
ssozonoff | 0:581d2def0734 | 108 | } |
ssozonoff | 0:581d2def0734 | 109 | |
ssozonoff | 0:581d2def0734 | 110 | void PC2119_16X2_LCD::printf(const char * format, ... ) { |
ssozonoff | 0:581d2def0734 | 111 | // create and start the va_list |
ssozonoff | 0:581d2def0734 | 112 | va_list listPointer ; |
ssozonoff | 0:581d2def0734 | 113 | va_start( listPointer, format ) ; |
ssozonoff | 0:581d2def0734 | 114 | |
ssozonoff | 0:581d2def0734 | 115 | // vsprintf is an example of |
ssozonoff | 0:581d2def0734 | 116 | // a function that works with |
ssozonoff | 0:581d2def0734 | 117 | // an "already started" va_list |
ssozonoff | 0:581d2def0734 | 118 | static char buf[ 1024 ] ; |
ssozonoff | 0:581d2def0734 | 119 | vsprintf( buf, format, listPointer ) ; |
ssozonoff | 0:581d2def0734 | 120 | |
ssozonoff | 0:581d2def0734 | 121 | return write(buf); |
ssozonoff | 0:581d2def0734 | 122 | } |
ssozonoff | 0:581d2def0734 | 123 | |
ssozonoff | 0:581d2def0734 | 124 | void PC2119_16X2_LCD::flip_display() { |
ssozonoff | 0:581d2def0734 | 125 | _i2c.start(); |
ssozonoff | 0:581d2def0734 | 126 | _i2c.write(LCD_I2C_ADR); |
ssozonoff | 0:581d2def0734 | 127 | _i2c.write(INSTRUCTION_CTRL_BYTE); // Control byte for Instruction |
ssozonoff | 0:581d2def0734 | 128 | _i2c.write(FUNCTION_SET | 0x01); // extended instruction mode |
ssozonoff | 0:581d2def0734 | 129 | _i2c.write(0x07); // P=1; Q=1; |
ssozonoff | 0:581d2def0734 | 130 | _i2c.write(FUNCTION_SET); |
ssozonoff | 0:581d2def0734 | 131 | _i2c.stop(); |
ssozonoff | 0:581d2def0734 | 132 | } |
ssozonoff | 0:581d2def0734 | 133 | |
ssozonoff | 0:581d2def0734 | 134 | void PC2119_16X2_LCD::unflip_display() { |
ssozonoff | 0:581d2def0734 | 135 | _i2c.start(); |
ssozonoff | 0:581d2def0734 | 136 | _i2c.write(LCD_I2C_ADR); |
ssozonoff | 0:581d2def0734 | 137 | _i2c.write(INSTRUCTION_CTRL_BYTE); // Control byte for Instruction |
ssozonoff | 0:581d2def0734 | 138 | _i2c.write(FUNCTION_SET | 0x01); |
ssozonoff | 0:581d2def0734 | 139 | _i2c.write(0x04); // P=0; Q=0; |
ssozonoff | 0:581d2def0734 | 140 | _i2c.write(FUNCTION_SET); |
ssozonoff | 0:581d2def0734 | 141 | _i2c.stop(); |
ssozonoff | 0:581d2def0734 | 142 | } |