SC1602 LCDモジュールをPICで制御する

LCD module
最近安価で入手できるLCDモジュールとしてSC1602がありますが、PICでこのドライブを行なうためのライブラリを作りました。といっても、ライブラリ化する方法が良くわからなかったので、単にヘッダーファイルとソースファイルを一緒にリンクするだけですが・・・
コンパイラはHI-TECH softwareのPICCコンパイラを使用しています。
同様のコードはPICCのサンプルコードにも入っていますし、ネットで製作記事を見つけるのも難しくはないと思います。
多くの製作記事では、2ポート使っているので、1ポートで動作すること、ハードが変わった場合に移植が比較的容易なことを目標に作成しました。当然、データ転送は4 bitモードとしています。
既存のソースを流用した方が手っ取り早かったのですが、自分が習得する目的もあって1から作りました。ShiftやCGRAMへの書き込みもサポートしており、まずまず使いやすい物が出来たのではないかと思っています。

使用した部品

テストサーキットのPICには16F84を使いましたが、デジタルoutputが6 pin以上あればなんでも良いです。
LCDはSC1602Bを使用しましたが、コントローラーがHD44780コンパチならば同じ制御方法で動作するはずです。20桁x4行のLCDもほぼ同じ用に使えるようです。

回路

circuit クロックは10MHzとしましたが、ライブラリ内で設定する箇所があるので、適切に設定を行なえば、変更は可能です。
R/Wは使用せず、書き込みのみとしています。ほとんどの命令は1から2 cycleで終了してしまうので、Busy Flagを監視すると逆に時間が掛かってしまうため、時間の掛かる命令のみ十分waitさせる方が簡単だからです。

使い方

まず、lcd4.cでポートの設定をする必要があります。また、_XTAL_FREQにクロック周波数を設定する必要があります。これは__delay関数を使っているせいと、18MHzを超えた場合にEnable bitのパルス幅220usを確保するためにnopを入れるようにマクロを組んであるためです。
lcd4.cの中の__delay_ms関数ではコンパイラのバグで_XTAL_FREQ=10MHzの時__delay_ms(100)が80ms程度になってしまい動かなかったので若干長めにしてあります。タイミング的にシビアなアプリケーションの場合は、調整してください。
以下に関数の概要を示します。詳細はソースファイル (lcd4.c, lcd4.h)を見てください。
Putc_LCD4()
一番基本となっている関数です、8bitのキャラクタや命令を4bit2回に分けて送ります。
第一引数にキャラクタまたはコマンド(8bit)、第二引数にデータ/コマンドの別(0:コマンド、1:DATA。つまりRSの値)を指定します。
Init_LCD4()
LCDのinitializeはInit_LCD4()で行います。この関数は一番最初に実行する必要があります。
initializeの方法はLCDのマニュアルに記載されている通り、電源投入から15ms経過後にD4-D7に0x3hを3回、15ms、100usの間隔をおいて書き込んでいます。display modeの設定以降は、Putc_LCD4関数を利用しています。
Puts_LCD4()
文字列の書き込みには使います。引数に文字列のポインタを渡します。
与える文字列はNULLでターミネートされていなければなりません。通常、C言語では文字列はNULLでターミネートされているので、この慣習に従っています。しかしながら、CGRAM(1)のキャラクタコードが0x0なので、CGRAM(1)を使用する場合は注意が必要です。
Set_Pos()
DDRAMアドレスの指定。つまりカーソルの移動に使います。
DDRAMのアドレッシングについてはLCDのマニュアルを参照してください。
Shift_L, Shift_R, Shift_LN(), Shift_RN()
SC1602Bの場合は、DDRAM自体は40桁x2行となっており、このうち表示可能である16桁x2行を表示しているので、Shiftすることで17から40桁目を表示することが出来ます。この表示位置を左または右にシフトする関数です。
CGRAM()
CGRAMに値を書き込むために使用します。第一引数にCGRAMのキャラクタコード(0-8)、第二引数にEEPROMアドレスを指定します。
キャラクタパターンは、第二引数で指定するEEPROMアドレスを始点として8バイトの連続領域に格納されている事を想定しています。
CGRAMデータの詳細については、LCDドライバ(HD44780)のマニュアルを参照してください。

テストプログラム

1桁目から"01234567890ABCDEF"を、16桁目から"abcdefghijklmnop"をDDRAMに書き込みます。2行目も同様です。
1秒おきに16桁左にShiftしたり、戻したりすることで2画面を交互に表示するような効果を得ています。
ソースファイル - lcd.c
CGRAMにパターンを書き込んで利用する例を示したテストプログラムです。
あらかじめキャラクタを用意しておき、以後は書き換えない場合が多いと思いますが、試したところCGRAMはキャラクタを表示した状態でも書き換えることが可能であったので、このプログラムではCGRAM(1)を表示しておき、キャラクタパターンを書き換える事でバーが上下に移動させています。
ソースファイル - cgram2.c