LCD(液晶表示器)の使い方
 
市販されている 2行16文字のLCD(液晶表示器)の使用方法についてテスト基板を作って表示の動作確認をしてみました。
 
PIC と LCD間の信号のやり取りは
 
 1. 8ビットで信号を送受する(PIC bit7-bit0 と LCD DB7-DB0)
 2. 4ビットで信号を送受する(PIC bit7-bit4 と LCD DB7-DB4)
 3. 4ビットで信号を送受する(PIC bit3-bit0 と LCD DB7-DB4)
 
     の3通りあります。
 
4ビット送受のとき、LCD の DB3-DB0 とはインターフェースできません。 
4ビット送受のとき、LCD の DB3-DB0 は無接続とします。
       LCD 基板内部でプルアップされているため開放のままとします。
 
PIC16F819 による LCD 表示プログラムは次からご覧になれます。
なお、PIC18F系のプログラムは下方にあります。
 
 8ビット(PIC bit7--0) LCD30.asm
 4ビット(PIC bit7--4) LCD31.asm
 4ビット(PIC bit3--0) LCD32.asm
 
LCDは秋月電子から購入したSC1602BS*Bを使用しました。 クロックは10MHZです。
 
プログラムテストに使用した基板は液晶表示器テスト基板の頁にあります。 裏面の配線を変更して3通りのテストをおこないました。 PIC16F819 は PIC16F84A とピン配置が同じですから、プログラムの初期設定部分を変更すれば どちらでも動作します。
 
2003.11.16 改定
2005. 9.22 文字修正
2007.12. 8 改定
2016. 7.18 改定
(参考資料:MICROCHIP社 AN587)
上の参考プログラムは実用していますがプログラムのお勉強といった感があります。
 
LCD へのコマンドや文字データの書込みに LCD の BUSY FLAG をチェックして送受信していますが LCD 制御サブルーチン SENDCMD と LCD文字書込みサブルーチン SENDCHR の中にある CALL BUSYCK (ビジーチェック)に代えて CALL DELAY_TR (遅延時間)を入れてやれば BUSYCK のサブルーチンはいらなくなります。 LCD の文字書込みにどのくらいの遅延時間を持たせればよいか調べてみました。
 
実際に16文字x2行の SC1602BS*B LCD でこの遅延時間のテストしてみました。
文字連続書込み時の各文字データ送信遅延時間 DELAY_TR
       10μ秒:表示出ない
       20μ秒:表示出ない
       30μ秒:文字の表示に欠落あり
       40μ秒:完全に表示される
       50μ秒:完全に表示される
40μ秒あればよい結果がでましたがプログラムとしては若干余裕を持たせて遅延時間タイマ DELAY_TR は 50μ秒〜100μ秒にすれば使えまます。
 
LCD への文字データは BUSY FLAG をチェックしないと気が済まない! というのでなければこのタイマによる方法はプログラムが簡単になります。 ビジーチェックプログラムで LCD からのデータを読込むための I/O 反転もいらなくなり LCD の R/W ピンは常に =0 でよい、つまり R/W ピンはGND に落したままでよくなります。 SENDCMD と SENDCHR のサブルーチン中の「 BCF RW 」 は不要で PIC 側の RW 用ピン1本もいらなくなります。
2005.9.24
 
回路もプログラムも間違っていないのに表示できない!
LCD 表示器のほとんどは日立製 HD44780をコントローラに使用しているのでどこのメーカのLCDでも同じような初期設定と操作プログラムで文字を表示できます。
 
ただし大型LCDは表示1サイクルの時間が小型のものより長いものがあるのでBUSY FLAGを検出するプログラム方式だと1行目の最初の部分を表示しただけで止まってしまったり、全く表示できないことがあります。 大型、小型 LCDのデータシートを読み比べるとよいでしょう。
メーカによってはクロックを 6MHz以下にせよとの説明も見受けられます。
 
8ビットインタフェースはうまく動いても4ビットインタフェースでは8ビットのデータ送信を2回に分けておこなうために BUSY FLAG が得られなくて表示の動作ができないこともあります。
 
