-
Notifications
You must be signed in to change notification settings - Fork 0
/
i2clcd.cpp
320 lines (286 loc) · 7.92 KB
/
i2clcd.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
//*****************************************************************************
// LCD CLOCK
//*****************************************************************************
//#include <rxduino.h>
#include <Wire.h>
#include "i2clcd.h"
//I2Cのピン割当
#define LCD_RST PIN_P43
#define LCD_SCL PIN_P44
#define LCD_SDA PIN_P45
char DispTxt[256];
//**************************************************
// コマンドを送信します。HD44780でいうRS=0に相当
//**************************************************
void i2c_cmd(unsigned char db)
{
Wire.beginTransmission(0b0111110);
Wire.write(0b00000000);
Wire.write(db);
Wire.endTransmission();
}
//**************************************************
// データを送信します。HD44780でいうRS=1に相当
//**************************************************
void i2c_data(unsigned char db)
{
Wire.beginTransmission(0b0111110);
Wire.write(0b01000000);
Wire.write(db);
Wire.endTransmission();
}
//**************************************************
// (主に)文字列を連続送信します。
//**************************************************
void i2c_puts(const char *s)
{
while(*s){
i2c_data(*s++);
}
}
//**************************************************
//アイコンアドレス, 該当ビット配列宣言
//**************************************************
static unsigned char icon_data[]={
// アイコンアドレス, 該当ビット
0x00, 0b10000,
0x02, 0b10000,
0x04, 0b10000,
0x06, 0b10000,
0x07, 0b10000,
0x07, 0b01000,
0x09, 0b10000,
0x0B, 0b10000,
0x0D, 0b01000,
0x0D, 0b00100,
0x0D, 0b00010,
0x0D, 0b10000,
0x0F, 0b10000, // アンテナマーク
};
unsigned short IconBit = 0; //アイコンのセット状態
//**************************************************
// アイコンの表示ルーチン
//
// それぞれのアイコンに該当するビットを立てる(クリア)します。
// 現在のアイコンの表示状態は読み取れないため、マイコン側でデータを
// 編集してからまとめて送信する必要があります。icon_buff[]
//
// 引き数:各ビットがそれぞれのアイコンに相当します。bit0〜bit12(全13ビット)
// bit0が右端のアイコン, bit13が左のアイコン(アンテナ)に該当します。
// puticon(0x1FFF)で全アイコン点灯
//**************************************************
void puticon(unsigned short flg)
{
static unsigned char icon_buff[16]; // アイコンの編集用
unsigned char i;
for( i=0; i<sizeof(icon_data)/2; i++ ){
if(flg & (0x1000>>i)){ // 該当ビットが立っていたら
icon_buff[icon_data[i*2]] |= icon_data[i*2+1]; // バッファを立てます。
}
else{
icon_buff[icon_data[i*2]] &= ~icon_data[i*2+1]; // バッファをクリアします。
}
}
// 一括でLCDに書き込みます。
for( i=0; i<16; i++ ){
i2c_cmd(0b00111001); // コマンド
i2c_cmd(0b01000000+i); // アイコン領域のアドレスを設定
i2c_data(icon_buff[i]); // アイコンデータ
}
}
//**************************************************
// アンテナアイコン表示
//**************************************************
void putAntIcon( bool dispFlg )
{
if( dispFlg==true ){
IconBit |= (1<<12);
}
else{
IconBit &= (0x1FFF-(1<<12));
}
puticon( IconBit );
}
//**************************************************
// 電話アイコン表示
//**************************************************
void putTelIcon( bool dispFlg )
{
if( dispFlg==true ){
IconBit |= (1<<11);
}
else{
IconBit &= (0x1FFF-(1<<11));
}
puticon( IconBit );
}
//**************************************************
// Wifiアイコン表示
//**************************************************
void putWifiIcon( bool dispFlg )
{
if( dispFlg==true ){
IconBit |= (1<<10);
}
else{
IconBit &= (0x1FFF-(1<<10));
}
puticon( IconBit );
}
//**************************************************
// 接続アイコン表示
//**************************************************
void putConIcon( bool dispFlg )
{
if( dispFlg==true ){
IconBit |= (1<<9);
}
else{
IconBit &= (0x1FFF-(1<<9));
}
puticon( IconBit );
}
//**************************************************
// 上下アイコン表示
// 0: 消灯, 1:上, 2:下, 3:両方
//**************************************************
void putUpDnIcon( int disp )
{
switch(disp){
case 0:
IconBit &= (0x1FFF-(1<<7)-(1<<8));
break;
case 1:
IconBit &= (0x1FFF-(1<<7));
IconBit |= (1<<8);
break;
case 2:
IconBit |= (1<<7);
IconBit &= (0x1FFF-(1<<8));
break;
case 3:
IconBit |= ((1<<7)|(1<<8));
break;
}
puticon( IconBit );
}
//**************************************************
// ロックアイコン表示
//**************************************************
void putLockIcon( bool dispFlg )
{
if( dispFlg==true ){
IconBit |= (1<<6);
}
else{
IconBit &= (0x1FFF-(1<<6));
}
puticon( IconBit );
}
//**************************************************
// スピーカーアイコン表示
//**************************************************
void putSpkIcon( bool dispFlg )
{
if( dispFlg==true ){
IconBit |= (1<<5);
}
else{
IconBit &= (0x1FFF-(1<<5));
}
puticon( IconBit );
}
//**************************************************
// バッテリーアイコン表示
// 0:消灯, 1:空, 2, 3, 4:満タン
//**************************************************
void putBattIcon( int disp )
{
switch(disp){
case 0:
IconBit &= 0x1FE1;
break;
case 1:
IconBit |= (1<<2);
IconBit &= (0x1FFF-(1<<1)-(1<<3)-(1<<4));
break;
case 2:
IconBit |= ((1<<1)|(1<<2));
IconBit &= (0x1FFF-(1<<3)-(1<<4));
break;
case 3:
IconBit |= ((1<<1)|(1<<2)|(1<<4));
IconBit &= (0x1FFF-(1<<3));
break;
case 4:
IconBit |= ((1<<1)|(1<<2)|(1<<3)|(1<<4));
break;
}
puticon( IconBit );
}
//**************************************************
// 玉アイコン表示
//**************************************************
void putTamaIcon( bool dispFlg )
{
if( dispFlg==true ){
IconBit |= 1;
}
else{
IconBit &= (0x1FFF-1);
}
puticon( IconBit );
}
//**************************************************
// LCDの初期化を行います
//**************************************************
void lcd_setup(void)
{
// コントラストの設定(電源電圧,温度によりかなり変化します。実際の液晶をみて調整してください。)
unsigned char contrast = 0b1100011; // 数値を上げると濃くなります。
pinMode(LCD_RST, OUTPUT);
Wire.assignSdaScl( LCD_SDA, LCD_SCL ) ;
delay(500);
digitalWrite(LCD_RST, LOW); // RSTをLにします。リセット
delay(1);
digitalWrite(LCD_RST, HIGH); // RSTをHにします。リセット解除
delay(10);
// ここからI2C LCDの初期化を行います。
delay(40);
i2c_cmd(0b00111000); // function set
i2c_cmd(0b00111001); // function set
i2c_cmd(0b00010100); // interval osc
i2c_cmd(0b01110000 | (contrast & 0xF)); // contrast Low
i2c_cmd(0b01011100 | ((contrast >> 4) & 0x3)); // contast High/icon/power
i2c_cmd(0b01101100); // follower control
delay(300);
i2c_cmd(0b00111000); // function set
i2c_cmd(0b00001100); // Display On
i2c_cmd(0b00000001); // Clear Display
delay(2); // Clear Displayは追加ウェイトが必要
//アイコン表示ビットを0にする
IconBit = 0;
puticon(IconBit);
}
//**************************************************
// LCDに文字を表示します
//**************************************************
void WriteLine(const char *s, int d )
{
const char *sp = " ";
if(d==0){
//上段に表示します
// 1行目の左端 ADDR=0x0
i2c_cmd(0x80);
i2c_puts( sp );
i2c_cmd(0x80);
}
else{
//下段に表示します
// 0xC0 = 0x80(カーソル移動) + 2行目の左端アドレス ADDR=0x40
i2c_cmd(0xC0);
i2c_puts( sp );
i2c_cmd(0xC0);
}
i2c_puts( s );
}