LCD・液晶ディスプレイの画面で簡単なアニメーションのようなことをやってみました。マイコン回路は「LCD表示テスト用回路」を使用します。
下の図のような2種類の「顔文字」が1秒毎に交互に現れるプログラムです。
プログラムファイル lcd4a.bas
1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
3 | Config Lcdpin=Pin, Db4=Porta.4, Db5=Porta.5 | LCDのピン接続の設定。DB4=PA4, DB5=PA5。 | |
4 | Config Lcdpin=Pin, Db6=Porta.6, Db7=Porta.7 | LCDのピン接続の設定。DB6=PA6, DB7=PA7。 | |
5 | Config Lcdpin=Pin, E=Porta.3, Rs=Porta.2 | LCDのピン接続の設定。E=PA3, RST=PA2。 | |
6 | Config Lcd = 16 * 2 | 16文字×2行表示のLCDを使用する。。 | |
7 | Deflcdchar 0, 32, 16, 8, 4, 2, 1, 32, 32 | 「バックスラッシュ」の文字データ。 | |
8 | Cursor Off | カーソルを表示しない。 | |
9 | Do | Doループの範囲ここから。 | |
10 | Cls | LCDの表示を消去する。 | |
11 | Lcd " (-_-)" | LCD画面に「 (-_-)」を表示する。 | |
12 | Wait 1 | 1秒間そのまま。 | |
13 | Cls | LCDの表示を消去する。 | |
14 | Lcd chr(0) ; "(^o^)⁄" | LCDに「バックスラッシュ」と「(^o^)⁄」を表示。 | |
15 | Wait 1 | 1秒間そのまま。 | |
16 | Loop | Doループの範囲ここまで。9行目へ戻る。 | |
17 | End | 終わり。 |
「素の顔」を表わす「" (-_-)"」は先頭に半角のスペースが入っています。輪郭は「( )」(カッコ)、目は「 - 」(ハイフン)、口は「 _ 」(アンダーバー)を用いました。「笑顔」の目は「 ^ 」(指数記号)、口は小文字の「 o 」(オー)です。
バンザイしている右手は「バックスラッシュ」です。パソコンのキーボードで「\」を打つとBASCOM-AVR IDEの画面には「バックスラッシュ」が表示されますが、LCDの画面では元の「\」になってしまいます。そこでこの文字だけ「LCDデザイナー」で作りました。左手は普通の「 ⁄ 」(スラッシュ)です。こうやって作った2つの顔文字をLCD画面の同じ位置に1秒毎に交互に表示させます。
下の左の図のように自動車 (に見えますか?) が画面左側から現れて右側へ移動して消え、今度は向きを変えて右側から現れて左側へ移動して消えていくプログラムです。表示を移動させるのに「Shiftlcd」という命令を使いました。
プログラムファイル lcd4b.bas
1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
3 | Config Lcdpin=Pin, Db4=Porta.4, Db5=Porta.5 | LCDのピン接続の設定。DB4=PA4, DB5=PA5。 | |
4 | Config Lcdpin=Pin, Db6=Porta.6, Db7=Porta.7 | LCDのピン接続の設定。DB6=PA6, DB7=PA7。 | |
5 | Config Lcdpin=Pin, E=Porta.3, Rs=Porta.2 | LCDのピン接続の設定。E=PA3, RST=PA2。 | |
6 | Config Lcd = 16 * 2 | 16文字×2行表示のLCDを使用する。。 | |
7 | Dim N As Byte | Forループ用変数「N」を使用する。 | |
8 | Deflcdchar 0, 32, 16, 8, 7, 1, 31, 18, 12 | Chr0「右向きの車・前」の文字データ。 | |
9 | Deflcdchar 1, 31, 32, 6, 6, 32, 31, 32, 32 | Chr1「右向きの車・中」の文字データ。 | |
10 | Deflcdchar 2, 7, 8, 19, 19, 16, 31, 18, 12 | Chr2「右向きの車・後」の文字データ。 | |
11 | Deflcdchar 3, 32, 1, 2, 28, 16, 31, 9, 6 | Chr3「左向きの車・前」の文字データ。 | |
12 | Deflcdchar 4, 31, 32, 12, 12, 32, 31, 32, 32 | Chr4「左向きの車・中」の文字データ。 | |
13 | Deflcdchar 5, 28, 2, 25, 25, 1, 31, 18, 12 | Chr5「左向きの車・後」の文字データ。 | |
14 | Deflcdchar 6, 32, 32, 32, 32, 32, 10, 32, 32 | Chr6「排気ガス」の文字データ。 | |
15 | Cursor Off | カーソルを表示しない。 | |
16 | Do | Doループの範囲ここから。 | |
17 | Cls : Lcd Chr(0) | LCDの表示を消去して「Chr0」を表示。 | |
18 | Waitms 250 | 250ミリ秒間そのまま。 | |
19 | Cls : Lcd Chr(1) ; Chr(0) | LCDの表示を消去して「Chr1〜0」を表示。 | |
20 | Waitms 250 | 250ミリ秒間そのまま。 | |
21 | Cls : Lcd Chr(2) ; Chr(1) ; Chr(0) | LCDの表示を消去して「Chr2〜0」を表示。 | |
22 | Waitms 250 | 250ミリ秒間そのまま。 | |
23 | Cls : Lcd Chr(6) ; Chr(2) ; Chr(1) ; Chr(0) | LCDの表示を消去して「Chr6」「Chr2〜0」を表示。 | |
24 | Waitms 250 | 250ミリ秒間そのまま。 | |
25 | For N = 1 To 16 | Forループの範囲ここから。16回繰り返し。 | |
26 | Shiftlcd Right | LCD画面の表示を右へ1桁移動させる。 | |
27 | Waitms 250 | 250ミリ秒間そのまま。 | |
28 | Next N | Forループの範囲ここまで。25行目へ戻る。 | |
29 | Cls : Locate 1, 16 | LCDの表示を消去。上の行の16文字目に、 | |
30 | Lcd Chr(3) | 「Chr3」を表示。 | |
31 | Waitms 250 | 250ミリ秒間そのまま。 | |
32 | Cls : Locate 1, 15 | LCDの表示を消去。上の行の15文字目に、 | |
33 | Lcd Chr(3) ; Chr(4) | 「Chr3〜4」を表示。 | |
34 | Waitms 250 | 250ミリ秒間そのまま。 | |
35 | Cls : Locate 1, 14 | LCDの表示を消去。上の行の14文字目に、 | |
36 | Lcd Chr(3) ; Chr(4) ; Chr(5) | 「Chr3〜5」を表示。 | |
37 | Waitms 250 | 250ミリ秒間そのまま。 | |
38 | Cls : Locate 1, 13 | LCDの表示を消去。上の行の13文字目に、 | |
39 | Lcd Chr(3) ; Chr(4) ; Chr(5) ; Chr(6) | 「Chr3〜6」を表示。 | |
40 | Waitms 250 | 250ミリ秒間そのまま。 | |
41 | For N = 1 To 16 | Forループの範囲ここから。16回繰り返し。 | |
42 | Shiftlcd Left | LCD画面の表示を左へ1桁移動させる。 | |
43 | Waitms 250 | 250ミリ秒間そのまま。 | |
44 | Next N | Forループの範囲ここまで。41行目へ戻る。 | |
45 | Loop | Doループの範囲ここまで。16行目へ戻る。 | |
46 | End | 終わり。 |
プログラムの書き方に慣れていないので無駄に長いですが、その分ベタでわかりやすいかと思います。8行目から14行目は「LCDデザイナー」で作った自動車の各部分の文字データです。Chr0〜Chr6の各文字の形は上の右の図の通りです。
17行目から24行目は画面左側から車が少しずつ現れるプログラムです。23行目の時点ですべての部分が姿を現します。26行目「Shiftlcd Right」は画面の表示を右へ1桁(1文字分)だけシフトする命令です。これをForループで16回繰り返すので車は少しずつ右へ移動し、最後は右の枠外へ消えていきます。29行目から40行目で画面右端から左向きの車が現れ、41行目〜44行目の「Shiftlcd Left」を含むForループで左へ向かって移動して画面左側へ消えます。全体が「Do〜Loop」で囲まれているので、ここまでの動作が無限に繰り返されます。
19行目「Cls : Lcd Chr(1) ; Chr(0)」などで、「Cls」と「Lcd Chr(1)」の間の記号は「 : 」(コロン)、「Lcd Chr(1)」と「Chr(0)」の間の記号は「 ; 」(セミコロン)ですのでお間違えなく。