目次>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)のピン
| ・ |
ピン番号 | ピン | 設定内容
| 1 | Vdd | +5V
| 2 | Vss | GND(0V)
| 3 | Vo | コントラスト調整(回路図を参照)
| 4 | RS | レジスタ選択 H:データレジスタ L:制御レジスタ
| 5 | R/W | Read/Write選択 H:Read(LCD→PIC) L:Write(PIC→LCD)
| 6 | E | ENABLE信号
以下の順に設定することで上記RS,R/Wで選択した動作をDB0〜7ピンに対して実行する。
L→H→L
それぞれの間隔は、0.22μ秒以上空ける。
| 7 | DB0 |
表示データまたは制御データ用のピンで、LCDに書き込む場合は事前にセットする。 LCDから読み込む場合は、読み込んだ内容が設定される。
データは8ビット操作と4ビット操作があり、LCDの初期化でいずれかに設定する。
8ビット操作の場合は、DB0〜7を使用。
4ビット操作の場合は、DB4〜7を使用し、1バイト(8ビット)のデータを上位4ビットと下位4ビットに分けて2回で実行する。
4ビット操作にする場合は、DB0〜3はオープン(何も接続しない)にしておく。
| 8 | DB1
| 9 | DB2
| 10 | DB3
| 11 | DB4
| 12 | DB5
| 13 | DB6
| 14 | DB7
|
| LCDへの書き込み動作
| ・ |
LCDに1バイトのデータを書き込むためには、下表のシーケンスで行います。
今回は4ビット操作にしますので、1バイトを上位4ビットと下位4ビットに分けて、2回の操作で書き込みます。
この例は、制御データ(RS:L)の書き込み(R/W:L)の場合です。
表示データの場合は、RSをHにします。
また、LCDから読み込む場合は、R/WをHにします。(この場合、PICのRB0〜3を入力モードに設定する必要があります。)
| No. | 設定ピン | 設定内容 | 意味 | 命令の例
| 共 通 | 1 | E | 0 | EnableをOFFにする | BCF PORTA,1
| 2 | RS | 0 | 制御レジスタを選択 | BCF PORTA,2
| 3 | R/W | 0 | 書き込みモードに設定 | BCF PORTA,0
| 上 位 4 ビ ッ ト | 4 | DB7-4 | bbbb | 書き込む上位4ビットを設定 | MOVWF PORTB
| 5 | E | 1 | Enableを一旦ONにして | BSF PORTA,1
| 6 | E | 1 | 220nS以上待って | NOP
| 7 | E | 0 | OFFにする | BCF PORTA,1
| 下 位 4 ビ ッ ト | 8 | DB7-4 | bbbb | 書き込む下位4ビットを設定 | MOVWF PORTB
| 9 | E | 1 | Enableを一旦ONにして | BSF PORTA,1
| 10 | E | 1 | 220nS以上待って | NOP
| 11 | E | 0 | OFFにする | 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以上待つ |
| 2 | 0 | 0 | 0 | 0 | 1 | 1 | 一旦8ビットモードに設定する (電源ON後のLCDの状態がどんな状態であっても、No.7まで行うと8ビットモードに設定できる)
| 3 | 4.1mS以上待つ
| 4 | 0 | 0 | 0 | 0 | 1 | 1
| 5 | 100μS以上待つ
| 6 | 0 | 0 | 0 | 0 | 1 | 1
| 7 | 40μS以上待つ
| 8 | 0 | 0 | 0 | 0 | 1 | 0 | 4ビットモードに設定
| 9 | 40μS以上待つ |
| 10 | 0 | 0 | 0 | 0 | 1 | 0 | 2行表示モードに設定
| 0 | 0 | 1 | 0 | 0 | 0
| 11 | 40μS以上待つ |
| 12 | 0 | 0 | 0 | 0 | 0 | 0 | ディスプレイOFF,カーソルOFF,ブリンクOFFに設定
| 0 | 0 | 1 | 0 | 0 | 0
| 13 | 40μS以上待つ |
| 14 | 0 | 0 | 0 | 0 | 0 | 0 | ディスプレイクリア
| 0 | 0 | 0 | 0 | 0 | 1
| 15 | 1.64mS以上待つ |
| 16 | 0 | 0 | 0 | 0 | 0 | 0 | エントリモード設定 カーソル移動は右方向,表示内容のシフトなし
| 0 | 0 | 0 | 1 | 1 | 0
| 17 | 40μ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) | 補 足
| 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1行目の先頭にアドレス設定
| 0 | 0 | 0 | 0 | 0 | 0
| 2 | 40μS以上待つ |
| 3 | 1 | 0 | 0 | 0 | 1 | 1 | 数字の1を出力
| 1 | 0 | 0 | 0 | 0 | 1
| 4 | 40μS以上待つ |
| 5 | 1 | 0 | 0 | 0 | 1 | 1 | 数字の2を出力
| 1 | 0 | 0 | 0 | 1 | 0
| 6 | 40μS以上待つ |
| 7 | 0 | 0 | 1 | 1 | 0 | 0 | 2行目の先頭にアドレス設定
| 0 | 0 | 0 | 0 | 0 | 0
| 8 | 40μS以上待つ |
| 9 | 1 | 0 | 0 | 0 | 1 | 1 | 数字の2を出力
| 1 | 0 | 0 | 0 | 1 | 0
| 10 | 40μS以上待つ |
| 11 | 1 | 0 | 0 | 0 | 1 | 1 | 数字の3を出力
| 1 | 0 | 0 | 0 | 1 | 1
| 12 | 40μ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) | 補 足
| 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1行目の先頭にアドレス設定
| 0 | 0 | 0 | 0 | 0 | 0
| 2 | RB0〜3を入力モードに設定 |
| 3 | 0 | 1 | BF | x | x | x | BFを読み込む
| 0 | 1 | x | x | x | x
| 4 | BFが1(LCD処理中)ならNo.3へ BFが0なら次へ | No.1の設定完了を待つ
| 5 | RB0〜3を出力モードに設定 |
| 6 | 1 | 0 | 0 | 0 | 1 | 1 | 数字の1を出力
| 1 | 0 | 0 | 0 | 0 | 1
| 7 | RB0〜3を入力モードに設定 |
| 8 | 0 | 1 | BF | x | x | x | BFを読み込む
| 0 | 1 | x | x | x | x
| 9 | BFが1(LCD処理中)ならNo.8へ BFが0なら次へ | No.6の書き込み完了を待つ
| 10 | RB0〜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マイクロ秒程度の差)
|
|