質問編集履歴
3
出典の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -440,4 +440,4 @@
|
|
440
440
|
|
441
441
|
チュートリアル・ガイド
|
442
442
|
|
443
|
-
実践編
|
443
|
+
実践編より
|
2
プログラムをコード入力しました。 プログラムの出典を示しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -6,6 +6,8 @@
|
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
+
```ここに言語を入力
|
10
|
+
|
9
11
|
/* Include files */
|
10
12
|
|
11
13
|
#include "macrodriver.h"
|
@@ -425,3 +427,17 @@
|
|
425
427
|
wait1msec( 1 );
|
426
428
|
|
427
429
|
}
|
430
|
+
|
431
|
+
```
|
432
|
+
|
433
|
+
|
434
|
+
|
435
|
+
|
436
|
+
|
437
|
+
78KOR/KG3ターゲットボード
|
438
|
+
|
439
|
+
QB-78KORKG3-TB
|
440
|
+
|
441
|
+
チュートリアル・ガイド
|
442
|
+
|
443
|
+
実践編
|
1
プログラムを追加しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -1 +1,427 @@
|
|
1
1
|
Cube suite+という開発環境で、LCDモジュールに何かしら文字や数字などを表示するプログラムを作成したいです。マイコンは78KOR/KG3で、LCDモジュールは、ACM1602N1-FKW-FBWを使用します。液晶画面に表示させるということをやったことがないので、どのようにプログラムを作ればよいのか考え方が分からないのですが、教えていただけないでしょうか。まだ、初学者なので質問の仕方も適切ではないのかもしれませんが、なにか質問などありましたらお答えします。
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
サンプルプログラムのようなものがありました。時計表示機能つき温度データロガーのプログラムのようです。これをもとに考えたいのですが、どのあたりが必要な部分になるでしょうか。
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
/* Include files */
|
10
|
+
|
11
|
+
#include "macrodriver.h"
|
12
|
+
|
13
|
+
#include "System.h"
|
14
|
+
|
15
|
+
#include "String.h"
|
16
|
+
|
17
|
+
#include "Stdlib.h"
|
18
|
+
|
19
|
+
/* LCD定義*/
|
20
|
+
|
21
|
+
typedef struct {
|
22
|
+
|
23
|
+
UCHAR rs : 1;
|
24
|
+
|
25
|
+
UCHAR sts : 1;
|
26
|
+
|
27
|
+
UCHAR data : 8;
|
28
|
+
|
29
|
+
} ST_LCDCMD;
|
30
|
+
|
31
|
+
#define D_LCD_X_SIZE 16 /* LCD表示サイズX */
|
32
|
+
|
33
|
+
#define D_LCD_Y_SIZE 2 /* LCD表示サイズY */
|
34
|
+
|
35
|
+
#define D_LCD_SIZE (D_LCD_X_SIZE * D_LCD_Y_SIZE)
|
36
|
+
|
37
|
+
#define D_LCD_CGRAMSIZE (8 * 8)
|
38
|
+
|
39
|
+
/* LCDインストラクション設定*/
|
40
|
+
|
41
|
+
#define D_LCD_CLR 0x01 /* 表示クリア*/
|
42
|
+
|
43
|
+
#define D_LCD_HOME 0x02 /* カーソルをホームポジションへ移動*/
|
44
|
+
|
45
|
+
#define D_LCD_ENTRY 0x04 /* エントリー・モード・セット(デフォルトはカーソル左移動,表示シフトなし*/
|
46
|
+
|
47
|
+
#define D_LCD_SET 0x08 /* 表示ON/OFF設定(デフォルトは表示OFF,カーソルOFF,ブリンクOFF) */
|
48
|
+
|
49
|
+
#define D_LCD_SHIFT 0x10 /* カーソル/表示の移動(デフォルトはカーソル位置を左へシフト*/
|
50
|
+
|
51
|
+
#define D_LCD_FUNC 0x20 /* ファンクションセット(データ長、表示行数、キャラクタドット数) */
|
52
|
+
|
53
|
+
#define D_LCD_CGRAM 0x40 /* CGRAMのアドレス設定*/
|
54
|
+
|
55
|
+
#define D_LCD_DDRAM 0x80 /* DDRAMのアドレス設定*/
|
56
|
+
|
57
|
+
/* LCDインストラクションのbit設定*/
|
58
|
+
|
59
|
+
#define D_LCD_ENTRY_INC 0x02 /* カーソル右移動(インクリメント) */
|
60
|
+
|
61
|
+
#define D_LCD_SET_ON 0x04 /* 表示ON */
|
62
|
+
|
63
|
+
#define D_LCD_2LINE 0x08 /* 表示行数を2行にする*/
|
64
|
+
|
65
|
+
/* in main.c */
|
66
|
+
|
67
|
+
extern void wait100usec( UINT para1_ );
|
68
|
+
|
69
|
+
extern void wait1msec( UINT para1_ );
|
70
|
+
|
71
|
+
/* in This file. */
|
72
|
+
|
73
|
+
void lcd_temperature( void );
|
74
|
+
|
75
|
+
/******************************************************************************
|
76
|
+
|
77
|
+
** Global define
|
78
|
+
|
79
|
+
*******************************************************************************/
|
80
|
+
|
81
|
+
/* - - - - - - - - - 他参照- - - - - - - - - - */
|
82
|
+
|
83
|
+
/* in main.c */
|
84
|
+
|
85
|
+
extern USHORT gTemperatureAd;extern USHORT gTemperatureAd2;
|
86
|
+
|
87
|
+
/* - - - - - - - このファイルでの定義- - - - - - - - */
|
88
|
+
|
89
|
+
ST_LCDCMD gtLcdCmd; /* LCDへコマンド送る際の構造体*/
|
90
|
+
|
91
|
+
UCHAR gLcdUpdate; /* LCD表示を更新するカウンタ*/
|
92
|
+
|
93
|
+
UCHAR gtLcdBuffer[ D_LCD_SIZE + 1 ]; /* LCDのキャラクタ単位のRAMバッファ16文字x2行*/
|
94
|
+
|
95
|
+
UCHAR gLcdCursor; /* LCDカーソル位置*/
|
96
|
+
|
97
|
+
const UCHAR gLCDTEXT[] = “ オンド1: 2: ”; /* 温度表示時の文字列*/
|
98
|
+
|
99
|
+
const UCHAR gtCgramData[] =
|
100
|
+
|
101
|
+
{ /* LCDへ定義する℃のフォントデータ*/
|
102
|
+
|
103
|
+
0x08, 0x14, 0x08, 0x07, 0x08, 0x08, 0x08, 0x07, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
104
|
+
|
105
|
+
0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
|
106
|
+
|
107
|
+
0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f,
|
108
|
+
|
109
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f
|
110
|
+
|
111
|
+
};
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
118
|
+
|
119
|
+
/* LCDへデータ書き込み(8bitデータ送信) */
|
120
|
+
|
121
|
+
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
122
|
+
|
123
|
+
void lcd_write8bit( UCHAR rs_, UCHAR status_, UCHAR data_ )
|
124
|
+
|
125
|
+
{
|
126
|
+
|
127
|
+
UCHAR lcddata;
|
128
|
+
|
129
|
+
/* RS : レジスタ選択信号*/
|
130
|
+
|
131
|
+
lcddata = rs_;
|
132
|
+
|
133
|
+
/* E : 動作起動信号*/
|
134
|
+
|
135
|
+
lcddata ¦= (status_ << 1);
|
136
|
+
|
137
|
+
/* DB : 8bitデータバス*/
|
138
|
+
|
139
|
+
lcddata ¦= (data_ << 2);
|
140
|
+
|
141
|
+
/* データを出力する*/
|
142
|
+
|
143
|
+
P8 = lcddata;
|
144
|
+
|
145
|
+
wait100usec( 1 );
|
146
|
+
|
147
|
+
/* 動作起動(イネーブル信号)をLOWにする*/
|
148
|
+
|
149
|
+
P8.1 = 0;
|
150
|
+
|
151
|
+
wait100usec( 1 );
|
152
|
+
|
153
|
+
}
|
154
|
+
|
155
|
+
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
156
|
+
|
157
|
+
/* LCDへデータ書き込み(4bitデータ送信) */
|
158
|
+
|
159
|
+
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
160
|
+
|
161
|
+
void lcd_write4bit( UCHAR rs_, UCHAR status_, UCHAR data_ )
|
162
|
+
|
163
|
+
{
|
164
|
+
|
165
|
+
UCHAR lcddata, dat;
|
166
|
+
|
167
|
+
/* RS : レジスタ選択信号*/
|
168
|
+
|
169
|
+
lcddata = rs_;
|
170
|
+
|
171
|
+
/* E : 動作起動信号*/
|
172
|
+
|
173
|
+
lcddata ¦= (status_ << 1);
|
174
|
+
|
175
|
+
/* DB : 上位4bitデータを送る*/
|
176
|
+
|
177
|
+
dat = (data_ & 0xf0) >> 1;
|
178
|
+
|
179
|
+
lcddata ¦= dat;
|
180
|
+
|
181
|
+
/* データを出力する*/
|
182
|
+
|
183
|
+
P8 = lcddata;
|
184
|
+
|
185
|
+
wait100usec( 2 );
|
186
|
+
|
187
|
+
/* 動作起動をLOWにする*/
|
188
|
+
|
189
|
+
P8.1 = 0;
|
190
|
+
|
191
|
+
wait100usec( 2 );
|
192
|
+
|
193
|
+
/* RS : レジスタ選択信号*/
|
194
|
+
|
195
|
+
lcddata = rs_;
|
196
|
+
|
197
|
+
/* E : 動作起動信号*/
|
198
|
+
|
199
|
+
lcddata ¦= (status_ << 1);
|
200
|
+
|
201
|
+
/* DB : 下位4bitデータを送る*/
|
202
|
+
|
203
|
+
dat = (data_ & 0x0f) << 3;
|
204
|
+
|
205
|
+
lcddata ¦= dat;
|
206
|
+
|
207
|
+
/* データを出力する*/
|
208
|
+
|
209
|
+
P8 = lcddata;
|
210
|
+
|
211
|
+
wait100usec( 2 );
|
212
|
+
|
213
|
+
/* 動作起動(イネーブル信号)をLOWにする*/
|
214
|
+
|
215
|
+
P8.1 = 0;
|
216
|
+
|
217
|
+
wait100usec( 2 );
|
218
|
+
|
219
|
+
}
|
220
|
+
|
221
|
+
|
222
|
+
|
223
|
+
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
224
|
+
|
225
|
+
/* LCD初期化*/
|
226
|
+
|
227
|
+
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
228
|
+
|
229
|
+
void lcd_init()
|
230
|
+
|
231
|
+
{
|
232
|
+
|
233
|
+
int i;
|
234
|
+
|
235
|
+
UCHAR dat;
|
236
|
+
|
237
|
+
gLcdUpdate = 0;
|
238
|
+
|
239
|
+
gLcdCursor = 0;
|
240
|
+
|
241
|
+
memset( gtLcdBuffer, ' ', sizeof(gtLcdBuffer) );
|
242
|
+
|
243
|
+
lcd_write4bit( 0, 1, 0x38 ); /* 8bitモードへ設定*/
|
244
|
+
|
245
|
+
wait1msec( 100 );
|
246
|
+
|
247
|
+
lcd_write8bit( 0, 1, 4 ); /* 4bitモードインターフェース設定*/
|
248
|
+
|
249
|
+
gtLcdCmd.rs = 0; /* ファンクション行数セット*/
|
250
|
+
|
251
|
+
gtLcdCmd.sts = 1;
|
252
|
+
|
253
|
+
gtLcdCmd.data = D_LCD_FUNC ¦ D_LCD_2LINE;
|
254
|
+
|
255
|
+
lcd_write4bit( gtLcdCmd.rs, gtLcdCmd.sts, gtLcdCmd.data );
|
256
|
+
|
257
|
+
wait1msec( 100 );
|
258
|
+
|
259
|
+
/* エントリー・モード設定*/
|
260
|
+
|
261
|
+
gtLcdCmd.rs = 0;
|
262
|
+
|
263
|
+
gtLcdCmd.sts = 1;
|
264
|
+
|
265
|
+
gtLcdCmd.data = D_LCD_ENTRY ¦ D_LCD_ENTRY_INC;
|
266
|
+
|
267
|
+
lcd_write4bit( gtLcdCmd.rs, gtLcdCmd.sts, gtLcdCmd.data );
|
268
|
+
|
269
|
+
wait1msec( 5 );
|
270
|
+
|
271
|
+
/* 表示ON, カーソルOFF, ブリンクOFF */
|
272
|
+
|
273
|
+
gtLcdCmd.rs = 0;
|
274
|
+
|
275
|
+
gtLcdCmd.sts = 1;
|
276
|
+
|
277
|
+
gtLcdCmd.data = D_LCD_SET ¦ D_LCD_SET_ON;
|
278
|
+
|
279
|
+
lcd_write4bit( gtLcdCmd.rs, gtLcdCmd.sts, gtLcdCmd.data );
|
280
|
+
|
281
|
+
wait1msec( 5 );
|
282
|
+
|
283
|
+
/* 表示クリア*/
|
284
|
+
|
285
|
+
lcd_write4bit( 0, 1, D_LCD_CLR );
|
286
|
+
|
287
|
+
wait1msec( 10 );
|
288
|
+
|
289
|
+
/* CGRAMへデータを転送する*/
|
290
|
+
|
291
|
+
lcd_write4bit( 0, 1, D_LCD_CGRAM );
|
292
|
+
|
293
|
+
for ( i = 0; i < D_LCD_CGRAMSIZE; i++ )
|
294
|
+
|
295
|
+
{
|
296
|
+
|
297
|
+
/* CGRAMデータ書き込み*/
|
298
|
+
|
299
|
+
dat = gtCgramData[ i ];
|
300
|
+
|
301
|
+
lcd_write4bit( 1, 1, dat );
|
302
|
+
|
303
|
+
wait100usec( 1 );
|
304
|
+
|
305
|
+
}
|
306
|
+
|
307
|
+
}
|
308
|
+
|
309
|
+
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
310
|
+
|
311
|
+
/* 温度表示*/
|
312
|
+
|
313
|
+
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
314
|
+
|
315
|
+
void lcd_temperature( )
|
316
|
+
|
317
|
+
{
|
318
|
+
|
319
|
+
int i;
|
320
|
+
|
321
|
+
UCHAR num1[ 7 ], num2[ 7 ];
|
322
|
+
|
323
|
+
UINT temp1, temp2;
|
324
|
+
|
325
|
+
/* 各センサより温度を計算*/
|
326
|
+
|
327
|
+
temp1 = gTemperatureAd;
|
328
|
+
|
329
|
+
temp2 = gTemperatureAd2;
|
330
|
+
|
331
|
+
itoa( temp1, (char *)num1, 10 );
|
332
|
+
|
333
|
+
itoa( temp2, (char *)num2, 10 );
|
334
|
+
|
335
|
+
|
336
|
+
|
337
|
+
for ( i = 0; i < D_LCD_X_SIZE; i++)
|
338
|
+
|
339
|
+
{
|
340
|
+
|
341
|
+
gtLcdBuffer[ i + D_LCD_X_SIZE ] = gLCDTEXT[ i ];
|
342
|
+
|
343
|
+
}
|
344
|
+
|
345
|
+
gtLcdBuffer[ 7 + D_LCD_X_SIZE ] = num1[ 0 ];
|
346
|
+
|
347
|
+
gtLcdBuffer[ 8 + D_LCD_X_SIZE ] = num1[ 1 ];
|
348
|
+
|
349
|
+
if ( num1[ 1 ] != 0 )
|
350
|
+
|
351
|
+
{
|
352
|
+
|
353
|
+
gtLcdBuffer[ 9 + D_LCD_X_SIZE ] = 0; /* 「℃」表示*/
|
354
|
+
|
355
|
+
}
|
356
|
+
|
357
|
+
gtLcdBuffer[ 13 + D_LCD_X_SIZE ] = num2[ 0 ];
|
358
|
+
|
359
|
+
gtLcdBuffer[ 14 + D_LCD_X_SIZE ] = num2[ 1 ];
|
360
|
+
|
361
|
+
if ( num2[ 1 ] != 0 )
|
362
|
+
|
363
|
+
{
|
364
|
+
|
365
|
+
gtLcdBuffer[ 15 + D_LCD_X_SIZE ] = 0; /* 「℃」表示*/
|
366
|
+
|
367
|
+
}
|
368
|
+
|
369
|
+
}
|
370
|
+
|
371
|
+
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
372
|
+
|
373
|
+
/* LCDバッファVRAMからLCD VRAMへ転送*/
|
374
|
+
|
375
|
+
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
376
|
+
|
377
|
+
void lcd_vram2lcd()
|
378
|
+
|
379
|
+
{
|
380
|
+
|
381
|
+
UINT i;
|
382
|
+
|
383
|
+
UCHAR dat;
|
384
|
+
|
385
|
+
/* DDRAMアドレス設定*/
|
386
|
+
|
387
|
+
lcd_write4bit( 0, 1, D_LCD_DDRAM );
|
388
|
+
|
389
|
+
wait1msec( 1 );
|
390
|
+
|
391
|
+
for ( i = 0; i < (D_LCD_SIZE/2); i++ )
|
392
|
+
|
393
|
+
{
|
394
|
+
|
395
|
+
/* DDRAMデータ書き込み*/
|
396
|
+
|
397
|
+
dat = gtLcdBuffer[ i ];
|
398
|
+
|
399
|
+
lcd_write4bit( 1, 1, dat );
|
400
|
+
|
401
|
+
wait100usec( 1 );
|
402
|
+
|
403
|
+
}
|
404
|
+
|
405
|
+
/* DDRAMアドレス設定*/
|
406
|
+
|
407
|
+
lcd_write4bit( 0, 1, D_LCD_DDRAM + 0x40 );
|
408
|
+
|
409
|
+
wait1msec( 1 );
|
410
|
+
|
411
|
+
for ( i = 0; i < (D_LCD_SIZE/2); i++ )
|
412
|
+
|
413
|
+
{
|
414
|
+
|
415
|
+
/* DDRAMデータ書き込み*/
|
416
|
+
|
417
|
+
dat = gtLcdBuffer[ i + D_LCD_X_SIZE ];
|
418
|
+
|
419
|
+
lcd_write4bit( 1, 1, dat );
|
420
|
+
|
421
|
+
wait100usec( 1 );
|
422
|
+
|
423
|
+
}
|
424
|
+
|
425
|
+
wait1msec( 1 );
|
426
|
+
|
427
|
+
}
|