;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		Ｉ２Ｃコントロールテスト　Ver０．３	ＪＡ０ＱＯＮ
;
;		マスター送信ルーチンを作ってみる
;		PIC16F1705 32MHZ（内部オシレータ）
;
;       目的
;       汎用ポートを使用したＩ２Ｃモジュールへの制御
;       今回はＬＣＤディスプレイの制御
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



		LIST	P=PIC16F1705
		INCLUDE	P16F1705.INC

;
;CONFIGURATION WORD 1(ADDRESS:8007H)
;					設定
;bit13		FCMEN	0	Fail-Safe Clock Monitor
;						1=有効,0=無効
;bit12		IESO	0	内部･外部切替スイッチモード
;						1=有効,0=無効
;bit11		CLKOUTEN 1	クロックアウトイネーブルビット
;						1=無効　RA4I/O使用可
;						0=有効　FoscがCLKPUTピンに出力される
;bit10-9	BOREN	00	ブラウンアウト設定
;						11=有効
;						10=スリープ時以外有効
;			___			00=無効
;bit8		CPD		1	データメモリプロテクション
;			__			1=無効,0=有効
;bit7		CP		1	プログラムメモリプロテクション　
;						1=無効,0=有効
;bit6		MCLRE	0	RA3/MCLRピン選択ビット
;			_____		1=MCLR有効,0=RA3有効(Digital input)
;bit5		PWRTE	0	power_up timer　使います。
;						1=無効,0=有効
;bit4-3		WDTE	00	Watchdog Timer
;						11=有効
;						10=ランニング中に有効、スリープ中は無効
;						01=レジスタによるコントロール
;						00=無効
;bit2-0		FOSC	100	発振器選択ビット
;						111=ECH:外部クロック入力（4-32MHZ)、RA4I/O可
;						110=ECM:外部クロック入力（0.5-4MHZ)、RA4I/O可
;						101=ECL:外部クロック入力（0-0.5MHZ)、RA4I/O可
;						100=INTOSC:内部発振、RA4-RA5I/O可
;						011=EXTRC:外部RC発振、RA4I/O可、RA5不可
;						010=HS：外部発振子、I/O不可
;						001=XT：　〃
;						000=LP：　〃
;
;bit	15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
;data    0  0  0  0  1  0  0  1  1  0  0  0  0  1  0  0
;
;
	__CONFIG _CONFIG1,	B'0000100110000100'
