液晶表示器の制御法


【液晶表示器との接続】

 PICと液晶表示器との接続を説明します。その液晶表示器として
使うのは下記に示す様なものです。

【液晶表示器の仕様】
品名   SC1602BSLBまたはSC1602BS*B
概要   16文字2行 超ハイコントラスト
      バックライト付き(BSLBのみ)
      5x7 or 5x10ドット+カーソル表示
      5V単一電源、低消費電流
      CPUインターフェース
         4ビット or 8ビットパラレル

 このような液晶表示器と接続するには、多少ソフトが面倒にはなり
ますが、PICの使うポートが少なくて済む4ビットパラレルを選びましょう。
この4ビットのデータ信号以外に必要な信号は、RS(デバイス選択信号)、
R/W(読込み/  書込み指定)、E(ストローブ信号)の3本です。
 これらとPICとは取りあえず下記のようにつなぐものとして考えます。
この接続方法がソフトから制御し易いためです。
さらに各信号のタイミングも下図に示しますが、要は下側の信号が内側
に入るように出力すればOKです。


   

データバス(DB4−7)の信号内容の区別は2本の制御信号(RS,R/W)で
区別されます。

RS R/W    信号種別
 0  0    Control Command出力
 1  0    書込みデータ出力
 0  1    Busy信号入力
 1  1    読込みデータ入力

【Control Commandの一覧表】
 Commnad     DB7 6 5 4 3 2 1 0    説    明   
Clear Display     0 0 0 0 0 0 0 1  全消去、CursorはHomeへ
Cursor At Home    0 0 0 0 0 0 1 *  表示内容は変化なし。
Entry Mode Set    0 0 0 0 0 1 I/D S  I/D=Increment/Decrement
                        S=With Display Shift
Display On/Off    0 0 0 0 1 D C B  D=Display C=Cursor B=Blink
Cursor/Dislay Shift 0 0 0 1 S/CR/L * *  S/C=Display/Cursor
                        R/L=Right/Left
Function Set     0 0 1 DL N F * *  DL=8/4Bit N=2/1Line
                        F=Large/Small
CGRAM Address Set  0 1  CCRAM Address   Character Generator RAM
DDRAM Address Set  1 L  DDRAM Address   Display RAM L=Line
Busy Flag/Adrs Read BF  Address       BF=Busy Flag
Data Write        8 Bits Data      CGRAM/DDRAM Common
Data Read         8 Bits Data      CGRAM/DDRAM Common


この液晶表示器の制御内容の詳細は下記Webからダウンロードできます。
ページの表中のMSM6562B-1が該当します。

http://www.okisemi.com/datadocs/doc-jpn/msm6562b.pdf



【液晶表示器への制御信号出力ルーチン】

では実際に液晶表示器へControl信号を出力するサブルーチンを説明
します。
Control Command信号であるという条件は、RS=R/W=0です。
4ビットモードで接続しているので、上位4ビットと下位4ビットの2回に
分けて  Commandを出力します。

;**** LCD command out *****
LCD_CMD
  MOVWF  DPDT   ;Commandデータの一時保存
  ANDLW  0F0H   ;上位4ビットをまず出力
  MOVWF  PORTB   ;RB4-7のデータバスへ出力
  BCF   PORTA,1  ;R/Wを0にセット Command条件セット
  BCF   PORTA,2  ;RSを0にセット
  BSF   PORTA,0  ;E high ストローブ信号出力
  BCF   PORTA,0  ;E low
  SWAPF  DPDT,W  ;
  ANDLW  0F0H   ;下位4ビットを出力    
  MOVWF  PORTB   ;RB4-7へ出力
  BSF   PORTA,0  ;ストローブ信号出力
  BCF   PORTA,0
  CALL   LCD_BUSY ;Busy信号が無くなるまで待つ
  RETURN

【液晶表示器への表示データ出力ルーチン】

実際に表示するためには液晶表示器にASCIIの文字コードを送信します。
送信は4ビット毎に2回に分けて行います。
データ送信モードは、RS=0、R/W=1です。
文字を表示するときは、カーソルは右側にシフトしていくので上位側の
文字から表示出力をします。
2行目に表示するときには、DDRAM Address SetのCommandで、Address
Dataに「C0」をSetして出力すると2行目の最初から表示します。

;**** LCD Data Write ****
LCD_DATA
    MOVWF  DPDT   ;表示データ(ASCII)の一時保存
    ANDLW  0F0H   ;上位4ビット転送
    MOVWF  PORTB
    BCF   PORTA,1  ;R/Wを0にセット、データ送信モードセット
    BSF   PORTA,2  ;RSを1にセット
    BSF   PORTA,0  ;E high ストローブ信号出力
    BCF   PORTA,0  ;E low
    SWAPF  DPDT,W  ;get data lower
    ANDLW  0F0H   ;下位4ビットの転送
    MOVWF  PORTB
    BSF   PORTA,0  ;ストローブ信号出力
    BCF   PORTA,0
    CALL  LCD_BUSY ;Busy信号が無くなるまで待つ
    RETURN

【液晶表示器のBusy待ちサブルーチン】

液晶表示器の内部処理は、各コマンド毎に約40usec程度かかります。
(唯一Clearコマンドだけは1.64msecかかります。)
この処理時間の間「Busy」信号が出力されています。従って、連続して
データ転送を行うためには、このBusy信号が無くなるのを待ってから行う
必要があります。下記はこのBusy信号が無くなるまで待つサブルーチン
です。 Busy信号は液晶表示器からの入力になりますので、PIC側の
データバスを入力モードに変更してやる必要があり、処理として一寸面倒
となります。この入力出力の切り替えが必要となるため、PICと液晶表示
器との接続には、データバスとコントロール信号を分けた方が使いやすい
ことになります。

