LCD・液晶ディスプレイにカタカナや自分で作った文字を表示するプログラムを試してみました。マイコン回路は「LCD表示テスト用回路」を使用します。
今回実験に使用したLCDにはカタカナを表示する機能があるのですが、BASCOM-AVR IDEには英語しか入力できないので、「Lcd "〜"」という形式は使えません。こういう場合は1文字ずつコード番号を指定します。下の図のように、LCDの上の行に「Breadboard Radio」、下の行に「ブレッドボード ラジオ」と表示してみます。
プログラムファイル lcd2a.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 | Cursor Off | カーソルを表示しない。 | |
8 | Cls | LCDの表示を消去する。 | |
9 | Lcd "Breadboard Radio" | (上の行に)「Breadboard Radio」と表示する。 | |
10 | Lowerline | LCDの下の行に、 | |
11 | Lcd Chr(&Hcc) ; Chr(&Hde) | 「フ」と「゛」(濁点)を表示する。 | |
12 | Lcd Chr(&Hda) ; Chr(&Haf) | 「レ」と「ッ」(拗音)を表示する。 | |
13 | Lcd Chr(&Hc4) ; Chr(&Hde) | 「ト」と「゛」(濁点)を表示する。 | |
14 | Lcd Chr(&Hce) ; Chr(&Hde) | 「ホ」と「゛」(濁点)を表示する。 | |
15 | Lcd Chr(&Hb0) ; Chr(&Hc4) | 「ー」(長音)と「ト」を表示する。 | |
16 | Lcd Chr(&Hde) ; Chr(&Hfe) | 「゛」(濁点)と「 」(スペース)を表示する。 | |
17 | Lcd Chr(&Hd7) ; Chr(&Hbc) | 「ラ」と「シ」を表示する。 | |
18 | Lcd Chr(&Hde) ; Chr(&Hb5) | 「゛」(濁点)と「オ」を表示する。 | |
19 | End | 終わり。 |
11行目から18行目はLCDに「ブレッドボード ラジオ」と表示するためのプログラムです。「Lcd Chr (コード番号)」という書式になります。コード番号は16進数で表記するのが楽です。例えば「フ」のコードは「&Hcc」なので、画面に「フ」を出すときは「Lcd Chr(&Hcc)」と書きます。上のプログラムでは1行に2文字分ずつ記述していますが、このような場合は行頭に1回だけ「Lcd」を書き、後は「 ; 」(セミコロン)で区切って「Chr(コード番号)」の部分を続ければOKです。「゛」(濁点)はこれだけで1文字になります。
各文字のコード番号はLCDの説明書に出ています。下記の通りです。コード番号は「&Hab」という形式になりますが、「a」の部分すなわち16進数の上位の桁は表の上部に横に並んでいる数字を書きます。「b」の部分は表の左側に縦に並んでいる数字を書きます。
今回はコード番号を16進数で表記しましたが、2進数や10進数で表記することも可能です。いくつか例を挙げると下記のようになります。換算表は「LCDの点灯・消灯(その2)」にあります。
文字 | 16進数 | 2進数 | 10進数 |
フ | &Hcc | &B11001100 | 204 |
゛ | &Hde | &B11011110 | 222 |
レ | &Hda | &B11001010 | 218 |
「ブレッドボード ラジオ」という文字列のコード番号を一括して「Data」として保存しておき、「Restore」で呼び出すプログラムを作りました。同じ文字列を繰り返し表示させる必要がある場合は便利かもしれません。各プログラム文の意味に付いては別項「データの保管と呼び出し」をご覧ください。データの数が多いので4行に分けて書きましたが、特に問題はありませんでした。
プログラムファイル lcd2b.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 | Dim Moji As Byte | 文字表示用変数「Moji」を用いる。 | |
9 | Cursor Off | カーソルを表示しない。 | |
10 | Cls | LCDの表示を消去する。 | |
11 | Lcd "Breadboard Radio" | (上の行に)「Breadboard Radio」と表示する。 | |
12 | Lowerline | LCDの下の行に表示する。 | |
13 | Restore Bbradio | 18行目「Bbradio」内のデータを呼び出す。 | |
14 | For N = 1 To 16 | Forループの範囲ここから。16回繰り返し。 | |
15 | Read Moji : Lcd Chr(Moji) | データを1番目から順に変数「Moji」に読み込む。 | |
変数「Moji」の値をコード番号とする文字を表示。 | |||
16 | Next N | Forループの範囲ここまで。14行目へ戻る。 | |
17 | End | メインプログラム終わり。 | |
18 | Bbradio : | ラベル「Bbradio」。 | |
19 | Data &Hcc, &Hde, &Hda, &Haf | 「Bbradio」内のデータ。「フ」「゛」「レ」「ッ」。 | |
20 | Data &Hc4, &Hde, &Hce, &Hde | 「Bbradio」内のデータ。「ト」「゛」「ホ」「゛」。 | |
21 | Data &Hb0, &Hc4, &Hde, &Hfe | 「Bbradio」内のデータ。「ー」「ト」「゛」「 」。 | |
22 | Data &Hd7, &Hbc, &Hde, &Hb5 | 「Bbradio」内のデータ。「ラ」「シ」「゛」「オ」。 |
BASCOM-AVRでは、コード表にない文字を新たに作ってLCDに表示することができます。ここでは「月」と「日」という文字を作って、画面に「1月1日」と表示してみました。
プログラムファイル lcd2c.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, 15, 9, 15, 9, 15, 9, 19, 32 | 「月」(Chr0)の文字データ。 | |
8 | Deflcdchar 1, 31, 17, 17, 31, 17, 17, 31, 32 | 「日」(Chr1)の文字データ。 | |
9 | Cursor Off | カーソルを表示しない。 | |
10 | Cls | LCDの表示を消去する。 | |
11 | Lcd "1" ; Chr(0) | 画面に「1」を表示、続いて「月」を表示する。 | |
12 | Lcd "1" ; Chr(1) | 画面に「1」を表示、続いて「日」を表示する。 | |
13 | End | 終わり。 |
7行目と8行目が「月」および「日」の文字データです。これを記述するにはBASCOM-AVRの「LCDデザイナー」という機能を使います。まず、7行目と8行目の部分を除いたプログラムを書きます。7行目と8行目のところに空白行を設け、そこへカーソルを持っていきます。ここでBASCOM-AVRのツールバーの「Tool」から「LCD Designer」を選択してクリックします。すると下図の左に示すようなウインドウが出ます。これが「LCDデザイナー」です。この画面で文字を作ります。
「LCDデザイナー」には縦8×横5のマス目が表示されています。このマス目の白いところをクリックすると黒に変わり、黒いところをクリックすると白に変わりますので、適宜マス目をクリックして希望の文字を作ります。私の場合、「月」は中央の図のようにしました。文字の形が決まったら「OK」をクリックします。すると「LCDデザイナー」の画面が消え、プログラム中の先程カーソルを置いた行に
と表示されているはずです。前半の数字は文字データ、後半の英文は「 ? の代わりにに0〜7の数字を入れろ」という意味です。なので、ここでは「?」を「0」に変えます。この「0」が「月」のコード番号になります。そのあと「32」の右の「 ' 」以降を削除します。
これで「月」という字が「Chr(0)」として登録されました。続いて「日」という文字も同様に作成し、コード番号を「1」にします。なお、コード番号は必ずしも「0」から順に付ける必要はありません。
文字データは8個の数字から成っています。これらの数字は「LCDデザイナー」のマス目のそれぞれの行に対応しています。黒いマスを「1」、白いマスを「0」として各行を5桁の2進数で表わし、それを10進数に変えたものが文字データ行に示された数字です。ただしマス目が全部白の行は「0」ではなく「32」と表示されます。「月」の場合、最初の数字は「15」ですが、これはマス目の一番上の行が「01111」すなわち「白黒黒黒黒」であることを表わしています。
自分で作った文字をLCD画面に表示する方法はカタカナのときと同じです。「月」は「Lcd Chr(0)」、「日」は「Lcd Chr(1)」と書きます。