TOPMPLAB XC8編(PIC16F887)> 液晶ディスプレイを使う(PIC16F887 XC8)

液晶ディスプレイ(LCD)を使う
(PIC16F887 XC8)
更新日2012.5.20
作成日2009.4.11


ここでは、MPLAB XC8でLCD(液晶ディスプレイ)を使って見ます。
使用するPICは、40ピンのPIC16F887です。

実験回路
今回の実験回路です。
クロックは内部クロックで8MHzです。

LEDと直列の抵抗は、300〜800Ω程度の範囲で選択可能です。


これだけであれば、40ピンのPICを使う必要はありませんが、別目的の回路を作成する途中段階のためこのようになりました。

ブレッドボードに組んだ状態
左上の6ピンヘッダ周りは、回路図には有りませんがICSP(In-Circuit Serial Programming)用です。秋月のPICライタなどを使う場合は不要です。

プログラム

今回のプログラムはこちらです。

LCDの使い方については、「液晶ディスプレイを使う」を参照して下さい。
LCDは4ビット動作とし、ビジーフラグは使わないで時間待ちにより動作完了を待ちます。

プログラムの各ブロックで行っている処理は以下通りです。

main()
PICの初期化(pic_init)とLCDの初期化(LCD_init)を行った後、LCDの1行目と2行目にそれぞれ16文字を0.5秒間隔で表示します。
同時に、RA0のLEDを0.5秒間隔で点滅させます。
pic_init()
PICの初期化処理を行います。
クロックを内部8MHzに設定し、使わないA/D変換を無効にして、RA0,RD2-7を出力に設定します。
LCD_init()
LCDの初期化を行います。
LCD_cmd(unsigned char)
LCDにコマンドを送ります。
コマンドは、引数で与えます。
LCD_data(unsigned char)
LCDに1バイトのデータを送ります。
データは、引数で与えます。
LCD_send4(unsigned char)
LCDに4ビットを送ります。
送るデータは引数で与え、上位4ビットを送信します。
wait_50us()
50μS(マイクロ秒)待ちます。
LCD出力時の待ち時間として使います。
wait_ms(unsigned char)
1mS(ミリ秒)×指定値だけ待ちます。
指定値は引数で与え、指定値の数だけwait_1msを呼び出します。

例えば、20mS待つ場合は、
wait_ms(20);
と言うように使います。
wait_1ms()
1mS(ミリ秒)待ちます。
wait_msで使用します。
逆アセンブルリストを参考にして、NOPの数とループ回数を決めています。

動作確認

動作させた状態です。
この写真は、2行16桁全て表示した瞬間です。
電源を投入すると、LCDはクリア状態からスタートし、1行目の1桁目から1文字ずつ0.5秒毎に順に表示し、2行目の16桁目まで表示すると(写真の状態)クリアして1行1桁目から再度表示します。