この問題は PIC側のクロックの早すぎが原因です。 SC1602BS*B LCDでは10MHzはうまくいっても20MHzにすると10MHzのときのようにうまくBUSY FLAG の受け渡しができません。
先に述べたタイマ式にプログラムを変更し、イネーブル信号のON-OFF間にもタイマを入れればクロック20MHzでも表示できます。
 
メーカによってピン配置が違う!
LCD表示器はメーカの違いによってピン接続の配置が異なります。 それぞれのメーカのデータシートによって配線しないといけません。
 
2006.6.26 追記
クロック 20MHz の PIC で LCD に文字の表示テスト
8個の LED を順次点滅させ LCD に文字を表示させるテストをしてみました。
ハードウエアは市販の PIC18F8720 ボードと LCD (SC1602B S*B-SO-GN-K ) を使いました。
テストしたプログラムは次の4つの方法です。
 
1.PIT と LCD のデータ線は8ビットとし、LCD からのビジーフラグは使わない方法
2.PIT と LCD のデータ線は上位4ビットとし、LCD からのビジーフラグは使わない方法
3.PIT と LCD のデータ線は8ビットとし、LCD からビジーフラグをチェックする方法
4.PIT と LCD のデータ線は上位4ビットとし、LCD からビジーフラグをチェックする方法

1と2 の方法は LCD が制御データや文字データを受信してから内部処理を終えるまでビジーフラグを立てますが、その間適当な時間を待って次のデータ送信します。 LCD からのビジーフラグ受信操作をしないため、LCD の R/W ピンは常に書込み状態にしておけばよく、PIC への配線をしないで GND に落としておいて差し支えありません。

3と4 の方法は LCD のビジーフラグを読取るため、PIC と LCD は制御データや文字データを1つ送るたびに送受信の切替ををおこないます。したがって LCD の R/W ピンは PIC に割り当てたピンに配線します。

テストした基板では PIC の PORTF bit7--0 (8ビットインターフェース)と bit7--4 (上位4ビットインターフェース)を使っています。
下に制御信号書込みルーチンと文字データ書込みルーチンの実施例を抜粋しました。
; 8 ビットインターフェース  LCD のビジーフラグを使わない場合
SENDCMD      ; 制御信号書込み 
  MOVWF  CHAR  ; 制御データを CHAR レジスタへ 
  CALL  DLY50U  ; 50μ秒 遅延 
  MOVFF  CHAR, PORTF  ; データを PORTF へ 
  BCF  RS  ; LCD をコマンドモードにする 
  BCF  RW  ; LCDのRW がGNDに配線ならこの行は不要 
  BSF  STB  ; LCD の Enable ON-OFF 
  BCF  STB   
  RETURN     
SENDCHR      ; 文字データ書込み 
MOVWF  CHAR  ; 文字データを CHAR レジスタへ
  CALL  DLY50U  ; 50μ秒 遅延 
  MOVFF  CHAR,PORTF   
  BSF  RS  ; LCD をデータモードにする 
  BCF  RW   
  BSF  STB   
  BCF  STB   
RETURN
       
