http://uk.farnell.com/batron/bthq21605v-cog-fsre-i2c/lcd-module-alphanumeric-2x16/dp/1220409

Dependents:   PCF2119_16X2_LCD_test LPC1768BagSensor

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?

UserRevisionLine numberNew 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 }