;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		ＡＥ-ＡＱＭ１６０２　制御プログラム　
;
;								　Ver1.0 ＪＡ０ＱＯＮ
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;
;       ADR=7CH（ADR+WRITEﾋﾞｯﾄ）
;                   R/Wビットは常に0（WRITEのみ）
;       CONTROLL=C0ﾋﾞｯﾄ+RSﾋﾞｯﾄ+000000(下位6ビットはすべて0)
;                   C0=1の時、連続コマンドワード
;                   C0=0の時、最終コマンドワード
;                   RS=1の時、液晶の表示データあるいはCGRAMのデータ
;                   RS=0の時、液晶のインストラクションコード
;       コマンドワード
;　　　　コントロールバイト＋データバイトの２バイトで構成
;       ワード間には30us以上、あるいは200ms以上のウエイトが必要

;       LCD_ADR     7CH            LCDスレーブ アドレス
;       DSP_ADR     80H-8FH 1行目　表示位置アドレス(DDRAM)
;                   C0H-CFH 2行目　同じ
;

;
;   Ｗレジスタの「データ」を指定の位置に書き込む
;
;		表示位置指定	DSP_ADR
;		I2Cアドレス		7CH
;
PUTW
            movwf   icw0		;PUSH Wreg
            call    STARTCON    ;スタートコンディション送信
            movlw   07ch        ;LCDアドレス+WRITE
            call    SEND_BYTE   ;アドレス送信

            movlw   080h        ;C0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movf    DSP_ADR,W   ;表示アドレス
            call    SEND_BYTE
            call    wait50u

            movlw   040h        ;C0=0、RS=1
            call    SEND_BYTE   ;コントロールバイト送信
            movf    icw0,W		;POP Wreg
            call    SEND_BYTE	;表示キャラクタコード
            call    wait50u
            call    STOPCON
			return

;
;	Ｗレジスタの「データ」を単書き込む
;	ここでは位置指定処理はしない
;		表示位置		DSP_ADR
;		I2Cアドレス		7CH
;
WRTD
            movwf   icw0		;PUSH Wreg
            call    STARTCON	;スタートコンディション送信
            movlw   07ch		;LCDアドレス+WRITE
            call    SEND_BYTE	;アドレス送信

            movlw   040h		;C0=0、RS=1(最終データ)
            call    SEND_BYTE	;コントロールバイト送信
            movf    icw0,W		;POP Wreg
            call    SEND_BYTE	;表示キャラクタコード
            call    wait50u
            call    STOPCON
			return

