【液晶表示器との接続】
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 |