8 #include <linux/i2c-dev.h> /* for I2C_SLAVE */
10 #include "mes_print.h"
13 #define DEV_LCD "/dev/i2c-3"
18 static int lcd_open(void)
20 fh = open(DEV_LCD, O_RDWR);
23 static void lcd_close(void)
29 static void lcd_out(unsigned char dat, char rs)
31 unsigned char data[2];
34 PERRF("ERROR lcd_open()\n");
37 ioctl(fh, I2C_SLAVE, I2CLCD_ADDRESS >> 1);
39 data[0] = rs ? 0x40 : 0x00; // RS
49 static void lcd_out_mul(unsigned char *out, int len)
51 unsigned char data[256];
54 PERRF("ERROR lcd_open()\n");
57 ioctl(fh, I2C_SLAVE, I2CLCD_ADDRESS >> 1);
59 data[0] = 0x40; // RS = 1
60 if (len >= sizeof(data)) len = sizeof(data)-1;
61 memcpy(data+1, out, len);
62 write(fh, data, len+1);
69 static void i2clcd_init(void)
71 unsigned char data[16];
76 PERRF("ERROR lcd_open()\n");
79 ioctl(fh, I2C_SLAVE, I2CLCD_ADDRESS >> 1);
82 data[0] = I2CLCD_CFG_ENABLE | (cfg & 0x1f);
93 unsigned char func, display, entry;
104 func = I2CLCD_8BITMODE | I2CLCD_2LINE | I2CLCD_5x8DOTS;
106 display = I2CLCD_DISPLAYON | I2CLCD_CURSOROFF | I2CLCD_BLINKOFF;
107 entry = I2CLCD_ENTRYLEFT;
109 lcd_out(0x20 | (func & 0x1f), 0); // func
110 // lcd_out(0x10 | (shift & 0x0f), 0); // shift
111 lcd_out(0x08 | (display & 0x07), 0); // display
112 lcd_out(0x04 | (entry & 0x03), 0); // entry mode
120 void lcd_pos(int x, int y)
123 unsigned char ofs[] = {0, 0x40, 0x14, 0x54 };
125 if (y >= LCD_YMAX) y = LCD_YMAX - 1;
126 if (x >= LCD_XMAX) x = LCD_XMAX - 1;
128 lcd_out(I2CLCD_SETDDRAMADDR | (adr & 0x7F), 0);
131 void lcd_print(char *str)
133 lcd_out_mul((unsigned char*)str, strlen(str));
137 lcd_out(I2CLCD_CLEARDISPLAY, 0);
142 lcd_out(I2CLCD_RETURNHOME, 0);