目次>5章 第2ステップ(色々な実験)>(17)液晶ディスプレイを使う

液晶ディスプレイを使う
− まずは表示してみる(4ビット操作) −
更新日2008.4.13

PICで液晶ディスプレイ(LCD)を使って見ます。
液晶ディスプレイを使うと色々な状態表示が可能になり、PICでの楽しみの幅が広がります。

液晶ディスプレイ(LCD)とは

PICで扱える液晶ディスプレイは比較的小さなもので、キャラクタディスプレイとグラフィックディスプレイの2種類があります。
今回使用する液晶ディスプレイは、英数字や記号などの文字が表示できるキャラクタディスプレイです。


上は、16文字×2行の小型タイプ
SD1602HUOB:バックライト付(\900)


真ん中は、16文字×2行の標準タイプ
SC1602BSLB:バックライト付(\800)



下は、20文字×4行タイプ
SC2004CSLB:バックライト付(\1,700)

16文字×2行の標準タイプLCD(SC1602BS*B:バックライトなし(\550))に文字を表示させた状態

回路図
今回の実験回路は以下の通りです。

使用したLCDは、SC1602BS*Bで、16文字×2行のバックライトが無いタイプです。

RA0〜2:LCDの制御ピンを接続(R/W,E,RS)
RB0〜3:LCDのデータピンの上位4ビットを接続(DB4〜7)

実験回路を組む
ブレッドボードに組んだ所。

上の黒い四角はPIC16F84Aで、下の黒い四角はLCD用のソケット(自家製)です。

LCDを取り付けるとこのようになります。

液晶ディスプレイ(LCD)の使い方(SC1602BS)
LCD(SC1602)の使い方について以下の順に説明します。
・LCD(SC1602BS)のピン
・LCDへの書き込み動作
・LCDの初期化
・LCDへの表示例
・LCDのビジーフラグ(BF)のチェック方法

LCDとのデータのやり取りには、4ビットモードと8ビットモードの2種類がありますが、通常は4ビットモードで使用します。
以下でも4ビットモードを想定して説明しています。

LCD(SC1602BS)のピン
ピン番号ピン設定内容
1Vdd+5V
2VssGND(0V)
3Voコントラスト調整(回路図を参照)
4RSレジスタ選択
 H:データレジスタ
 L:制御レジスタ
5R/WRead/Write選択
 H:Read(LCD→PIC)
 L:Write(PIC→LCD)
6EENABLE信号
以下の順に設定することで上記RS,R/Wで選択した動作をDB0〜7ピンに対して実行する。
 L→H→L
それぞれの間隔は、0.22μ秒以上空ける。
7DB0 表示データまたは制御データ用のピンで、LCDに書き込む場合は事前にセットする。
LCDから読み込む場合は、読み込んだ内容が設定される。

データは8ビット操作と4ビット操作があり、LCDの初期化でいずれかに設定する。
8ビット操作の場合は、DB0〜7を使用。
4ビット操作の場合は、DB4〜7を使用し、1バイト(8ビット)のデータを上位4ビットと下位4ビットに分けて2回で実行する。

4ビット操作にする場合は、DB0〜3はオープン(何も接続しない)にしておく。

8DB1
9DB2
10DB3
11DB4
12DB5
13DB6
14DB7

LCDへの書き込み動作
LCDに1バイトのデータを書き込むためには、下表のシーケンスで行います。
今回は4ビット操作にしますので、1バイトを上位4ビットと下位4ビットに分けて、2回の操作で書き込みます。

この例は、制御データ(RS:L)の書き込み(R/W:L)の場合です。
表示データの場合は、RSをHにします。
また、LCDから読み込む場合は、R/WをHにします。(この場合、PICのRB0〜3を入力モードに設定する必要があります。)

No.設定ピン設定内容意味命令の例

1E0EnableをOFFにするBCF PORTA,1
2RS0制御レジスタを選択BCF PORTA,2
3R/W0書き込みモードに設定BCF PORTA,0





4DB7-4bbbb書き込む上位4ビットを設定MOVWF PORTB
5E1Enableを一旦ONにしてBSF PORTA,1
6E1220nS以上待ってNOP
7E0OFFにするBCF PORTA,1





8DB7-4bbbb書き込む下位4ビットを設定MOVWF PORTB
9E1Enableを一旦ONにしてBSF PORTA,1
10E1220nS以上待ってNOP
11E0OFFにするBCF PORTA,1

No.1〜3は、既にこのように設定されているピンは、改めて設定し直す必要はありません。

No.6と10の待ちは、PICのクロックが10MHz以下であれば不要です。
今回はクロックを20MHzにしましたので、NOP命令を1つ入れておきます。

No.4と8の命令の例は、実際にはRB0〜3の4ビットに必要なデータをセットし、RB4〜7は変更しないような考慮が必要です。(今回の回路はRB4〜7を使っていませんので考慮は不要ですが)