; 上位 4 ビットインターフェース  LCD のビジーフラグを使わない場合 
SENDCMD      ; 制御信号書込み  
MOVWF CHAR
CALL DLY50U ; 50μ秒 遅延 
MOVF CHAR, W
ANDLW B'11110000' ; bit3--0 をマスク
MOVWF PORTF ; bit7--4 の値を LCD に送信
BCF RS ; LCD をコマンドモードにする
BCF RW
BSF STB
BCF STB
SWAPF CHAR, W ; CHAR の データ の上下 4bit を入替える
ANDLW B'11110000'
MOVWF PORTF ; bit3--0 の値を LCD に送信
BSF STB
BCF STB
RETURN
SENDCHR ; 文字データ書込み
MOVWF CHAR
CALL DLY50U ; 50μ秒 遅延
MOVF CHAR, W
ANDLW B'11110000'
MOVWF PORTF
BSF RS ; LCD をデータモードにする
BCF RW
BSF STB
BCF STB
SWAPF CJAR, W
ANDLW B'11110000'
MOVWF PORTF
BSF STB
BCF STB
RETURN
ビジーフラグをチェックする方法のプログラムは上記のものとほとんど同じです。
朱記した CALL  DLY50U の部分は不要になり、その部分にビジーフラグチェックのルーチンを呼ぶための CALL  BUSYCK が入ります。
したがって以下のようなビジーフラグチェックのサブルーチンが増えます。
; 8 ビットインターフェース  LCD のビジーフラグチェック サブルーチン
BUSYCK      ; LCD ビジーフラグチェック 
  MOVLW  B'11111111' ; PORTF ピンを入力に設定する 
  MOVWF  TRISF   
  BCF  RS  ; LCD コマンドモード RS=0 
  BSF  RW  ; LCD は出力モード
  BRA   $+2  ; ****** 遅延 *******
  BSF  STB   
  BCF  STB   
  MOVF  PORTF, W  ; LCD の ビジーフラグを読んで 
  MOVWF  TEMP  ; TEMP レジスタへ入れる 
  BTFSC  TEMP, 7  ; TEMP bit7 (BUSY)=1 なら 
  BRA  BUSYCK  ; 最初へ戻る 
  BCF  RW  ; TEMP bit7 (BUSY)=0 となったら 
  MOVLW  B'00000000' ; PORTF ピンは出力に戻す
  MOVWF  TRISF   
  RETURN     
       
; 上位4 ビットインターフェース  ビジーフラグチェック サブルーチン 
BUSYCK       
  MOVLW  B'11110000'  ; PORTF の bit7--4 を 
  MOVWF  TRISF  ; 入力にする 
  BCF  RS  ; LCD をコマンドモードにする 
  BSF  RW  ; LCD は出力モード 
  BRA   $+2  ; ****** 遅延 *******
  BSF  STB  ; LCD Enable ON-OFF 
  BCF STB   
  MOVF  PORTF, W  ; LCDのDB7--4 の値を PORTF bit7--4 に読込 
ANDLW B'11110000' ; 下位データはマスクする
MOVWF TEMP ; その値を TEMP レジスタに入れる
BSF STB ; 次に LCDから出る DB3--0 の値を
BCF STB ; PORTF bit7--4 に読込
SWAPF PORTF, W ; 上下ビットを入れ替えて W レジスタへ
  ANDLW  B'00001111'  ; Wレジスタの上位をマスク  
  IORWF  TEMP, F  ; W と TEMP の OR を取り TEMP へ 
  BTFSC  TEMP, 7  ; TEMP bit7(ビジーフラグ)=1 ならビジーだから 
  BRA  BUSYCK  ; 最初に戻り繰返す 
  BCF  RW  ; TEMP bit7=0 なら RW=0 LCDは読込モード 
  MOVLW  B'00000000'  ; PORTF ポートは元の出力に戻す 
  MOVWF  TRISF   
  RETURN     
上のビジーフラグチェックサブルーチンは BRA  $+2  ; **** 遅延 ****の命令がこのルーチンのポイントで、これを入れないと動きません。

テストに使用した PIC18F8720 は SFR のバンク切替がありません。
PIC16F系の場合は TRISx など、プログラムの中にバンク切替を入れる必要があります。

同様に MOVFF   CHAR, PORTF の行は
     MOVF    CHAR, W
     MOVWF   PORTF   の2行になります。

上のプログラムの中にあるコマンド「 BRA  $+2」 は 「GOTO  $+2 」に替えて使用しています。$+2 についてはこちらをご覧ください。
プログラム全体については下記からご参考にしていただけます。
   8 ビット
 Busy Flag を使わないプログラム
 F8720_04.asm
   上位 4 ビット
 Busy Flag を使わないプログラム
 F8720_06.asm
   8 ビット
 Busy Flag をチェックするプログラム
 F8720_03.asm
   上位 4ビット
 Busy Flag をチェックするプログラム
 F8720_05.asm
PIC目次へ        トップページへ