;
;	Ｗレジスタの「コマンド」を単書き込む
;
;		I2Cアドレス		7CH
;
WRTC
            movwf   icw0		;PUSH Wreg
            call    STARTCON	;スタートコンディション送信
            movlw   07ch		;LCDアドレス+WRITE
            call    SEND_BYTE	;アドレス送信

            movlw   00h			;C0=0、RS=0(最終コマンド）
            call    SEND_BYTE	;コントロールバイト送信
            movf    icw0,W		;POP Wreg
            call    SEND_BYTE	;LCDコマンド
            call    wait50u
            call    STOPCON
			return


;
;	指定のデータを指定のDDRAMアドレスからＬＣＤに連続書込み
;					ページを跨ぐ付近での表示バグ修正版
;		MSAD0	指定データ格納アドレス下位8ビット
;		MSAD1	指定データ格納アドレス上位7ビット
;		DSP_ADR	書込み先頭DDRAMアドレス
;				1行目80H-8FH、2行目C0H-CFH
;				1行目をオーバーした場合、2行目に移行して表示
;
PUTL
			movf	MSAD0,W
			movwf	FSR0L
			movf	MSAD1,W
			movwf	FSR0H

PTL01
			movf	INDF0,W		;MSGアドレスよりデータを取得
			iorlw	0h			;エンドコードチェック
			btfsc	STATUS,Z
			bra		PTL02		;end of msg
			call	PUTW		;コマンドワード送信（W=DATA、DSP_ADR=CMD）
			incf	FSR0L,F
			btfsc	STATUS,Z
			incf	FSR0H,F		;FSR0の桁上がり有
			incf	DSP_ADR,F
			movlw	0D0H
			xorwf	DSP_ADR,W
			btfsc	STATUS,Z
			bra		PTL02
			movlw	090h		;1行目アドレス オーバー
			xorwf	DSP_ADR,W
			btfss	STATUS,Z
			bra		PTL01
			movlw	0C0H
			movwf	DSP_ADR
			bra		PTL01

PTL02		return				;

;
;	指定のデータをＬＣＤ1行目に先頭から連続書込み
;					ページを跨ぐ付近での表示バグ修正版
;		MSAD0	指定データ格納アドレス下位8ビット
;		MSAD1	指定データ格納アドレス上位7ビット
;
PUTL1
			movlw	080h		;1行目DDRAM先頭アドレス
			movwf	DSP_ADR		;DDRAMアドレス
			call	WRTC		;コマンド送信
			movf	MSAD0,W
			movwf	FSR0L
			movf	MSAD1,W
			movwf	FSR0H

PTL11
			movf	INDF0,W		;MSGアドレスよりデータを取得
			iorlw	0h			;エンドコードチェック
			btfsc	STATUS,Z
			bra		PTL12		;end of msg
			call	WRTD		;コマンドワード送信（W=DATA、DSP_ADR=CMD）
			incf	FSR0L,F
			btfsc	STATUS,Z
			incf	FSR0H,F		;FSR0の桁上がり有
			incf	DSP_ADR,F
			movlw	090h		;データアドレス オーバー
			xorwf	DSP_ADR,W
			btfss	STATUS,Z
			bra		PTL11
PTL12		return				;

;
;	指定のデータをＬＣＤ2行目に連続書込み
;
;		MSAD0	データアドレス下位8ビット
;		MSAD1	データアドレス上位7ビット
;
PUTL2
			movlw	0c0h		;２行目DDRAM先頭アドレス
			movwf	DSP_ADR		;DDRAMアドレス
			call	WRTC		;コマンド送信
			movf	MSAD0,W
			movwf	FSR0L
			movf	MSAD1,W
			movwf	FSR0H

PTL21
			movf	INDF0,W		;MSGアドレスよりデータを取得
			iorlw	0h			;エンドコードチェック
			btfsc	STATUS,Z
			bra		PTL22		;end of msg
			call	WRTD		;コマンドワード送信（W=DATA、DSP_ADR=CMD）
			incf	FSR0L,F
			btfsc	STATUS,Z
			incf	FSR0H,F		;FSR0の桁上がり有
			incf	DSP_ADR,F
			movlw	0d0h		;データアドレス オーバー
			xorwf	DSP_ADR,W
			btfss	STATUS,Z
			bra		PTL21
PTL22		return				;


;
;		ＬＣＤ画面オールクリア
;
CLRLCD
			bsf		PORTA,5
            call    STARTCON    ;スタートコンディション送信
            movlw   07ch        ;LCDアドレス+WRITE
            call    SEND_BYTE   ;アドレス送信
            movlw   00h			;C0=0、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   01h         ;画面クリアコマンド
            call    SEND_BYTE
            call    wait5m
            call    STOPCON
			bcf		PORTA,5
			return


;
;       ＡＥ-ＡＱＭ１６０２イニシャライズ
;			電源電圧5V用
;
INIT5_LCD
			call    STARTCON	;スタートコンディション送信
			movlw   07ch		;LCDアドレス+WRITE
			call    SEND_BYTE	;アドレス送信
;           コマンドワード送信
;           ノーマルファンクション
            movlw   080h        ;ｺﾝﾄﾛｰﾙﾊﾞｲﾄC0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   038h        ;ノーマルFUNCTION
            call    SEND_BYTE   ;データバイト送信
            call    wait50u
;           拡張ファンクション
            movlw   080h        ;C0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   039h        ;拡張FUNCTION
            call    SEND_BYTE
            call    wait50u
;           内部発振周波数設定
            movlw   080h        ;C0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   014h        ;INTERNAL OSC
            call    SEND_BYTE
            call    wait50u
;           コントラスト設定
            movlw   080h        ;C0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   078h        ;コントラスト設定
            call    SEND_BYTE
            call    wait50u
;           POWER/ICON/CONTRAST
            movlw   080h        ;C0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   05dh        ;
            call    SEND_BYTE
            call    wait50u
;           Follower Controll
			movlw	080h		;C0=1、RS=0
			call	SEND_BYTE	;コントロールバイト送信
			movlw	06ah		;follower
			call    SEND_BYTE
			call	wait100m
			call	wait100m
			call	wait100m
;           ノーマルファンクション モード
            movlw   080h        ;C0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   038h        ;ノーマルFUNCTION
            call    SEND_BYTE
            call    wait50u
;           Display on / Cursor off
            movlw   080h        ;C0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   0ch         ;画面表示開始
            call    SEND_BYTE
            call    wait50u
;           Clear Display
            movlw   0h			;C0=0、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   01h         ;クリアコマンド
            call    SEND_BYTE
            call    wait5m
            call    STOPCON
            return

INIT3_LCD	;電源電圧３．３Ｖ用
			call    STARTCON	;スタートコンディション送信
			movlw   07ch		;LCDアドレス+WRITE
			call    SEND_BYTE	;アドレス送信
;           コマンドワード送信
;           ノーマルファンクション
            movlw   080h        ;ｺﾝﾄﾛｰﾙﾊﾞｲﾄC0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   038h        ;ノーマルFUNCTION
            call    SEND_BYTE   ;データバイト送信
            call    wait50u
;           拡張ファンクション
            movlw   080h        ;C0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   039h        ;拡張FUNCTION
            call    SEND_BYTE
            call    wait50u
;           内部発振周波数設定
            movlw   080h        ;C0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   014h        ;INTERNAL OSC
            call    SEND_BYTE
            call    wait50u
;           コントラスト設定
            movlw   080h        ;C0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   079h        ;コントラスト設定
            call    SEND_BYTE
            call    wait50u
;           POWER/ICON/CONTRAST
            movlw   080h        ;C0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   05eh        ;
            call    SEND_BYTE
            call    wait50u
;           Follower Controll
			movlw	080h		;C0=1、RS=0
			call	SEND_BYTE	;コントロールバイト送信
			movlw	06bh		;follower
			call    SEND_BYTE
			call	wait100m
			call	wait100m
			call	wait100m
;           ノーマルファンクション モード
            movlw   080h        ;C0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   038h        ;ノーマルFUNCTION
            call    SEND_BYTE
            call    wait50u
;           Display on / Cursor off
            movlw   080h        ;C0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   0ch         ;画面表示開始
            call    SEND_BYTE
            call    wait50u
;           Clear Display
            movlw   0h			;C0=0、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movlw   01h         ;クリアコマンド
            call    SEND_BYTE
            call    wait5m
            call    STOPCON
            return