LCDの初期化
4ビットモードでのLCDの初期化は、以下のシーケンスで行います。
少し面倒ですが・・・

この表の1行は、前の表のNo.1〜7を1行にまとめています。
また、2行を1つのNo.としているものは、前の表のNo.1〜11を2行にまとめています。(上段が上位4ビット,下段が下位4ビット)

No.RS
(RA2)
R/W
(RA0)
DB7
(RB3)
DB6
(RB2)
DB5
(RB1)
DB4
(RB0)
補  足
1電源ON後、15mS以上待つ
2000011一旦8ビットモードに設定する

(電源ON後のLCDの状態がどんな状態であっても、No.7まで行うと8ビットモードに設定できる)

34.1mS以上待つ
4000011
5100μS以上待つ
6000011
740μS以上待つ
80000104ビットモードに設定
940μS以上待つ
100000102行表示モードに設定
001000
1140μS以上待つ
12000000ディスプレイOFF,カーソルOFF,ブリンクOFFに設定
001000
1340μS以上待つ
14000000ディスプレイクリア
000001
151.64mS以上待つ
16000000エントリモード設定
カーソル移動は右方向,表示内容のシフトなし
000110
1740μS以上待つ

No.7以降の時間待ちは、ビジーフラグ(BF:後述)をチェックすることでも代替できます。
No.3と5では、ビジーフラグをチェックできませんので、時間待ちとします。

LCDへの表示例
LCDの初期化が終わったらLCDに文字を表示できます。

ここでは、1行目の先頭に'12'を表示し、2行目の先頭に'23'を表示する例を説明します。

No.RS
(RA2)
R/W
(RA0)
DB7
(RB3)
DB6
(RB2)
DB5
(RB1)
DB4
(RB0)
補  足
10010001行目の先頭にアドレス設定
000000
240μS以上待つ
3100011数字の1を出力
100001
440μS以上待つ
5100011数字の2を出力
100010
640μS以上待つ
70011002行目の先頭にアドレス設定
000000
840μS以上待つ
9100011数字の2を出力
100010
1040μS以上待つ
11100011数字の3を出力
100011
1240μS以上待つ

ここでの時間待ちは、ビジーフラグ(BF)をチェックする方法でも可能です。

LCDのビジーフラグ(BF)のチェック方法
今までの例では、LCDの動作完了を一定の時間で待ちましたが、LCDのビジーフラグ(BF)をチェックする方法もあります。
LCDからデータを読み込みますので、PICのRB0〜3を一時的に入力モードに切り替える必要があります。

先ほどの、LCDへの表示例のNo.1〜4をBFチェック方式にすると以下のようになります。

No.RS
(RA2)
R/W
(RA0)
DB7
(RB3)
DB6
(RB2)
DB5
(RB1)
DB4
(RB0)
補  足
10010001行目の先頭にアドレス設定
000000
2RB0〜3を入力モードに設定
301BFxxxBFを読み込む
01xxxx
4BFが1(LCD処理中)ならNo.3へ
BFが0なら次へ
No.1の設定完了を待つ
5RB0〜3を出力モードに設定
6100011数字の1を出力
100001
7RB0〜3を入力モードに設定
801BFxxxBFを読み込む
01xxxx
9BFが1(LCD処理中)ならNo.8へ
BFが0なら次へ
No.6の書き込み完了を待つ
10RB0〜3を出力モードに設定

少し面倒に見えますが確実ですし、BFチェックまでの間に他の処理ができますので無駄な時間を削減できます。
(クロックが20MHzであれば、40μ秒待つ間に200命令実行できます。)

また、BFチェック処理はいつも同じロジックですので、サブルーチン化して流用すれば毎回作成する必要もありません。

プログラム全体
LCDを使うサンプルプログラムはこちらです。

このプログラムは下の写真のように、LCDの1行目に'Hello,'を表示し、2行目に'world!'を表示します。

うまく表示できましたか?

次回はLCDを使った実用的な(誤差の少ない)時計をアップする予定です。

4ビット操作と8ビット操作
初めてLCDの説明書を見たとき、8ビット操作(1バイト単位)ができるのに、何故面倒な4ビット操作があるのだろうと思ったものです。
実際に、当時は8ビット操作から入りました。
ですが、しばらくしてからは4ビット操作で使い続けています。

理由は簡単で、4ビット操作にはデメリットが無く、逆に少ないピンで操作できるというメリットが大きいからです。

4ビット操作は、1バイトを2回に分けて制御しますので面倒に感じるかも知れませんが、LCDアクセスルーチンを1回作っておけば、後は4ビットも8ビットも同じに扱えます。

一方、使用するピン数が4本少なくて済むと言うメリットはいつでも享受できます。

比較項目4ビット操作8ビット操作説 明
プログラミングLCDアクセスルーチンを1回作れば後は同じ
必要なピン×4ピン少なくて済むメリットは多大
スピードどちらも同じ(あっても1〜5マイクロ秒程度の差)