;**** LCD Busy Check ************
LCD_BUSY
    CLRF  DPDT     ;データバッファクリア
    BSF   STATUS,RP0  ;PICモード変更のためBank1へ切替え
    BSF   OPTION_REG,7 ;ポートBのプルアップをOFF指定
    MOVLW  0FEH     ;PORTBRB0以外を入力モードにセット
    MOVWF  TRISB
    BCF   STATUS,RP0  ;Bank 0へ戻す
    BCF   PORTA,2   ;RSを0にセット
    BSF   PORTA,1   ;R/Wを1にセット Busy入力モードをセット
    BSF   PORTA,0   ;E high ストローブ信号出力
    MOVF  PORTB,W   ;データを2回に分けて入力
    BCF   PORTA,0   ;E low
    ANDLW  0F0H     ;まず上位4ビットを入力
    MOVWF  DPDT     ;一時保存
    BSF   PORTA,0   ;E high 次のストローブ信号出力
    MOVF  PORTB,W   ;下位4ビットを入力
    BCF   PORTA,0   ;E low
    ANDLW  0FH     ;Mask out upper
    IORWF  DPDT,F    ;上位と下位をORで合併
    BTFSC  DPDT,7    ;BUSY FLAGビットをチェック
    GOTO  LCD_BUSY   ;Busy状態だったら再度入力繰り返し

    BCF   PORTA,1   ;R/Wを0に戻す(出力モードに戻す)
    BSF   STATUS,RP0  ;PICのモード変更のためBank 1へ切替え
    MOVLW  0EH     ;RB1,2,3 以外は出力へ戻す
    MOVWF  TRISB    ;PORTBモードセット
    BCF   STATUS,RP0  ;Bank 0へ戻す
    RETURN

【液晶表示器の初期リセットサブルーチン】

最後に一寸ややこしい初期リセットの制御サブルーチンです。
この液晶表示器は、電源入力時に自動的にリセット処理をしますが、
それがうまく実行されなかった時のことを考え、ソフトウェアでも初期
化出来るようになっています。
その手順が一寸面倒です。まず液晶表示器を8ビットモードにする
ことから始めます。またこの時点ではBusy Flagは信用出来ないので
使わないようにし、時間で待ちます。
この概略の処理の流れは下記のようになります。

  電源ON
   ↓
 15msec以上待つ      BusyFlagは使わない
   ↓
 8ビットモード設定
   ↓
 4.1msec以上待つ      BusyFlagは使わない
   ↓
 再度8ビットモードに設定
   ↓
 100usec以上待つ      BusyFlagは使わない
   ↓
 再々8ビットモードに設定
   ↓
 4ビットモードに設定   ここまでは8ビットモードで動作している
   ↓
 Function設定       これ以降4ビットモードでBusyFlagも有効
 Display Off制御
 Display On制御
 Entry Modeセット

  下記に実際の初期化サブルーチンを説明します。

;**** Initialize *****
LCD_INI
    CALL   TIME5M   ;15msec以上待つ(5msec3回待ちにしている)
    CALL   TIME5M
    CALL   TIME5M
    MOVLW   030H    ;8ビットモード設定制御
    MOVWF   PORTB
    BCF    PORTA,1  ;R/W 0セット
    BCF    PORTA,2  ;RS 0セット
    BSF    PORTA,0  ;E high ストローブ
    BCF    PORTA,0  ;E low
    CALL   TIME5M   ;4.1msec以上待つ(5msec待ち)
    MOVLW   030H    ;再度8ビットモード設定制御
    MOVWF   PORTB
    BCF    PORTA,1  ;R/W 0セット
    BCF    PORTA,2  ;RS 0セット
    BSF    PORTA,0  ;E high ストローブ
    BCF    PORTA,0  ;E low
    CALL   TIME100  ;100usec以上待つ
    MOVLW   030H    ;再々度8ビットモード設定制御
    MOVWF   PORTB
    BCF    PORTA,1  ;R/W 0セット
    BCF    PORTA,2  ;RS 0セット
    BSF    PORTA,0  ;ストローブ
    BCF    PORTA,0
    CALL   TIME100  ;念のため100usec待ち
    MOVLW   020H    ;4ビットモード設定制御
    MOVWF   PORTB   ;(この時はまだ8ビットモード)
    BCF    PORTA,1  ;R/W 0セット
    BCF    PORTA,2  ;RS 0セット
    BSF    PORTA,0  ;ストローブ
    BCF    PORTA,0
    CALL   TIME100  ;念のため100usec待ち
;以降4ビットモードで動作かつBusyFlag有効
    MOVLW   02CH    ;Function Set(2行、5x10Dot表示指定)
    CALL   LCD_CMD
    MOVLW   08H    ;Display off (Cursor,Blinkなし)
    CALL   LCD_CMD
    MOVLW   0CH    ;Display on (Cursor,Blinkなし)
    CALL   LCD_CMD
    MOVLW   06H    ;Entry Mode Set(Increment,表示シフト指定)
    CALL   LCD_CMD
    RETURN
さて次ぎはダイナミック表示制御のノウハウです。


     次へ      目次ページへ