;********************************************************************
;********************************************************************
;                LCD表示器 DM1602 by PIC----8bit入力
;********************************************************************
;********************************************************************

;接続方法
;RA0=E,RA1=R/W,RA2=RS
;RB0=DB0,RB1=DB1,~~~,RB7=DB7
;********************************************************************
        LIST        P=PIC16F84    ;
        INCLUDE     "P16f84.inc"  ;標準ヘッダ定義ファイル
;********************************************************************

TIMCNT  EQU     0CH             ;タイマ用カウンタ
TIM5CNT EQU     0DH             ;タイマ用カウンタ
TIM1CNT EQU     0EH             ;タイマ用カウンタ
LCDDT   EQU     0FH             ;LCD表示データ格納
LCDINST EQU     010H            ;LCDインストラクション格納

        ORG     0               ;Reset Start

;********************************************************************
;             メインルーチン
;********************************************************************

MAIN                            ;PICのInitialize 、ポート初期化(全ポートを"0"状態に)
        BSF     STATUS,RP0      ;バンク1へ切替
	  CLRF	TRISA		;ポートAを出力モードに設定
        CLRF	TRISB           ;ポートBを出力モードに設定
        BCF     STATUS,RP0      ;バンク0に戻す     
        MOVLW   B'00000000'     ;初期出力
        MOVWF   PORTA
        MOVLW   B'00000000'     ;初期出力
        MOVWF   PORTB

;********************************************************************
;LCDモジュールの初期化
;********************************************************************
;-----------------------------------手順-----------------------------
;1.電源ON
;2.電源立ち上がりから15ms待ち
;3.BUSYフラグチェックせずに
; [30H書き込み]−[4.1ms待ち]−[30H書き込み]−[100μsec待ち]-[30H書き込み]
;4.ファンクションセット(今回:8ビット 2行 5×7ドット)
;5.表示クリア
;6.エントリーモード
;7.表示ON
;--------------------------------------------------------------------
        CALL    TIM5            ;まず15msec以上待ち(TIM5は約5msec)
        CALL    TIM5
        CALL    TIM5
        CALL    TIM5 
        MOVLW   030H
        MOVWF   PORTB
        BCF     PORTA,1         ;R/WをWに
        BCF     PORTA,2         ;RSをインストラクションに
        BSF     PORTA,0         ;E
        BCF     PORTA,0

        CALL    TIM5            ;4.1msec以上待ち
        MOVLW   030H
        MOVWF   PORTB
        BCF     PORTA,1         ;R/WをWに
        BCF     PORTA,2         ;RSをインストラクションに
        BSF     PORTA,0         ;E
        BCF     PORTA,0

        CALL    TIM04           ;100μsec以上待ち(TIM04は約0.4msec)
        MOVLW   030H
        MOVWF   PORTB
        BCF     PORTA,1         ;R/WをWに
        BCF     PORTA,2         ;RSをインストラクションに
        BSF     PORTA,0         ;E
        BCF     PORTA,0

        CALL    TIM04
        MOVLW   038H            ;Function Set 8ビット 2行 5×7ドット
        CALL    LCDCMD
        MOVLW   01H             ;表示クリア
        CALL    LCDCMD        
        MOVLW   06H             ;エントリーモード                
        CALL    LCDCMD
        MOVLW   0CH             ;表示ON
        CALL    LCDCMD
;--------------------------------------------------------------------       
;文字書き込み(ループ)
;--------------------------------------------------------------------
;1行目に"Hello!"をLCDに書き込み
;2行目に”Santech Co.,Ltd."を1文字飛ばしながらLCDに書き込み
CHR_WRITE
        CALL    LCDCLR          ;表示クリア
        CALL    HELLO
	CALL	TIM1S
        CALL    SANTECH
	CALL	TIM1S
        GOTO    CHR_WRITE

;********************************************************************
              ;サブルーチン
;********************************************************************
HELLO                           ;表示HELLO!
	MOVLW	B'10000000'
	CALL	LCDCMD
	CALL	TIM1S
        MOVLW   'H'
        CALL    LCDDTW
	CALL	TIM1S
        MOVLW   'e'
        CALL    LCDDTW
	CALL	TIM1S
        MOVLW   'l'
        CALL    LCDDTW
	CALL	TIM1S
        MOVLW   'l'
        CALL    LCDDTW
	CALL	TIM1S
        MOVLW   'o'
        CALL    LCDDTW
	CALL	TIM1S
        MOVLW   '!'
        CALL    LCDDTW
	CALL	TIM1S
        RETURN
