http://www.okisemi.com/datadocs/doc-jpn/msm6562b.pdf
LCD用サブルーチン。あとはメインルーチンを作成すれば良いはず
;**** 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
;
;**** 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
;
;**** 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
;
;**** 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 TIME02M ;100usec以上待つ(200usec待ち)
MOVLW 030H ;再々度8ビットモード設定制御
MOVWF PORTB
BCF PORTA,1 ;R/W 0セット
BCF PORTA,2 ;RS 0セット
BSF PORTA,0 ;ストローブ
BCF PORTA,0
CALL TIME02M ;念のため200usec待ち
MOVLW 020H ;4ビットモード設定制御
MOVWF PORTB ;(この時はまだ8ビットモード)
BCF PORTA,1 ;R/W 0セット
BCF PORTA,2 ;RS 0セット
BSF PORTA,0 ;ストローブ
BCF PORTA,0
CALL TIME02M ;念のため200usec待ち
;以降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
;
;タイマーサブルーチン20MHzオシレータの場合
;
;0.2msec
TIME02M
MOVLW 0F9H ;249回
MOVWF CNT1 ;ここまでで2サイクル
TIMLP1 NOP ;1
DECFSZ CNT1,F ;1
GOTO TIMLP1 ;2 ここまでで2+4*249-1=997
RETURN ;2 997+2=999 999*0.2usec=0.2msec
; 5msec
TIME5M
MOVLW 019H ;25回
MOVWF CNT2 ;ここまでで2サイクル
TIMLP2
CALL TIME02M ;2+999
DECFSZ CNT2,F ;1
GOTO TIMLP2 ;2 2+1004*25-1=25101
RETURN ;2 25101+2=25103