kuroの覚え書き

96の個人的覚え書き

LCDの仕様



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