;
;CONFIGURATION WORD 2(ADDRESS:8008H)マニュアル52ページ
;					設定
;bit13		LVP		0	低電圧プログラミング設定
;						1=有効
;			_____		0=無効、高電圧必要
;bit12		DEBUG	1	インサーキット･デバッガ モード設定
;						1=無効
;						0=有効、RA0-1をデバッガに使用
;bit11				0	Unimplemented
;bit10		BORV	0	ブラウンアウト･リセット電圧選択ビット（Vbor参照)
;						1=低電圧で動作
;						0=高電圧で動作
;bit9		STVREN	0	スタック･オーバーフロー･リセット設定
;						1=有効
;						0=無効
;bit8		PLLEN	0	PLL設定
;						1=4xPLL有効
;						0=4xPLL無効
;bit7       ZCDDIS  1   ZCDディセーブルビット
;                       1=ZCDを無効にする、ZCDCONで有効可
;                       0=ZCDを常に有効にする
;bit6-3					Unimplemented(read as '1'）
;bit2		PPS1WAY 0   PPSLOCKビット単方向セット･イネーブルビット
;                       1=ロック解除シーケンスを実行後に1度だけ解除できる
;                       0=ロック解除シーケンスを実行すると何度でも解除できる
;bit1-0		WRT		11	フラッシュメモリ プロテクション設定
;						11=無効
;						10=0h-1FFh有効、200H?1FFFHはPMCONで制御可
;						01=0h-FFFh有効、1000H?1FFFHはPMCONで制御可
;						00=0h-1FFFh有効、PMCON制御不可
;
;bit	15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
;data    0  0  0  1  0  0  0  0  1  1  1  1  1  0  1  1
;
;
	__CONFIG _CONFIG2,	B'0001000011111011'



;		ワークエリア定義
;
;		BANK0	20h-7Fh
;
;		使用していないのもあります
;

hex0		equ		020h		;32ビット取得HEXデータ
hex1		equ		021h		;
hex2		equ		022h
hex3		equ		023h
hexw0		equ		024h		;32ビットバイナリ演算用
hexw1		equ		025h
hexw2		equ		026h
hexw3		equ		027h
cnt0		equ		028h		;時間待ちルーチン用
cnt1		equ		029h
cnt2		equ		02ah
cnt3		equ		02bh
tmp0		equ		02ch		;汎用ワーク
tmp1		equ		02dh
flg			equ		02eh		;エラー＆設定フラグ
MODE		equ		02fh		;実行モード設定
TMC			equ		030h		;タイマオーバーフローカウンタ
CYC0		equ		031h		;呼び出し周期カウンタ
CYC1		equ		032h		;呼び出し周期カウンタ
;DCX		equ		033h		;DAC X軸進行カウンタ
;DCM		equ		034h		;DAC X軸分解能設定
;DCR        equ     035h        ;TMR0リスタート情報
FRQ0		equ		036h		;周波数表示データ
FRQ1		equ		037h
TBAL        equ     038h        ;参照テーブル先頭アドレス下位8ビット
TBAH        equ     039h        ;同上位8ビット
;
digit12     equ     03ah        ;BCD変換出力1，2桁
digit34     equ     03bh        ;BCD変換出力3，4桁
digit56     equ     03ch        ;BCD変換出力5，6桁
digit78     equ     03dh        ;BCD変換出力7，8桁
digit9A     equ     03eh        ;BCD変換出力9，10桁
bcdw0		equ		03fh		;BCD補正処理ワーク
bcdw1		equ		040h
wrk0		equ		041h        ;演算用汎用ワーク
wrk1		equ		042h
shift       equ     043h        ;ビットシフト用ワーク
blk			equ		044h		;ゼロブランキング制御フラグ
colum		equ		045h		;現在の桁位置
colw0		equ		046h		;桁位置処理ワーク
colw1		equ		047h		;
;
CMD0		equ		048h		;コマンドパケット下位8ビット
CMD1		equ		049h		;コマンドパケット上位8ビット
DBUF0		equ		04ah		;SPI送信データ編集用バッファ
DBUF1		equ		04bh
DBUF2		equ		04ch
DBUF3		equ		04dh
DBUF4		equ		04eh
DBUF5		equ		04fh
DBUF6		equ		050h
DBUF7		equ		051h
;
DSP_ADR     equ     05fh
icw0        equ     060h
icw1        equ     061h
MSAD0		equ		062h
MSAD1		equ		063h
;
;	液晶表示バッファ
;
;	A0H-AFH		1行目16バイトでA0Hは最右側、AFHが最左側
;	B0H-BFH		2行目
;	FSR0でアクセス

;
SCL_H		MACRO
			movlb	02h
			bsf		LATC,0
			clrf	BSR
			ENDM
SCL_L		MACRO
			movlb	02h
			bcf		LATC,0
			clrf	BSR
			ENDM
SDA_H		MACRO
			movlb	02h
			bsf		LATC,1
			clrf	BSR
			ENDM
SDA_L		MACRO
			movlb	02h
			bcf		LATC,1
			clrf	BSR
			ENDM
DELAY_C		MACRO
			call	w10u	
			ENDM
;


			ORG		0h
			goto	init
			ORG		04h
			goto	init

			org		05h



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			PIC16F1705　イニシャライズ
;
;	OSCCON(BANK1　099H) 
;		bit7	SPLLEN	ソフトウエアPLL設定ビット
;						1 = 4xPLL有効
;						0 = 4xPLL無効(リセット後)
;		＊コンフィグレーションワードPLLEN=1の時、この設定は無視される。
;		bit6-3	IRCF	内部発振器クロック選択ビット
;						000x = 31KHZ LF
;						0010 = 31.25KHZ MF
;						0011 = 31.25KHZ HF
;						0100 = 62.5KHZ MF
;						0101 = 125KHZ MF
;						0110 = 250KHZ MF
;						0111 = 500KHZ MF（デフォルト）
;						1000 = 125kHZ HF
;						1001 = 250kHZ HF
;						1010 = 500kHZ HF
;						1011 = 1MHZ HF
;						1100 = 2MHZ HF
;						1101 = 4MHZ HF
;						1110 = 8MHZ or 32MHZ HF
;						1111 = 16MHZ HF
;		bit2			Unimplemented
;		bit1-0	SCS		システムクロック選択ビット
;						1x = 内部発振器
;						01 = タイマ1発振器
;						00 = FOSCで指定された発振器(リセット後)
;		(注)詳細はマニュアルあるいは当局HP内解説を参照
;						HF=HFINTOSC（16MHZ)
;						MF=MFINTOSC(500KHZ)
;						LF=LFINTOSC(32KHZ)
;
;
;	32MHZ内部発振設定
;	コンフィグレーションワード1		FOSC=100
;	OSCCON				SCS=00
;	OSCCON				IRCF=1110
;	OSCCON				SPLLEN=1(#1)
;	コンフィグレーションワード2		PLLEN=1(#1)
;					(#1)設定はどちらかでOKだが、PLLEN=1とすると、
;						OSCCONのSPLLEN=0の設定は無効となる。
;						また、8MHZのHFINTOSCは選択の余地が無い。
;
;	PORTA(BANK0　00CH）
;		bit7-6	Unimplemented(read=0)
;		bit5-4	RA5-4	デジタルI/O、アナログ入力
;		bit3	RA3		デジタルInputのみ
;		bit2	RA2-1	デジタルI/O、アナログ入力
;		bit0	RA0		デジタル･アナログI/O,DAコンバータ出力
;
;	PORTC(BANK0　00EH）
;		bit7-6	Unimplemented(read=0)
;		bit5-0	RC5-0	デジタルI/O、アナログ入力
;
;	TRISA(BANK1　08CH)
;		bit7-6	Unimplemented(read=0)
;		bit5-4	RA5-4	1=入力、0=出力
;		bit3	RA3		常に1
;		bit2	RA2-0	1=入力、0=出力
;
;	TRISC(BANK1　08EH)
;		bit7-6	Unimplemented(read=0)
;		bit5-4	RA5-0	1=入力、0=出力
;
;	LATA(BANK2　10CH)　データラッチレジスタ
;		bit7-6	Unimplemented(read=0)
;		bit5-4	RA5-4	出力データ保持
;		bit3	Unimplemented(read=0)
;		bit2	RA2-0	出力データ保持
;	（このラッチデータはTRISAレジスタ設定で各ピンに反映される）
;
;	LATC(BANK2　10EH)　データラッチレジスタ
;		bit7-6	Unimplemented(read=0)
;		bit5-4	RC5-0	出力データ保持
;	（このラッチデータはTRISCレジスタ設定で各ピンに反映される）
;
;
;	ANSELA(BANK3　18CH)
;		bit7-5	Unimplemented(read=0)
;		bit4	ANSA3/RA4	アナログ/デジタル選択ビット
;							1=アナログ入力
;							0=デジタルI/O
;		bit3	Unimplemented(read=0)
;		bit2-0	ANSA2-0/RA2-0アナログ/デジタル選択ビット
;							1=アナログ入力
;							0=デジタルI/O
;		＊デフォルトでは、すべて1(アナログ入力)となっている
;
;	ANSELC(BANK3　18EH)
;		bit7-6	Unimplemented(read=0)
;		bit5-0	ANSC5-0/RC5-0アナログ/デジタル選択ビット
;							1=アナログ入力
;							0=デジタルI/O
;		＊デフォルトでは、すべて1(アナログ入力)となっている
;
;	ODCONA（BANK5　28CH)
;		bit7-6	Unimplemented(read=0)
;		bit5-4			1=オープンドレイン駆動
;						0=標準のプッシュプル駆動
;		bit3	Unimplemented(read=0)
;		bit2-0			1=オープンドレイン駆動
;						0=標準のプッシュプル駆動
;		＊デフォルトでは、すべて０となっている
;
;	ODCONC（BANK5　28EH)
;		bit7-6	Unimplemented(read=0)
;		bit5-0			1=オープンドレイン駆動
;						0=標準のプッシュプル駆動
;		＊デフォルトでは、すべて０となっている
;
;	WPUA(BANK4　20CH)　ポートAプルアップ設定ビット
;		bit7-6	Unimplemented(read=0)
;		bit5-0			1=PORTA各ビットプルアップ有効
;				 _____	0=PORTA各ビットプルアップ無効
;				*WPUENビットが有効の時のみ、設定有効となる。
;
;	WPUC(BANK4　20EH)　ポートCプルアップ設定ビット
;		bit7-6	Unimplemented(read=0)
;		bit5-0			1=PORTA各ビットプルアップ有効
;				 _____	0=PORTA各ビットプルアップ無効
;				*WPUENビットが有効の時のみ、設定有効となる。
;
;
;	OPTION_REG(BANK1　095H)
;				_____
;		bit7=1	WPUEN	プルアップ グローバル設定ビット
;						0=有効,1=無効
;		bit6=0	INTEDG	INTピン割り込み信号エッジ
;						1=↑
;						0=↓
;		bit5=0	TMR0CS	TMR0クロックソース選択ビット
;						1=外部入力RA2/T0CKI
;						0=内部システムクロック(Fosc/4)
;		bit4=1	TMR0SE	TMR0ソースエッジ選択ビット
;						1=RA4/T0CKIピンが↑の時インクリメント
;						0=RA4/T0CKIピンが↓の時インクリメント
;		bit3=0	PSA		プリスケーラ割当ビット
;						1=WDT
;						0=TMR0
;		bit2-0	PS		プリスケーラ分周比
;                                  	000 1/2
;									001	1/4
;									010	1/8
;									011	1/16
;									100	1/32
;									101	1/64
;									110	1/128
;									111	1/256
;
;	INTCONレジスタ(#2)　コア　00BH
;		bit7	GIE		全割込制御
;						1許可、0禁止
;		bit6	PEIE	周辺装置割込制御
;						1許可、0禁止
;		bit5	TMR0IE	タイマ0割込許可制御
;						1許可、0禁止
;		bit4	INTE	RA2外部割込許可制御
;						1許可、0禁止
;		bit3	IOCIE	I/Oポート状態変化割込許可制御
;						1許可、0禁止
;		bit2	TMR0IF	タイマ0割込みフラグ(#1)
;						1オーバーフロー
;						0オーバーフローなし
;		bit1	INTF	RA2外部割込みフラグ(#1)
;						1割込み発生
;						0割込み発生なし
;		bit0	IOCIF	I/Oポート状態変化割込フラグ(#1)
;						1割込発生
;						0割込無
;
;						#1)ソフトウエアでリセット必要
;						#2)初期値=0なので、初期設定で0設定する必要は無い
;
;
;	T1CONレジスタ
;		bit7-6	TMR1CS	タイマ1クロック源選択ビット
;						11=LFINTOSC
;						10=タイマ1クロック源にピンまたはオシレータを選択する
;							T1OSCEN=1の場合
;							T1CKIピンからの外部クロック（立ち上がりエッジ）
;							T1OSCEN=0の場合
;							SOSCI、SOSCOに接続された水晶振動子
;						01=システムクロック(FOSC）を選択
;						00=命令クロック(FOSC/4)を選択
;		bit5-4	T1CKPS	タイマ1入力プリスケーラ選択ビット
;						11=8:1
;						10=4:1プリスケーラ値
;						01=2:1
;						00=1:1
;		bit3	T1OSCEN	LPオシレータ イネーブル制御ビット
;						1=専用のセカンダリ オシレータを有効にする
;						0=専用のセカンダリ オシレータを無効にする
;		bit2	T1CYNC	タイマ1同期制御ビット
;						1=非同期クロック入力を同期しない
;						0=非同期クロック入力とシステムクロック(FOSC)を同期させる
;		bit1	未実装	「0」として読み出し
;		bit0	TMR1ON	タイマ1ONビット
;						1=タイマ1を有効にする
;						0=タイマ1を停止、タイマ1ゲートフィリップフロップをクリア
;
;	T1GCONレジスタ
;		bit7	TMR1GE	タイマ1 ゲートイネーブルビット
;						TMR1ON=0の場合はこのビットを無視する
;						TMR1ON=1の場合
;							1=タイマ1のカウントをタイマ1ゲート機能で制御する
;							0=タイマ1はタイマ1のゲート機能とは無関係にカウントする
;		bit6	TIGPOL	タイマ1ゲート極性ビット
;						1=タイマ1ゲートはアクティブH（ゲートがHの時にカウント)
;						0=タイマ1ゲートはアクティブL（ゲートがLの時にカウント)
;		bit5	T1GTM	タイマ1 ゲートトグルビット
;						1=タイマ1 ゲートトグルモードを有効にする
;						タイマ1ゲートフリップフロップは立ち上がりエッジごとに
;						トグルします
;						0=タイマ1 ゲートトグルモードを無効とする
;						トグル フリップフロップをクリアする
;		bit4	T1GSPM	タイマ1 ゲートシングルパルスモードビット
;						1=シングルパルスモードを有効にし、ゲートを制御
;						0=無効にする
;		bit3	T1GGO/DONE
;						タイマ1ゲート シングルパルスアクイジョン ステータスビット
;						1=シングルパルスアクイジョンがレディ状態、エッジを待機
;						0=シングルパルスアクイジョンは完了済み、又は開始してない
;		bit2	T1GVAL	タイマ1 ゲート値ステータスビット
;						TMR1H:TMR1Lへ提供されるタイマ1ゲートの現在のステートを
;						示します。
;						タイマ1ゲートイネーブル(TMR1GE)の影響は受けない
;		bit0-1	T1GSS	タイマ1ゲートソース選択ビット
;						11=オプションで同期できるコンパレータ2出力(sync_C2OUT)
;						10=オプションで同期できるコンパレータ1出力(sync_C1OUT)
;						01=タイマ0オーバーフロー出力
;						00=タイマ1ゲートピン
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

init
;			各レジスタ初期設定(PIC16F1705)
            movlb	0h			;BANK0
			clrf	INTCON		;全割込みOFF
			movlb	01h
			clrf	BSR
			clrf	PORTA		;Init PORT
            clrf	PORTC
            movlb   02h			;BANK2
            clrf    LATA
            clrf    LATC
			;クロック
			movlb	01h			;BANK１
			movlw	0f0h		;1111000B
			movwf	OSCCON		;内部発振器は8MHZに設定
                                ;4xPLL=ON

			;I/Oポート(TRIS→BANK1、ANSEL→BANK3)
			movlb	01h
			movlw	0fh			;00001111B
			movwf	TRISA		;RA0-3入力、RA4-5出力
            movlw	034h		;00110100B
            movwf	TRISC       ;RC0-1,3出力、RC2,4-5入力
			movlb	03h			;BANK3
			movlw	00h			;00000000B
			movwf	ANSELA		;RA0-5=デジタル
            movlw	00h         ;00000000B
            movwf	ANSELC      ;RC0-5デジタル
			movlb	05h			;ODCONx BANK5
			movlw	03h			;00000011B
			movwf	ODCONC		;RC0-1オープンドレイン

;			レジスタ設定終了
			clrf	BSR
			goto	coldst
;			goto	DEBUG01


coldst
			movlw	0a0h
			movwf	FSR0L
			clrf	FSR0H
            call    INIT_LCD    ;LCDモジュール初期化

mloop
			movlw	LOW MSG01	;MSG01間接アドレス値下位8ビット
			movwf	MSAD0
			movlw	HIGH MSG01	;MDG01間接アドレス値上位8ビット
			movwf	MSAD1
			call	CLRLCD		;LCD画面全クリア
			call	PUTL1		;LCD1行目にMSG01の内容を連続書込み
			call	wait1s
			movlw	LOW MSG02
			movwf	MSAD0
			movlw	HIGH MSG02
			movwf	MSAD1
			call	PUTL2		;LCD2行目に連続書込み
			call	wait1s
			call	wait1s

			movlw	LOW MSG03
			movwf	MSAD0
			movlw	HIGH MSG03
			movwf	MSAD1
			call	CLRLCD
			call	PUTL1
			call	wait1s
			movlw	LOW MSG04
			movwf	MSAD0
			movlw	HIGH MSG04
			movwf	MSAD1
			call	PUTL2
			call	wait1s
            call	wait1s
            goto	mloop


MSG01		DT		"HELLO! CQ CQ CQ"
			DW		0			;エンドコード
MSG02		DT		"This is JA0QON"
			DW		0
MSG03		DT		"ﾆｲｶﾞﾀ ｹﾝ ﾀｲﾅｲｼ"
			DW		0h
MSG04		DT		"ﾎﾝｼﾞﾂﾊ ﾖｲｵﾃﾝｷﾃﾞｽ"
			DW		0h




;
;       ＬＣＤ　ＤＩＳＰＬＡＹ　ＡＥ?ＡＱＭ１６０２ＸＡ
;
;       書込みサブルーチン群
;
;       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     0CH            LCDスレーブ アドレス
;       DSP_ADR     80H-8FH 1行目　表示位置アドレス(DDRAM)
;                   C0H-CFH 2行目　同じ
;

;
;   Ｗレジスタの「データ」を単発で書き込む
;
;		表示位置指定	DSP_ADR
;
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
;
;	1行目ラインバッファのデータをＬＣＤに連続書込み
;
;		MSAD0	データアドレス下位8ビット
;		MSAD1	データアドレス上位7ビット
;
PUTL1
			call	LINUL1		;ラインバッファ１をクリア
			movlw	010h
			movwf	icw1
			movf	MSAD0,W		;文字領域アドレス
			movwf	FSR1L
			movf	MSAD1,W
			movwf	FSR1H
			movlw	0a0h
			movwf	FSR0L
			;表示文字をラインバッファに転送
PTL01		movf	INDF1,W		;MSGアドレスよりデータを取得
			iorlw	0h			;ヌルコードチェック
			btfsc	STATUS,Z
			bra		PTL02		;end of msg
			movwf	INDF0		;ラインバッファへ転送
			incf	FSR0L,F
			incf	FSR1L
			decf	icw1,F
			btfss	STATUS,Z
			bra		PTL01
PTL02		goto	XFLCD1
;
;	２行目ラインバッファのデータをＬＣＤに連続書込み
;
;		MSAD0	データアドレス下位8ビット
;		MSAD1	データアドレス上位7ビット
;
PUTL2
			call	LINUL2		;ラインバッファ２をクリア
			movlw	010h
			movwf	icw1
			movf	MSAD0,W
			movwf	FSR1L
			movf	MSAD1,W
			movwf	FSR1H
			movlw	0b0h
			movwf	FSR0L

PTL21		movf	INDF1,W		;MSGアドレスよりデータを取得
			iorlw	0h			;ヌルコードチェック
			btfsc	STATUS,Z
			bra		PTL22		;end of msg
			movwf	INDF0		;ラインバッファへ転送
			incf	FSR0L,F
			incf	FSR1L
			decf	icw1,F
			btfss	STATUS,Z
			bra		PTL21
PTL22		goto	XFLCD2

;
;	1行目ラインバッファのデータを連続送信
;
XFLCD1
			movlw	0a0h
			movwf	FSR0L
			movlw	080h
			movwf	DSP_ADR
			movlw	010h
			movwf	icw1
            call    STARTCON    ;スタートコンディション送信
            movlw   07ch        ;LCDアドレス+WRITE
            call    SEND_BYTE   ;アドレス送信

XFL01		movlw   080h        ;C0=1、RS=0
            call    SEND_BYTE   ;コントロールバイト送信
            movf    DSP_ADR,W   ;表示アドレス
            call    SEND_BYTE
            call    wait50u

            movlw   0c0h        ;C0=1、RS=1
            call    SEND_BYTE   ;コントロールバイト送信
            movf    INDF0,W		;char配列よりデータを取得
			call	CKCW
            call    SEND_BYTE
            call    wait50u

			incf	FSR0L,F
			incf	DSP_ADR,F
			decf	icw1,F
			btfss	STATUS,Z
			bra		XFL01
			call	wait5m
            call    STOPCON
			return
;
;	2行目ラインバッファのデータを連続送信
;
XFLCD2
			movlw	0b0h
			movwf	FSR0L
			movlw	0c0h
			movwf	DSP_ADR
			movlw	010h
			movwf	icw1
            call    STARTCON    ;スタートコンディション送信
            movlw   07ch        ;LCDアドレス+WRITE
            call    SEND_BYTE   ;アドレス送信
			bra		XFL01

;
;	Ｗｒｅｇのキャラクタデータをチェック
;	ヌルデータはスペース(20H)に置き換える
;
CKCW
			iorlw	0h
			btfsc	STATUS,Z
			retlw	020h
			return
;
;	ラインバッファすべてをヌルに置き換える
;
LINUL1		;1行目ラインバッファのみ
			movlw	0a0h
			movwf	FSR0L
			movlw	10h
			movwf	icw1

LNL01		clrf	INDF0
			incf	FSR0L,F
			decf	icw1,F
			btfss	STATUS,Z
			bra		LNL01
			return
LINUL2		;2行目ラインバッファのみ
			movlw	0b0h
			movwf	FSR0L
			movlw	10h
			movwf	icw1
			bra		LNL01
;
;		ＬＣＤ画面オールクリア
;
CLRLCD
            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
			return


;
;       ＡＥ?ＡＱＭ１６０２イニシャライズ
;			電源電圧5V用
;
INIT_LCD
			call    wait100m    ;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


;
;	手動Ｉ２Ｃ制御　低レベルサブルーチン群
;

;
;	I2Cバス アイドル
;		SCL=1
;		SDA=1
;
I2C_IDL
			SCL_H				;SCL=1
			SDA_H				;SDA=1
			DELAY_C
			return
			
;
;	スタートコンディション生成
;
;	START CONDITION
;		SCL=1の状態の時に、SDAが↓となるとSTARTと判断
;		これはマスタが行う
;
STARTCON
			SCL_H				;SCL=1
			SDA_H				;SDA=1 バス アイドル
			DELAY_C
			SDA_L				;SDA=0 スタートコンディション
			DELAY_C
			SCL_L				;SCL=0
			return
			
;
;	ACK確認待ち
;
I2C_ACK
			SCL_L				;SCLがH→LになるとACK応答始まる
			DELAY_C
			SDA_H				;SDA=1としても0のまま
			btfsc	PORTC,1		;SDA_PORT=0？
			bra		$-1
			SCL_H				;SCL１クロックでスレーブはACK解除する
			DELAY_C
			SCL_L				;ACK確認・処理終了
			return				;SDA=0（ACK受信）なので終了
			
;
;	STOP送信
;
STOPCON
			SCL_L				;SCL=0
			DELAY_C
			SDA_L				;SDA=0
			DELAY_C
			SCL_H				;SCL=1
			DELAY_C
			SDA_H				;SDA=1　バス アイドル
			DELAY_C
			return

;
;	マスタモード　1バイト送信
;
;	SCL=0の状態の間に、SDAビットをセッティング
;	SCL=1の状態の時に、スレーブはそのSDAビットをデータとして読み込む
;	SCL=1の状態の間に、SDAビットを変更すると、STARTあるいはSTOP他とみなされる
;
;	使用方法
;		Wregに送信データバイトを設定して呼び出す事
;		上位ビット(MSB)より送信される
;		事前にI2C_STARTをコールしている事
;		SCL=0、SDA=0となっている
SEND_BYTE
			movwf	CYC0
			movlw	08h
			movwf	CYC1
			
SNDLP		SCL_L				;SCL=0→SDAビット設定・変更可
			DELAY_C
			lslf	CYC0,F		;左シフト
			btfss	STATUS,C
			bra		SBITL
SBITH		SDA_H				;SDA=1→送信ビット
			bra		SNDEN
SBITL		SDA_L				;SDA=0→送信ビット
SNDEN		DELAY_C
			SCL_H				;SCL=1→スレーブがSDAビットを受信
			DELAY_C
			decf	CYC1,F
			btfss	STATUS,Z
			bra		SNDLP
			;ACK待ち
RCVACK		SCL_L				;SCLがH→LになるとACK応答始まる
			DELAY_C
			SDA_H				;SDA=1としても0のまま
			btfsc	PORTC,1		;SDA_PORT=0？
			bra		$-1
			SCL_H				;SCL１クロックでスレーブはACK解除する
			DELAY_C
			SCL_L				;ACK確認・処理終了
			return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン	32MHZ用
;
;		1cycle	= 0.125us
;		使用レジスタ	= cnt2,cnt3
;		BSR		=0(BANK0)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

wait100u						;呼び出しも含めて、100us
								;call is 2cycles
			movlw	09h			;1
			movwf	cnt2		;1
			movlb	0h
			nop
			nop					;3
w100u		nop					;
			call	w10u		;10*9=90us(ここだけ命令ステップを数えない）
			decfsz	cnt2,F		;4*8+3=31cycles
			goto	w100u
			return				;2+5+31+2=40cycles=20us

wait50u							;呼び出しも含めて、50us
			call	wait25u
wait25u							;呼び出しも含めて、25us
			call	w10u
			call	w10u
			movlw	0bh			;5us=0.125us*40cycles
			movwf	cnt2		;
w25u		decfsz	cnt2,F		;ループ 2+10*3+2=34cycles
			goto	w25u
			nop
			nop
			return				;2+34+2+2=40cycles=5us

wait5m							; 5ms
			movlb	0h
			movlw	05h
			movwf	cnt2
w5m			call	w1m
			decfsz	cnt2,F
			goto	w5m
			return

wait10m							; 10ms
			movlb	0h
			movlw	d'10'
			movwf	cnt2
w10m		call	w1m
			decfsz	cnt2,F
			goto	w10m
			return

wait20m							; 20ms
			movlb	0h
			movlw	d'20'
			movwf	cnt2
w20m		call	w1m
			decfsz	cnt2,F
			goto	w20m
			return
wait50m							; 50ms
			movlb	0h
			movlw	d'50'
			movwf	cnt2
w50m		call	w1m
			decfsz	cnt2,F
			goto	w50m
			return

wait100m						; 100ms
			movlb	0h
			movlw	d'100'
			movwf	cnt2
w100m		call	w1m
			decfsz	cnt2,F
			goto	w100m
			return

wait500m						; 500ms
			movlb	0h
			movlw	05h
			movwf	cnt3
w500m		call	wait100m
			decfsz	cnt3,F
			goto	w500m
			return

wait1s							; 1s
			movlb	0h
			movlw	d'10'
			movwf	cnt3
w1s			call	wait100m
			decfsz	cnt3,F
			goto	w1s
			return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			1ms 基本ウェイト
;			呼び出しを含めて1msとなる。
;
;		clock	= 32MHz(0.03125usec)
;		1cycle	= 0.125usec
;		1ms		= 0.125usec * 8000cycles
;
;			使用変数　cnt0,cnt1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
w1m
			movlb	0h
			movlw	08h
			movwf	cnt0		;
;			外周ループ
w1m0		movlw	0c7h		;199d
			movwf	cnt1		;
;			内周ループ
w1m1		nop					;
			nop					;5cycles*cnt1
			decfsz	cnt1,F		;2+5*198+4=996c/s
			goto	w1m1		;
;
			decfsz	cnt0,F		;
			goto	w1m0		;2+7*999+998=7993cycles
			nop
			return					;other=(3+4)cycles
									;Total 8000*0.125us=1ms


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			10us 基本ウェイト
;			呼び出し（call　w10u)も含めて、10usとなる。
;
;		clock	= 32MHZ(0.03125us)
;		1cycle	= 0.125us
;		10us	= 0.125us * 80cycles
;		使用変数　cnt0,cnt1
;		'goto','call','return'は2サイクル消費する
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

w10u
			movlb	0h
			movlw	018h		;18H=24
			movwf	cnt0		;
w10u0		decfsz	cnt0,F		;3*23+2=71
			goto	w10u0		;
			nop
			nop
			return				;2+3+71+2+2=80cycles

w05u
			movlw	0bh			;5us=0.125us*40cycles
			movwf	cnt0		;
w05u0		decfsz	cnt0,F		;ループ 2+3*10+2=34cycles
			goto	w05u0
			nop
			nop
			return				;2+34+2+2=40cycles=5us

w02u
			movlw	04h			;2us=0.125us*16cycles
			movwf	cnt0		;
w02u0		decfsz	cnt0,F		;2+3*3+2+1+2=16cycles
			goto	w02u0
			nop
			return				;
w01u
			nop					;1us=0.125us*8cycles
			nop					;2+4+2=8cycles
			nop
			nop
			return
;
			END

