OSDN Git Service

GPS valid=07にならなくても記録を開始してしまうバグ修正
[scilog/scilog.git] / lcd.c
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <string.h>
4 #include <sys/ioctl.h>
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <fcntl.h>
8 #include <linux/i2c-dev.h> /* for I2C_SLAVE */
9
10 #include "mes_print.h"
11 #include "lcd.h"
12
13 #define DEV_LCD "/dev/i2c-3"
14
15
16 static int      fh = -1;
17
18 static int lcd_open(void)
19 {
20         fh = open(DEV_LCD, O_RDWR);
21         return fh;
22 }
23 static void lcd_close(void)
24 {
25         close(fh);
26         fh = -1;
27 }
28 // 1byte out
29 static void lcd_out(unsigned char dat, char rs)
30 {
31         unsigned char data[2];
32
33         if (lcd_open() < 0) {
34                 PERRF("ERROR lcd_open()\n");
35                 return;
36         }
37         ioctl(fh, I2C_SLAVE, I2CLCD_ADDRESS >> 1);
38
39         data[0] = rs ? 0x40 : 0x00;     // RS
40         data[1] = dat;
41         write(fh, data, 2);
42
43         lcd_close();
44 }
45 /*
46         複数バイトout
47         RS=1
48 */
49 static void lcd_out_mul(unsigned char *out, int len)
50 {
51         unsigned char   data[256];
52
53         if (lcd_open() < 0) {
54                 PERRF("ERROR lcd_open()\n");
55                 return;
56         }
57         ioctl(fh, I2C_SLAVE, I2CLCD_ADDRESS >> 1);
58
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);
63
64         lcd_close();
65 }
66 /*
67         i2c LCDモジュールの設定
68 */
69 static void i2clcd_init(void)
70 {
71         unsigned char data[16];
72         unsigned char   cfg;
73
74         fh = -1;
75         if (lcd_open() < 0) {
76                 PERRF("ERROR lcd_open()\n");
77                 return;
78         }
79         ioctl(fh, I2C_SLAVE, I2CLCD_ADDRESS >> 1);
80
81         cfg = 0;
82         data[0] = I2CLCD_CFG_ENABLE | (cfg & 0x1f);
83         data[1] = 0;
84         write(fh, data, 2);
85
86         lcd_close();
87 }
88 /*
89         LCD初期化
90 */
91 void lcd_init(void)
92 {
93         unsigned char   func, display, entry;
94         
95         i2clcd_init();
96         usleep(10*1000);
97
98         lcd_out(0x30, 0);
99         usleep(5*1000);
100         lcd_out(0x30, 0);
101         usleep(2*1000);
102         lcd_out(0x30, 0);
103
104         func = I2CLCD_8BITMODE | I2CLCD_2LINE | I2CLCD_5x8DOTS;
105 //      shift = 
106         display = I2CLCD_DISPLAYON | I2CLCD_CURSOROFF | I2CLCD_BLINKOFF;
107         entry = I2CLCD_ENTRYLEFT;
108
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
113
114         lcd_clear();
115         lcd_home();
116 }
117 /*
118         int x,y: 0始まり
119 */
120 void lcd_pos(int x, int y)
121 {
122         unsigned char   adr;
123         unsigned char   ofs[] = {0, 0x40, 0x14, 0x54 };
124         
125         if (y >= LCD_YMAX) y = LCD_YMAX - 1;
126         if (x >= LCD_XMAX) x = LCD_XMAX - 1;
127         adr = ofs[y] + x;
128         lcd_out(I2CLCD_SETDDRAMADDR | (adr & 0x7F), 0);
129 }
130
131 void lcd_print(char *str)
132 {
133         lcd_out_mul((unsigned char*)str, strlen(str));
134 }
135 void lcd_clear(void)
136 {
137         lcd_out(I2CLCD_CLEARDISPLAY, 0);
138 usleep(2*1000);
139 }
140 void lcd_home(void)
141 {
142         lcd_out(I2CLCD_RETURNHOME, 0);
143 usleep(2*1000);
144 }
145
146