SANTECH	
	MOVLW	0C0H
	CALL	LCDCMD
	MOVLW   'S'
        CALL    LCDDTW
	CALL	TIM1S
	MOVLW	0C2H
	CALL	LCDCMD
	MOVLW   'n'
	CALL    LCDDTW
	CALL	TIM1S
	MOVLW	0C4H
	CALL	LCDCMD
	MOVLW   'e'
	CALL    LCDDTW
	CALL	TIM1S
	MOVLW	0C6H
	CALL	LCDCMD
	MOVLW   'h'
	CALL    LCDDTW
	CALL	TIM1S
	MOVLW	0C8H
	CALL	LCDCMD
	MOVLW   'C'
	CALL    LCDDTW
	CALL	TIM1S
	MOVLW	0CAH
	CALL	LCDCMD
	MOVLW   '.'
	CALL    LCDDTW
	CALL	TIM1S
	MOVLW	0CCH
	CALL	LCDCMD
	MOVLW   'L'
	CALL    LCDDTW
	CALL	TIM1S
	MOVLW	0CEH
	CALL	LCDCMD
	MOVLW   'd'
	CALL    LCDDTW
	CALL	TIM1S
	MOVLW	0C1H
	CALL	LCDCMD
	MOVLW   'a'
	CALL    LCDDTW
	CALL	TIM1S
	MOVLW	0C3H
	CALL	LCDCMD
	MOVLW   't'
	CALL    LCDDTW
	CALL	TIM1S
	MOVLW	0C5H
	CALL	LCDCMD
	MOVLW   'c'
	CALL    LCDDTW
	CALL	TIM1S
	MOVLW	0C9H
	CALL	LCDCMD
	MOVLW   'o'
	CALL    LCDDTW
	CALL	TIM1S
	MOVLW	0CBH
	CALL	LCDCMD
	MOVLW   ','
	CALL    LCDDTW
	CALL	TIM1S
	MOVLW	0CDH
	CALL	LCDCMD
	MOVLW   't'
	CALL    LCDDTW
	CALL	TIM1S
	MOVLW	0CFH
	CALL	LCDCMD
	MOVLW   '.'
	CALL    LCDDTW
	CALL	TIM1S
	RETURN

;LCDへデータ書き込み
LCDDTW                          ;Wに書き込まれたデータ(1文字)を表示
        MOVWF   PORTB
        BCF     PORTA,1         ;R/WをW
        BSF     PORTA,2         ;RSをデータに
        BSF     PORTA,0         ;E
        BCF     PORTA,0
        CALL    LCDBUSY         ;BUSYチェック
        RETURN

;LCDへインストラクション書き込み
LCDCMD                          ;Wレジスタに書き込まれたコマンドをLCDへ
        MOVWF   PORTB
        BCF     PORTA,1         ;R/WをW
        BCF     PORTA,2         ;RSをインストラクションに
        BSF     PORTA,0         ;E
        BCF     PORTA,0
        CALL    LCDBUSY         ;BUSYチェック
        RETURN

;LCD表示クリア
LCDCLR                          
        MOVLW   01H
        CALL    LCDCMD
        RETURN

;LCD BUSYチェック
LCDBUSY                         
                                ;PORTBを入力に変える
        BSF     STATUS,RP0      ;バンク1へ切替
        MOVLW   0FFH            ;ポートBを入力モードに設定
        MOVWF   TRISB
        BCF     STATUS,RP0      ;バンク0に戻す

        BCF     PORTA,2         ;RSをインストラクションに
        BSF     PORTA,1         ;R/WをR
        BSF     PORTA,0         ;E
        BCF     PORTA,0
        MOVF    PORTB,W
        MOVWF   LCDINST
        BTFSC   LCDINST,7       ;BUSYフラグチェック
        GOTO    LCDBUSY

        BCF     PORTA,1         ;R/WをWに戻しておく
        BSF     STATUS,RP0      ;バンク1へ切替
        CLRF    TRISB           ;ポートBを出力モードに設定
        BCF     STATUS,RP0      ;バンク0に戻す
        RETURN

;タイマ        
TIM04                           ;約0.4mSECタイマ
        MOVLW   0FFH
        MOVWF   TIMCNT
TIMLP   NOP
        DECFSZ  TIMCNT,F
        GOTO    TIMLP
        RETURN
TIM5                            ;約5msecタイマ
        MOVLW   0DH
        MOVWF   TIM5CNT
TIM5LP  CALL    TIM04
        DECFSZ  TIM5CNT,F
        GOTO    TIM5LP
        RETURN
TIM1S				;約1secタイマ
        MOVLW	0C8H
        MOVWF	TIM1CNT
TIM1SLP CALL    TIM5
        DECFSZ  TIM1CNT,F
        GOTO    TIM1SLP
        RETURN
        
        END

Copyright(C) .  Santech Display Co.,Ltd. All right reserved.