レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

PICをHD44780互換LCDのドライバにする

2020年01月31日 | 電子工作

前回HD44780互換LCD+PIC16F819にATtiny85から送った文字を表示することができたので、今度は前回実装されていなかったHD44780の全機能を利用できるようにPICのプログラムを作り込んでみることにしました。使用するPIC、LCD、配線等は前と同じです。

まずはPIC単体でLCDを制御するプログラムを組みます。前回利用させていただいたサイトのソースを見てみるとHD44780の制御はそれほど難しくはなさそうだったので、データシート等を元にしてプログラムを作ってみました。

newmain.c

作成したプログラムはHD44780の機能を使った簡単なデモを繰り返すものになっています。
このプログラムではHD44780の持っている機能をひと通り利用できるようになっていますが、使用するLCDが8x2行を16x1行に見せかけているものなので、文字表示の際にカーソルが8文字目から9文字目に移る時と、9文字目から8文字目に移る時にカーソル位置を修正するという少しイレギュラーな処理を追加しました。そのため文字を表示しながら画面シフトする機能などは意図したような動作にならないことがあります。

とりあえずはLCDの制御部分が完成したので、つぎはATtiny85との通信部分のコーティングに取り掛かります。前回はPIC側がポーリングによりATtiny85から送られてくるデータを監視していましたが、今回はPICが受け付けるコマンド等が増えポーリングではデータの取りこぼしが発生しそうなので、割り込みによるデータ受信をするようにしました。
作成したプログラムはこちらです。

newmain.c

プログラム自体は特別なことをしていないので、コンフィギュレーションビットを書き換えれはPIC16F819以外のPICでもそのまま動かすことが出来ると思います。
このPICに接続するATtiny85のスケッチはこちらになります。

ATtiny85PIC_LCD8x2.ino

このスケッチもHD44780の機能を使ったデモを繰り返すものになっています。



せっかくなのでよく利用される16x2行のHD44780互換LCDのプログラムも作成しました。PIC16F819のプログラムと、それを利用するATtiny85のスケッチはこちらです。

newmain.c
ATtiny85PIC_LCD16x2.ino



ATtiny85のスケッチは、前回同様ATTinycoreパッケージを使用しました。動作クロックは内部クロック1MHzにしました。Arduino Pro Mini 5V,16MHzでもこのスケッチが動作するのは確認しています。

スケッチを見ていただければすぐに分かると思いますが、通信手順はAVRからPICにHD44780のインストラクション(コマンド)や文字をバイト単位で一方的に送りつけるだけで、PIC側からアクノリッジを受け取ったりしない単純なものになっています。
スケッチでPICにコマンドを送る時にsendCommand()を使っていますが、これはマクロ定義になっていてsendChar()に置き換わります。どちらも同じルーチンを呼び出していますが、スケッチを見た時にコマンド送信とキャラクタ送信をひと目で区別できるようにしたかったのでそうしておきました。

PICに送るコマンドはHD44780のインストラクションに沿ったもので、1バイトずつ送信します。そのコード番号はHD44780でキャラクタが登録されていない0x1D〜0x1Fと0x80〜0x9F(日本向け製品のみ)を利用しています。詳しくは以下の通りです。

0〜0x1C, 0x20〜0x7F, 0xA0〜0xFF 1文字表示

キャラクタパターンの設定(1キャラクタごとにコマンド含め10バイトのデータを送る)
0x1F    定義開始
2バイト目   キャラクタコード0〜7
3〜10バイト キャラクタパターン登録

0x1D カーソルを1行目に移動(16x2行のみ)
0x1E カーソルを2行目に移動(16x2行のみ)

0x80〜0x8F カーソル位置設定 0〜15

0x90 表示クリア&カーソルをホーム位置へ

0x91 シフトを初期位置へ&カーソルをホーム位置へ

カーソル移動方向
0x92 右方向
0x93 左方向

キャラクタ表示後画面をシフト
0x94 シフトON
0x95 シフトOFF

ディスプレイ表示
0x96 表示する
0x97 表示しない

カーソル表示
0x98 表示する
0x99 表示しない

ブリンクカーソル
0x9A ON
0x9B OFF

カーソル移動
0x9C 右移動
0x9D 左移動

表示をシフト
0x9E 右シフト
0x9F 左シフト


ところで今回の回路はブレッドボード上で構築しましたが、ブレッドボードでAVRを扱う時にいつもはパスコンを入れていませんでした。ところが今回のATtiny85ではパスコンを入れないで使用していると、データの送信が不安定になって頻繁に文字化けがおこりました。最初この事に気が付かず、デバッグにかなりの時間を費やすことになってしまいました。
生のATtiny85を使うときは常にパスコンを入れておくことをおすすめします。



最新の画像もっと見る

コメントを投稿