;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		ＰＩＣ１６Ｆ１７０９　ＢＡＳＩＣ　ＡＳＭ版
;
;		ＡＱＭ１６０２		2019年12月	Ver1	JA0QON
;
;	基本的なサブルーチンを設定済み
;		MSSP Ver0.2b
;		AQM1602v2
;		wait Ver32.1a
;
;	ディスプレイ
;		AQM1602 16桁2行LCDモジュール
;		SC1602_I2C 16桁2行LCDモジュール
;		I2Cデフォルト ポート
;		RC0=SCL
;		RC1=SDK
;
;	PIC動作
;		PIC16F1709 32MHZ 内部発振8MHZ 4XPLL
;
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

		LIST	P=PIC16F1709
		INCLUDE	P16F1709.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(read as 1)
;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  1  0  0  0  1  1  1  1  1  0  1  1
;
;
	__CONFIG _CONFIG2,	B'0001100011111011'


;		ワークエリア定義
;
;		BANK0	20H-7FH
;
;		使用していないのもあります
;

;ウエイトルーチン内専用ワーク
cnt0		equ		020H		;時間待ちルーチン用専用ワーク
cnt1		equ		021H
cnt2		equ		022H
cnt3		equ		023H
;汎用ローカルワーク
tmp0		equ		024H		;サブルーチン内限定汎用ワーク
tmp1		equ		025H		;そのルーチン内のみ有効
tmp2		equ		026H
tmp3		equ		027H
;汎用広域ワーク
wrk0		equ		028H        ;
wrk1		equ		029H
wrk2		equ		02AH
wrk3		equ		02BH
;演算用ワーク
hex0		equ		030H		;演算用広域汎用ワーク
hex1		equ		031H		;32bit演算の入出力に使用
hex2		equ		032H		;
hex3		equ		033H		;
hexw0		equ		034H		;
hexw1		equ		035H		;
hexw2		equ		036H		;
hexw3		equ		037H		;
;機能専用広域ワーク
FLG			equ		040H		;8桁7セグLED表示設定フラグ
MODE		equ		041H		;実行モード設定フラグ
DSPM		equ		042H		;ディスプレイモード スイッチフラグ
DSP_ADR		equ		043H
ASC0		equ		044H
ASC1		equ		045H
BSLW0		equ		046H
BSLW1		equ		047H
BSLSP		equ		048H

SET_MODE	equ		049H
MSAD0		equ		04AH
MSAD1		equ		04BH
icw0		equ		04CH
icw1		equ		04DH
;BCD用広域ワーク
digit12     equ     050H        ;BCD変換出力1，2桁
digit34     equ     051H		;BCD変換出力3，4桁
digit56     equ     052H        ;BCD変換出力5，6桁
digit78     equ     053H        ;BCD変換出力7，8桁
digit9A     equ     054H        ;BCD変換出力9，10桁
bcdw0		equ		055H		;BCD補正処理ワーク
bcdw1		equ		056H
shift		equ		057H

;LEDポート定義
LED1ON		MACRO
			movlb	02H
			bsf		LATA,4
			clrf	BSR
			ENDM
LED1OFF		MACRO
			movlb	02H
			bcf		LATA,4
			clrf	BSR
			ENDM
LED2ON		MACRO
			movlb	02H
			bsf		LATA,5
			clrf	BSR
			ENDM
LED2OFF		MACRO
			movlb	02H
			bcf		LATA,5
			clrf	BSR
			ENDM


;
			ORG		0H			;リセットベクタ
			goto	init
			ORG		04H			;割り込みベクタ

;
;		割込み処理ルーチン
;
;		割込み発生から割込みベクタまで3サイクル程度（同期割込み）
;		FSRxはコアレジスタなので、自動で PUSH-POPされる
;		よって、割り込み終了後、元の設定値に戻る
;
INT
;
INTOUT
;
			retfie				;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			PIC16F1709　イニシャライズ
;
;		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）
;			bit5	RA5		GPI/O,CLKIN
;			bit4	RA4		GPI/O,AN3
;			bit3	RA3		Degital Input Only
;			bit2	RA2		GPI/O,AN2,DAC1OUT2
;			bit1	RA1		GPI/O,AN1
;			bit0	RA0		GPI/O,AN0,DAC1OUT
;
;		PORTB(BANK0　00DH）
;			bit7	RB7		GPI/O
;			bit6	RB6		GPI/O,SCL
;			bit5	RB5		GPI/O,AN11,OPA1IN+
;			bit4	RB4		GPI/O,AN10,OPA1IN-,SDA
;			bit0-3	Unimplemented(read=0)
;
;		PORTC(BANK0　00EH）
;			bit7	RC7		GPI/O,AN9,OPA2IN+
;			bit6	RC6		GPI/O,AN8,OPA2IN-
;			bit5	RC5		GPI/O
;			bit4	RC4		GPI/O
;			bit3	RC3		GPI/O,AN7,OPA2OUT
;			bit2	RC2		GPI/O,AN6,OPA1OUT
;			bit1	RC1		GPI/O,AN5
;			bit0	RC0		GPI/O,AN4
;
;		TRISA(BANK1　08CH)
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-4	1=入力、0=出力
;			bit3	RA3		常に1
;			bit2	RA2-0	1=入力、0=出力
;
;		TRISB(BANK1 08DH)
;			bit4-7	RA5-4	1=入力、0=出力
;			bit0-3	Unimplemented(read=0)
;
;		TRISC(BANK1　08EH)
;			bit0-7	RC0-7	1=入力、0=出力
;
;		LATA(BANK2　10CH)　データラッチレジスタ
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-4	出力データ保持
;			bit3	Unimplemented(read=0)
;			bit2	RA2-0	出力データ保持
;		（このラッチデータはTRISAレジスタ設定で各ピンに反映される）
;
;		LATB(BANK2 10DH)
;			bit4-7	RB4-7	出力データ保持
;			bit0-3	Unimplemented(read=0)
;		（このラッチデータはTRISBレジスタ設定で各ピンに反映される）
;
;		LATC(BANK2　10EH)　データラッチレジスタ
;			bit0-7	RC0-7	出力データ保持
;		（このラッチデータは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(アナログ入力)となっている
;
;		ANSELB(BANK3 18DH)
;			bit7-6	Unimplemented(read=0)
;			bit5-4	ANSB5-4/RB5-4	アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			bit3-0	Unimplemented(read=0)
;			＊デフォルトでは、すべて1(アナログ入力)となっている
;
;		ANSELC(BANK3　18EH)
;			bit0-7	ANSC5-0/RC5-0アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			＊デフォルトでは、すべて1(アナログ入力)となっている
;
;		FVRCONレジスタ(BANK2　117H)
;			bit7	FVREN	FVRイネーブルビット
;							1=有効
;                           0=無効
;			bit6	FVRRDY	FVR準備フラグビット(#1)書込み不可
;							1=使用可能
;                           0=使用不可能あるいは禁止されている
;			bit5	TSEN	温度表示器イネーブルビット
;							1=有効
;                           0=無効
;			bit4	TSRNG	温度表示器測定レンジ選択ビット
;							1=High Range:Vout=VDD-4VT
;							0=Low Range:Vout=VDD-2VT
;			bit3-2	CDAFVR	コンパレータとDACへのFVR電圧選択ビット
;							11 = FVR出力　4x(4.096V)#2
;							10 = FVR出力　2x(2.048V)#2
;							01 = FVR出力 1x(1.024V)
;							00 = FVR出力OFF
;			bit1-0	ADFVR	ADCへのFVR電圧選択ビット
;							11 = FVR出力　4x(4.096V)#2
;							10 = FVR出力　2x(2.048V)#2
;							01 = FVR出力 1x(1.024V)
;							00 = FVR出力OFF
;
;							#1)16F1705/16F1709では常に"1"
;							#2)FVR電圧出力はVDDを超える事は出来ない
;
;		DAC1CON0レジスタ(BANK2　118H)
;		bit7	DACEN	DAC1イネーブルビット　P156 Fig17-1参照
;						1=許可
;						0=禁止
;		bit6	Unimplemented(read=0)
;		bit5	DAC1OE1	DAC1電圧出力1イネーブルビット
;						1=DAC1出力電圧をDACOUT1ピンにも出力される
;						0=DAC1出力電圧をDACOUT1ピンから切り離す
;		bit4	DAC1OE2	DAC1電圧出力2イネーブルビット
;						1=DAC1出力電圧をDACOUT2ピンにも出力される
;						0=DAC1出力電圧をDACOUT2ピンから切り離す
;		bit3-2	DAC1PSS	DAC1 正入力接続選択ビット
;						00 = VDD
;						01 = VREF+ピン(RA1)
;						10 = FVRバッファ2出力
;						11 = 使用不可
;		bit1	Un		Read as '0'
;       bit0    DAC1NSS DAC1 負入力選択ビット
;                       1=VREF-ピン(RA0)
;                       0=GND
;
;		ADCON0レジスタ（BANK1　09DH)
;		bit7	Unimplemented(read=0)
;		bit6-2	CHSx	アナログチャンネル指定
;						00000 = AN0/RA0
;						00001 = AN1/RA1
;						00010 = AN2/RA2
;						00011 = AN3/RA4
;						00100 = AN4/RC0
;						00101 = AN5/RC1
;						00110 = AN6/RC2
;						00111 = AN7/RC3
;						01000 = AN8/RC6
;						01001 = AN9/RC7
;						01010 = AN10/RB4
;						01011 = AN11/RB5
;						01000 = Reserved.No channel connected
;						    ・
;						11011 = Reserved.No channel connected
;						11100 = FVRバッファ２出力
;						11101 = 温度表示器
;						11110 = DAC1出力
;						11111 = FVRバッファ1出力
;		bit1	GO/DONE	A/D変換ステータスビット
;						1=変換開始指令（１にすると変換動作開始）
;						0=変換完了(変換完了すると０になる）
;		bit0	ADON	A/D変換ステータスビット
;						1=A/Dコンバータ動作
;						0=A/Dコンバータ停止
;
;		ADCON1レジスタ(BANK1　09EH)
;		bit7	ADFM	変換結果格納指定
;						1=右詰
;						0=左詰め
;		bit6-4	ADCS	A/D変換クロック選択ビット
;						000	= Fosc/2
;						001 = Fosc/8
;						010 = Fosc/32
;						011 = Frc
;						100 = Fosc/4
;						101 = Fosc/16
;						110 = Fosc/64
;						111 = Frc
;		bit3-2	Unimplemented(read=0)
;		bit1-0	ADPREF	参照正電圧指定
;						00 = VDD
;						01 = Reserved
;						10 = 外部VREF+ (RA1)
;						11 = 内部FVRモジュール
;
;       オペアンプ制御レジスタ(OPA1,OPA2)
;       OPAxCON(BANK10 0511H,0515H)
;		bit7	OPAxEN	OPAxイネーブルビット
;						1=有効
;						0=無効
;		bit6	OPAxSP  オペアンプ速度/消費電力選択ビット
;                       1=高GBWPモードで動作
;                       0=低GBWPモードで動作
;		bit5	Unimplemented(read=0)
;		bit4	OPAxUG	オペアンプ ユニティゲイン選択ビット
;						1=OPA出力を反転入力に接続。
;                         OPAxIN-ピンは汎用I/Oとして使用できる
;						0=反転入力をOPAxIN-ピンに接続する
;		bit3-2	Unimplemented(read=0)
;		bit1-0	OPAxCH	非反転チャンネル選択ビット
;						11 = 非反転入力にFVRバッファ2出力を接続
;						10 = 非反転入力にDAC_outputを接続
;						11 = 非反転入力にOPAxIN+を接続
;
;		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設定する必要は無い
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


init
;			各レジスタ初期設定(PIC16F1709)
			movlb	0h			;BANK0
			movlw	000h		;00000000B
			movwf	INTCON		;全割込みOFF
			movlb	0h			;BANK0
			clrf	PORTA		;Init PORT
			clrf	PORTB
			clrf	PORTC
			movlb   02h         ;BANK2
			clrf	LATA
			clrf	LATB
			clrf	LATC
			;クロック
			movlb	01H			;BANK１
			movlw	0F0H		;1111000B
			movwf	OSCCON		;内部発振器は8MHZに設定
								;4xPLL=ON
			;TMR0およびプルアップ
;			movlb	01H			;BANK 1
			movlw	083H		;10000011b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース内部（Fosc/4）
								;TMR0カウントエッジ↓
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/16にセット
			;I/Oポート(TRIS→BANK1、ANSEL→BANK3)
			movlb	01H			;BANK 1
			movlw	0FH			;00001111B
			movwf	TRISA		;RA0-3入力、RA4-5出力
			movlw	0FFH
			movwf	TRISB
			movlw	0FFH		;11111111B
			movwf	TRISC		;RC0-7入力
			movlb	03H			;BANK3
			movlw	00H			;00000000B
			movwf	ANSELA		;RA0-5=デジタル
			movlw	00H
			movwf	ANSELB		;RB4-7=デジタル
			movlw	00H			;00000000B
			movwf	ANSELC		;RC0-7=デジタル

;			RC0-1 PPS INPUT SET
			movlb	01CH		;SSPCLKPPS,SSPDATPPS BANK28
			movlw	010H
			movwf	SSPCLKPPS	;RC0の入力先はSCL
			movlw	011H
			movwf	SSPDATPPS	;RC1の入力先はSDA

;			RC0-1 PPS OUTPUT SET
			movlb	01DH		;RAxPPS,RCxPPS BANK29
			movlw	010H
			movwf	RC0PPS		;RC0の出力源はSCL
			movlw	011H
			movwf	RC1PPS		;RC1の出力源はSDA

	
;			PPS LOCKED
;			movlb	01CH		;PPSLOCK BANK28
;			movlw	055H
;			movwf	PPSLOCK
;			movlw	0AAH
;			movwf	PPSLOCK
;			bsf		PPSLOCK,PPSLOCKED	;以降、PPS設定不可にする


			;FVR(BANK2)
;			movlb	02h			;BANK2
;			movlw	088h		;10001000B
;			movwf	FVRCON		;FVRイネーブル
								;DACとCPSに2.048V
								;ADCにはOFF

;			8ビットDAC(BANK2)
;			movlw	088h		;10001000B
;			movwf	DAC1CON0	;DAC1イネーブル
;			movlb	0h			;基準電圧はFVR
								;DACOUTピン切り離し

;			オペアンプ1(BANK10)
;			movlb	0ah			;BANK10
;			movlw	0d2h		;11010010B
;			movwf	OPA1CON		;OPA1イネーブル
;			movlb	0h			;高GBWPモード、ユニティゲイン
								;IN+=DAC1_OUTPUT
;			注意	オペアンプ出力ピンはアナログ入力に設定する事

;			レジスタ初期設定終了
			clrf	BSR



;			初期値セット
			LED1ON
			LED2ON
			call	wait1s		;モジュール安定化待ち
			LED2OFF
			LED1OFF
			call	MSSP_MAS	;MSSP1起動、I2Cマスタアイドル
			call	INIT5_LCD	;AQM1602イニシャライズ
			clrf	hex0
			clrf	hex1
			clrf	hex2
			clrf	hex3
;
;		メインループ
;
;

coldst
			movlw	LOW MSG01	;MSG01間接アドレス値下位8ビット
			movwf	MSAD0
			movlw	HIGH MSG01	;MDG01間接アドレス値上位8ビット
			movwf	MSAD1
			call	PUTL1		;"PIC16F1709BASIC"
			movlw	LOW MSG02	;MSG02間接アドレス値下位8ビット
			movwf	MSAD0
			movlw	HIGH MSG02	;MDG02間接アドレス値上位8ビット
			movwf	MSAD1
			call	PUTL2		;"ASM Ver1  JA0QON"
			call	wait1s
			call	CLRLCD		;LCD画面全クリア
			;
			;

mloop		;メインループ
			movlw	LOW MSG01	;MSG01間接アドレス値下位8ビット
			movwf	MSAD0
			movlw	HIGH MSG01	;MDG01間接アドレス値上位8ビット
			movwf	MSAD1
			call	PUTL2		;"PIC16F1705BASIC"
			call	wait1s

			;
			movlw	0C0H		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	08FH
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0C1H		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	08EH
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0C2H		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	08DH
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0C3H		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	08CH
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0C4H		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	08BH
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0C5H		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	08AH
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0C6H		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	089H
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0C7H		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	088H
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0C8H		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	087H
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0C9H		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	086H
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0CAH		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	085H
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0CBH		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	084H
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0CCH		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	083H
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0CDH		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	082H
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0CEH		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	081H
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
			movlw	0CFH		;LINE0先頭アドレス
			movwf	DSP_ADR
			call	GETW
			movwf	wrk0
			movlw	080H
			movwf	DSP_ADR
			movf	wrk0,W
			call	PUTW
			call	wait500m
			;
;
			call	wait1s
;
			movlw	0C8H
			call	BLNKON
			call	wait1s
			call	wait1s
			call	wait1s
			call	wait1s
			call	wait1s
			movlw	0C8H
			call	BLNKOFF
;
			call	CLRLCD
			movlw	'G'
			call	L1BSL
			call	wait100m
			movlw	'H'
			call	L1BSL
			call	wait100m
			movlw	'I'
			call	L1BSL
			call	wait100m
			movlw	'J'
			call	L1BSL
			call	wait100m
			movlw	'K'
			call	L1BSL
			call	wait100m
			movlw	'L'
			call	L1BSL
			call	wait100m
			movlw	'M'
			call	L1BSL
			call	wait100m
			movlw	'N'
			call	L1BSL
			call	wait100m
			movlw	'O'
			call	L1BSL
			call	wait100m
			movlw	'P'
			call	L1BSL
			call	wait100m
			movlw	'Q'
			call	L1BSL
			call	wait100m
			movlw	'R'
			call	L1BSL
			call	wait100m
			movlw	'S'
			call	L1BSL
			call	wait100m
			movlw	'T'
			call	L1BSL
			call	wait100m
			movlw	'U'
			call	L1BSL
			call	wait100m
			movlw	'V'
			call	L1BSL
			call	wait1s

			movlw	'0'
			call	L2BSL
			call	wait100m
			movlw	'1'
			call	L2BSL
			call	wait100m
			movlw	'2'
			call	L2BSL
			call	wait100m
			movlw	'3'
			call	L2BSL
			call	wait100m
			movlw	'4'
			call	L2BSL
			call	wait100m
			movlw	'5'
			call	L2BSL
			call	wait100m
			movlw	'6'
			call	L2BSL
			call	wait100m
			movlw	'7'
			call	L2BSL
			call	wait100m
			movlw	'8'
			call	L2BSL
			call	wait100m
			movlw	'9'
			call	L2BSL
			call	wait100m
			movlw	'A'
			call	L2BSL
			call	wait100m
			movlw	'B'
			call	L2BSL
			call	wait100m
			movlw	'C'
			call	L2BSL
			call	wait100m
			movlw	'D'
			call	L2BSL
			call	wait100m
			movlw	'E'
			call	L2BSL
			call	wait100m
			movlw	'F'
			call	L2BSL
			call	wait1s

			call	CLRLCD
			goto	mloop

MSG01		DT		"PIC16F1709BASIC"
			DW		0
MSG02		DT		"ASM Ver1  JA0QON"
			DW		0


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	10桁バイナリ数値出力を16桁2行LCDに送信
;
;
;			表示開始先頭位置および表示段場所
;	LCDFLG		表示ドット指定
;				bit7	表示段(1=上段,0=下段)
;				bit6	表示ON-OFF(1=する,0=全てしない)
;				bit5-3	末尾にGHZ表示(100)
;						末尾にMHZ表示(011)
;						末尾にKHZ表示(010)
;						末尾にHZ表示(001)
;						末尾に何も表示しない(000)
;				bit1-0	ドットを表示「0.000.000.000」(11）
;						ドットを表示「00.000.000.00」(10）
;						ドットを表示「000.000.000.0」(01）
;						ドットを表示「0000000000」(00）
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LCDNUM
;			btfss	LCDFLG,7
;			bra		DSPL1
DSPL0;
			movlw	080H		;LINE0先頭アドレス
			movwf	DSP_ADR
			movf	digit9A,W	;十進数に変換したバイナリ数値
			call	NUTOASC		;数値を文字コードに変換
			movf	ASC1,W		;上位桁文字コード
			call	PUTW		;1文字表示
			incf	DSP_ADR,F	;DDRAMアドレス+1
			movf	ASC0,W		;下位桁文字コード
			call	PUTW
			incf	DSP_ADR,F
;
			movf	digit78,W	;十進数に変換したバイナリ数値
			call	NUTOASC		;数値を文字コードに変換
			movf	ASC1,W		;上位桁文字コード
			call	PUTW		;1文字表示
			incf	DSP_ADR,F	;DDRAMアドレス+1
			movf	ASC0,W		;下位桁文字コード
			call	PUTW
			incf	DSP_ADR,F
;
			movf	digit56,W	;十進数に変換したバイナリ数値
			call	NUTOASC		;数値を文字コードに変換
			movf	ASC1,W		;上位桁文字コード
			call	PUTW		;1文字表示
			incf	DSP_ADR,F	;DDRAMアドレス+1
			movf	ASC0,W		;下位桁文字コード
			call	PUTW
			incf	DSP_ADR,F
;
			movf	digit34,W	;十進数に変換したバイナリ数値
			call	NUTOASC		;数値を文字コードに変換
			movf	ASC1,W		;上位桁文字コード
			call	PUTW		;1文字表示
			incf	DSP_ADR,F	;DDRAMアドレス+1
			movf	ASC0,W		;下位桁文字コード
			call	PUTW
			incf	DSP_ADR,F
;
			movf	digit12,W	;十進数に変換したバイナリ数値
			call	NUTOASC		;数値を文字コードに変換
			movf	ASC1,W		;上位桁文字コード
			call	PUTW		;1文字表示
			incf	DSP_ADR,F	;DDRAMアドレス+1
			movf	ASC0,W		;下位桁文字コード
			call	PUTW
			incf	DSP_ADR,F
;
			return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		ＡＥ-ＡＱＭ１６０２　制御プログラム　
;
;								　Ver2 ＪＡ０ＱＯＮ
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;
;		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

;
;		指定の位置「データ」をＷレジスタに読み込む
;
;		AQM1602ではハードウエアの仕様で読み込みできない
;		当局版 SC1602_I2C では読み込み可能
;		表示位置指定	DSP_ADR
;		I2Cアドレス		7CH
;
GETW
			call	STARTCON	;スタートコンディション送信
			movlw	07CH		;I2Cアドレス+WRITE
			call	SEND_BYTE	;アドレス送信

			movlw	00H			;C0=0、RS=0
			call	SEND_BYTE	;コントロールバイト送信
			movf	DSP_ADR,W	;読み込み位置アドレス指定
			call	SEND_BYTE
			call	wait50u

			call	RESTART
			movlw	07DH		;R/W=1(ADR+1)
			call	SEND_BYTE	;I2Cアドレス送信
			call	LAST_RCV	;W=文字コード
			movwf	icw0		;PUSH Wreg
			call	wait50u
			call	STOPCON
			movf	icw0,W		;POP Wreg
			return

;
;	Ｗレジスタの「データ」を書き込む
;	ここでは位置指定処理はしない
;		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

;
;		Ｗレジスタにデータ読み込む
;		ここでは位置指定処理は行わない
;
;		AQM1602ではハードウエアの仕様で読み込みできない
;		当局版 SC1602_I2C では読み込み可能
;		I2Cアドレス		7CH
;
RCVD
			call	STARTCON	;スタートコンディション送信
			movlw	07DH		;R/W=1(ADR+1)
			call	SEND_BYTE	;I2Cアドレス送信
			call	LAST_RCV	;W=文字コード
			movwf	icw0		;PUSH Wreg
			call	wait50u
			call	STOPCON
			movf	icw0,W		;POP Wreg
			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				;

;
;		2(1)行目左シフト(2行16文字モードのみ有効)
;	Wregのデータを最右側に1文字表示（表示開始位置）
;	既存の表示データは左側にシフトされる
;	最左側のデータは破棄される
;
;	使用ワーク	BSLW0
L2BSL		;２行目
			movwf	BSLW0		;表示データ保存
			movlw	0C1H
			movwf	DSP_ADR		;シフト開始アドレス
L2BSL01
			call	GETW		;シフトデータ読み込み
			decf	DSP_ADR,F	;移動先アドレス
			call	PUTW		;シフトデータ書き込み
			incf	DSP_ADR,F
			incf	DSP_ADR,F	;次の読み込みアドレス
			movlw	0D0H
			xorwf	DSP_ADR,W	;最終アドレスチェック
			btfss	STATUS,Z
			bra		L2BSL01
;
L2BSL02		decf	DSP_ADR,F
			movf	BSLW0,W
			call	PUTW
			return

L1BSL		;１行目
			movwf	BSLW0		;表示データ保存
			movlw	081H
			movwf	DSP_ADR		;シフト開始アドレス
L1BSL01
			call	GETW		;シフトデータ読み込み
			decf	DSP_ADR,F	;移動先アドレス
			call	PUTW		;シフトデータ書き込み
			incf	DSP_ADR,F
			incf	DSP_ADR,F	;次の読み込みアドレス
			movlw	090H
			xorwf	DSP_ADR,W	;最終アドレスチェック
			btfss	STATUS,Z
			bra		L1BSL01
			bra		L2BSL02

;
;		2行目-1行目左シフト(2行16文字モードのみ有効)
;	Wregのデータを2行目最右側に1文字表示（表示開始位置）
;	既存の表示データは左側にシフトされる
;	2行目最左側のデータは1行目最右側にシフト
;	1行目最右側のデータは左側にシフト
;	左シフトは停止位置までで、それ以降は破棄される
;	停止位置アドレスは１行目のみ指定可能
;
;	スクロール停止位置	BSLSP
;	使用ワーク	BSLW0,BSLW1
L21BSL
			;１行目処理
			movwf	BSLW0		;表示データ保存
			movf	BSLSP,W		;スクロール停止位置VRAMアドレス
			iorlw	0H			;ゼロチェック
			btfsc	STATUS,Z
			movlw	080H
			movwf	DSP_ADR		;シフト開始アドレス
			incf	DSP_ADR,F
L21BSL01
			call	GETW		;シフトデータ読み込み
			decf	DSP_ADR,F	;移動先アドレス
			call	PUTW		;シフトデータ書き込み
			incf	DSP_ADR,F
			incf	DSP_ADR,F	;次の読み込みアドレス
			movlw	090H
			xorwf	DSP_ADR,W	;1行目最終アドレスチェック
			btfss	STATUS,Z
			bra		L21BSL01	;最終アドレス以下
			;行間処理
			movlw	0C0H
			movwf	DSP_ADR
			call	GETW
			movwf	BSLW1
			movlw	08FH
			movwf	DSP_ADR
			movf	BSLW1,W
			call	PUTW
			;２行目処理
			movlw	0C1H
			movwf	DSP_ADR		;シフト開始アドレス
L21BSL02
			call	GETW		;シフトデータ読み込み
			decf	DSP_ADR,F	;移動先アドレス
			call	PUTW		;シフトデータ書き込み
			incf	DSP_ADR,F
			incf	DSP_ADR,F	;次の読み込みアドレス
			movlw	0D0H
			xorwf	DSP_ADR,W	;最終アドレスチェック
			btfss	STATUS,Z
			bra		L21BSL02
			;
L21BSL03	decf	DSP_ADR,F
			movf	BSLW0,W
			call	PUTW
			return




;
;		ブリンク
;
;		Wregで指定の表示アドレス(DDRAMアドレス)
;		の文字をブリンク
;		同時に複数の文字のブランキングは出来ないようです
;		ブランキング中に他の位置をブランキングすると、
;		以前の位置のブランキングはリセットされます
;

BLNKON
			call	WRTC
			movlw	0DH
			call	WRTC
			return
BLNKOFF
			call	WRTC
			movlw	0CH
			call	WRTC
			return



;
;		ＬＣＤ画面クリア
;
CLRLCD		;全画面クリア
			movlw	01H
			call	WRTC
			call	wait5m
			return
CLRLCD1		;1行目クリア
			movlw	080H
			movwf	DSP_ADR
CLD11		movf	DSP_ADR,W
			call	WRTC
			call	wait50u
			movlw	020H
			call	WRTD
			call	wait50u
			movlw	090H
			incf	DSP_ADR,F
			xorwf	DSP_ADR,W
			btfss	STATUS,Z
			bra		CLD11
			return
CLRLCD2		;2行目クリア
			movlw	0C0H
			movwf	DSP_ADR
CLD21		movf	DSP_ADR,W
			call	WRTC
			call	wait50u
			movlw	020H
			call	WRTD
			call	wait50u
			movlw	0D0H
			incf	DSP_ADR,F
			xorwf	DSP_ADR,W
			btfss	STATUS,Z
			bra		CLD21
			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



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	ＰＩＣ１６Ｆ１ｘ ＭＳＳＰモジュール
;	Ｉ２Ｃマスターモード制御サブルーチン群
;
;									Ver0.2b JA0QON
;
;		使用ワーク
;		wrk1
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;
;   I2C　マスタモード初期化サブルーチン
;
;       RC0     SCL         I2Cクロック
;       RC1     SDA         I2Cデータ
;
MSSP_MAS
			movlb	04h
			movlw	038h        ;38H=00111000
			movwf	SSP1CON1    ;SSP1ﾏｽﾀｰﾓｰﾄﾞ ｲﾈｰﾌﾞﾙ
			movlw	04fh
			movwf	SSP1ADD		;100KHZボーレート
			clrf	BSR
            call	MSSP_IDLE	;
			return

;
;		MSSPアイドル待ち
;
;   R/WとSEN,RSEN,PEN,RCEN,ACKENのどれかとOR演算すると
;   MSSP1がアイドルかどうかが分かる
;
MSSP_IDLE
            movlb   04h
msid01      movf    SSP1CON2,W
            andlw   01fh        ;1FH=00011111B
            btfss	STATUS,Z
			bra		msid01		;MSSP not idle
            btfsc	SSP1STAT,R_NOT_W
            bra		$-1			;R/Wbit=1 not idle
            clrf    BSR
            return
;
;		MSSP STARTCON 送信
;
STARTCON
			bcf		PIR1,SSP1IF	;
			call	MSSP_IDLE	;アイドル待ち
            movlb   04h
            bcf SSP1CON1,WCOL   ;衝突フラグクリア
            bsf SSP1CON2,SEN    ;スタート出力
            btfsc   SSP1CON1,WCOL
            goto    STARTCON    ;スタート再出力
            btfsc   SSP1CON2,SEN
            bra     $-1         ;送信完了チェック
            clrf    BSR
			bcf		PIR1,SSP1IF	;SSP1IFをクリア
            return

;
;		MSSP反復スタート
;
RESTART
			bcf		PIR1,SSP1IF	;
            movlb   04h
            bsf SSP1CON2,RSEN	;リスタート出力
            btfsc   SSP1CON2,RSEN
            bra     $-1         ;送信完了チェック
            clrf    BSR
            return

;
;   マスターモード　1バイト送信
;   送信データはＷレジスタ
;
SEND_BYTE
;	SSP1CON2,SEN=1で、START条件の生成
;	START完了でﾊｰﾄﾞｳｴｱがSSP1IFをセット
			bcf		PIR1,SSP1IF	;SSP1IFをクリア
			movlb	04h
			movwf	SSP1BUF		;送信開始、BF=1
			btfsc	SSP1STAT,BF	;BF=0で送信完了
			bra		$-1			;送信終了待ち
			btfsc   SSP1CON2,ACKSTAT
			bra		$-1			;ACK返信待ち
;	ACK確認終了で、SSP1IFがセットされる、STOP確認でもSSP1IFがセット
;	ｿﾌﾄｳｴｱでSSP1IFをクリアする
			clrf	BSR
			call    MSSP_IDLE   ;アイドル待ち（これをしないと送信失敗する）
			return

;
;   マスターモード　1バイト受信
;   受信データはＷレジスタ
;
RCV_BYTE
;	SSP1CON2,SEN=1で、START条件の生成
;	STARAT完了でﾊｰﾄﾞｳｴｱがSSP1IFをセット
;	ｿﾌﾄｳｴｱでSSP1IFをクリア
;	ｽﾚｰﾌﾞｱﾄﾞﾚｽ送信、R/W=1
;	ﾏｽﾀがｽﾚｰﾌﾞからの/ACKをACKSTATで確認
;	ACK確認終了で、SSP1IFがセットされる
;	ｿﾌﾄｳｴｱでSSP1IFをクリアする

			bcf		PIR1,SSP1IF	;SSP1IFをクリア
			movlb   04h
			bsf	SSP1CON2,RCEN	;ﾏｽﾀｰﾓｰﾄﾞ受信許可
			btfss SSP1STAT,BF	;BF=1で受信完了
			bra		$-1			;受信終了待ち
			clrf	BSR
			bcf		PIR1,SSP1IF	;SSP1IFをクリア
			movlb	04h
			movf	SSP1BUF,W	;受信データ読み出し、BF=0
			clrf	BSR
			movwf	wrk1		;受信データ一時保管

			movlb	04h
			bcf SSP1CON2,ACKDT	;ACK応答する、にセット
			bsf SSP1CON2,ACKEN	;ｽﾚｰﾌﾞにACK返送
			btfsc	SSP1CON2,ACKEN
			bra		$-1
			bcf SSP1CON1,SSPOV	;受信OFフラグリセット
			clrf	BSR
			bcf		PIR1,SSP1IF	;SSP1IFをクリア
			call	MSSP_IDLE	;アイドル待ち
			movf	wrk1,W
			return
;
;   最終バイト受信
;
;		通常受信と違うのは、データ8bit受信後のACK応答
;		連続受信-ACK応答する
;		1バイト受信あるいは最終受信-ACK応答しない
;
LAST_RCV
			bcf		PIR1,SSP1IF	;SSP1IFをクリア
            movlb   04h
            bsf SSP1CON2,RCEN   ;受信許可
            btfss   SSP1STAT,BF
            bra     $-1         ;受信終了待ち
			clrf	BSR
			bcf		PIR1,SSP1IF	;SSP1IFをクリア
			movlb	04h
			movf	SSP1BUF,W	;受信データ読み出し、BF=0
			clrf	BSR
			movwf	wrk1		;受信データ一時保管

			movlb	04h
			bsf SSP1CON2,ACKDT	;NACK（ACK応答しない)にセット
			bsf SSP1CON2,ACKEN	;ｽﾚｰﾌﾞにACK返送
			btfsc	SSP1CON2,ACKEN
			bra		$-1
			clrf	BSR
			bcf		PIR1,SSP1IF	;SSP1IFをクリア
			call	MSSP_IDLE	;アイドル待ち
			movf	wrk1,W
			return
;
;		MSSP STOPCON送信
;
STOPCON
			bcf		PIR1,SSP1IF	;SSP1IFをクリア
			movlb	04h
			bsf	SSP1CON2,PEN
			btfsc	SSP1CON2,PEN
			bra		$-1
			clrf	BSR
			bcf		PIR1,SSP1IF	;ｿﾌﾄｳｴｱがSSP1IFをクリア
			call	MSSP_IDLE	;アイドル待ち
			return




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		４バイトバイナリの10桁BCDへの変換
;		MicroChip社のアプリケーションノートより
;
;		入力		4バイト(32ビット)16進バイナリ
;				hex0
;				hex1
;				hex2
;				hex3
;
;		出力		5バイト(10桁)ＢＣＤ
;				digit12
;				digit34
;				digit56
;				digit78
;				digit9A
;
;		使用ワーク
;				hexw0	入力データ保存用
;				hexw1
;				hexw2
;				hexw3
;				shift	シフトカウンタ
;				bcdw0	補正処理ワーク
;				bcdw1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCD
			BCF		STATUS,C	;キャリーリセット
			MOVLW	020H		;シフトカウンタ初期化
			MOVWF	shift		;4バイト分32回の指定
			CLRF	digit12		;BCDデータエリア初期化
			CLRF	digit34
			CLRF	digit56
			CLRF	digit78
			CLRF	digit9A
			movf	hex0,W
			movwf	hexw0
			movf	hex1,W
			movwf	hexw1
			movf	hex2,W
			movwf	hexw2
			movf	hex3,W
			movwf	hexw3

			;変換ループ処理
loop
			RLF		hexw0,F		;16進データ左シフト
			RLF		hexw1,F
			RLF		hexw2,F
			RLF		hexw3,F
			RLF		digit12,F	;BCDデータ左シフト
			RLF		digit34,F
			RLF		digit56,F
			RLF		digit78,F
			RLF		digit9A,F
			DECFSZ	shift,F		;
			GOTO	adjst		;BCD調整処理へ
			RETURN

			;BCDデータ全桁補正処理
adjst
			MOVF	digit12,W	;digit12
			CALL	adjbcd
			MOVWF	digit12
			MOVF	digit34,W	;digit34
			CALL	adjbcd
			MOVWF	digit34
			MOVF	digit56,W	;digit56
			CALL	adjbcd
			MOVWF	digit56
			MOVF	digit78,W	;digit78
			CALL	adjbcd
			MOVWF	digit78
			MOVF	digit9A,W	;digit9A
			CALL	adjbcd
			MOVWF	digit9A
			GOTO	loop

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			1バイト2桁分必要に応じて+3補正処理
;
;			入力		W_reg
;			出力		W_reg
;
;			使用ワーク	bcdw0
;					bcdw1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
adjbcd
			MOVWF	bcdw0		;元データをbcdw0に保存
			MOVLW	3			;W=3
			ADDWF	bcdw0,W		;W=3+bcdw0
			MOVWF	bcdw1		;下桁を+3した上下桁をbcdw1に保存
			BTFSC	bcdw1,3		;if 下桁<7 then next_skip
			MOVWF	bcdw0		;下桁を+3した上下桁をbcdw0に保存

			MOVLW	030H		;W+30
			ADDWF	bcdw0,W		;W=上桁+3
			MOVWF	bcdw1		;それをいったんbcdw1に保存
			BTFSC	bcdw1,7		;if 上桁<7 then next_skip
			MOVWF	bcdw0		;上桁を+3した上下桁をbcdw0に保存
			MOVF	bcdw0,W		;W_regに入れてリターン
			RETURN



;
;		数字コードを数値に変換
;
;		入出力はWreg
;		数字コード以外はFFHに変換
;
ASCTONUM
			movwf	wrk0
			movlw	030h		;'0'
			subwf	wrk0,W		;W=wrk0-W
			btfss	STATUS,C
			bra		NUMERR		;wrk0<W
			movwf	wrk1
			sublw	039h		;W=39H('9')-W　？？
			btfss	STATUS,C
			bra		NUMERR
			movf	wrk1,W
			return
NUMERR		retlw	0FFh


;
;		16進8bitバイナリ数値を文字コードに変換
;
;		入力	Wreg:00H-FFH
;		出力	ASC0:下位4bit分の文字コード'0-9'、'A-F'
;			ASC1:上位4bit分の文字コード'0-9'、'A-F'
;
;		使用ワーク	wrk0,wrk1
;
NUTOASC
			movwf	wrk0		;Wreg退避
			andlw	0FH
			movwf	wrk1		;下位4bit分のみ
			movlw	0Ah
			subwf	wrk1,W		;W=F-W
			btfsc	STATUS,C	;/borrow
			bra		NUA1
NUA0		movf	wrk1,W
			addlw	030h
			movwf	ASC0
			bra		NUA2
NUA1;		下位4bit A-F
			movf	wrk1,W
			addlw	037h
			movwf	ASC0

NUA2		;上位4bitチェック
			swapf	wrk0,W
			andlw	0FH
			movwf	wrk1		;上位4bit分のみ
			movlw	0Ah
			subwf	wrk1,W		;W=F-W
			btfsc	STATUS,C	;/borrow
			bra		NUA4
NUA3		movf	wrk1,W
			addlw	030H
			movwf	ASC1
			return
NUA4;		上位4bit A-F
			movf	wrk1,W
			addlw	037H
			movwf	ASC1
			return




;			32ビットバイナリ加算(整数符号無）
;
;		事前に(hex0-3)、(hexw0-3)に数値を入れておく事
;		演算結果でエラー(桁上がり）が発生しても対処はしない
;		hexw(0-3)は保存される
;
;		演算
;		hex(0-3) = hex(0-3) + hexw(0-3)
;

ADD32B
			movf	hexw0,W		;hex0=hex0+hexw0
			addwf	hex0,F		;桁上がりでC=1
			movlw	01h			;この命令はフラグ変化しない
			btfss	STATUS,C	;if c=1 then hex1=hex1+1
			goto	ad31		;桁上がり無
;			(hex0+W)に桁上がり発生、処理
			addwf	hex1,F		;hex1=hex1+1
			btfsc	STATUS,C	;桁上がり無なら、goto ad31
			addwf	hex2,F		;桁上がり発生、hex2=hex2+1
			btfsc	STATUS,C	;桁上がり無なら、goto ad31
			addwf	hex3,F		;桁上がり発生、hex3=hex3+1
								;ここで桁上がり発生しても対処しない
ad31		movf	hexw1,W
			addwf	hex1,F
			movlw	01h
			btfsc	STATUS,C
			addwf	hex2,F
			btfsc	STATUS,C
			addwf	hex3,F

ad32		movf	hexw2,W
			addwf	hex2,F
			movlw	01h
			btfsc	STATUS,C
			addwf	hex3,F
			movf	hexw3,W
			addwf	hex3,F
			retlw	0h


;
;
;			32ビットバイナリ減算(整数符号無)
;
;		事前にhex(0-3)、hexw(0-3)に数値を入れておく事
;		演算結果でエラー(マイナス）の場合W=1、OKの時はW=0でリターン
;		W=FFHの場合、演算結果は保障されない
;		hexw(0-3)は保存される
;
;		演算
;		hex(0-3) = hex(0-3) - hexw(0-3)
;

SUB32B
;			hex0-hexw0の減算
			movf	hexw0,W		;hex0=hex0-W(hexw0)
			subwf	hex0,F		;W>HEX0の時、ボロー(C=0)
								;W<=HEX0の時、無(C=1)
			movlw	01h			;この命令はフラグ変化しない
			btfss	STATUS,C	;C=1なら、hex1-hexw1へ
;			(hex0-W)にボロー発生、hex1に桁借り処理
			subwf	hex1,F		;hex1=hex1-1
			btfss	STATUS,C	;C=1なら、goto sb31
			subwf	hex2,F		;(hex1-1)にボロー発生、hex2に桁借り
			btfss	STATUS,C	;C=1なら、goto sb31
			subwf	hex3,F		;(hex2-1）ボロー発生、hex3に桁借り
			btfss	STATUS,C
			retlw	0FFh		;hex3にボロー発生、エラー終了

;			hex1-hexw1の減算
sb31		movf	hexw1,W		;
			subwf	hex1,F
			movlw	01h
			btfss	STATUS,C
			subwf	hex2,F
			btfss	STATUS,C
			subwf	hex3,F
			btfss	STATUS,C
			retlw	0FFh
;			hex2-hexw2の減算
			movf	hexw2,W
			subwf	hex2,F
			movlw	01h
			btfss	STATUS,C
			subwf	hex3,F
			btfss	STATUS,C
			retlw	0FFh
;			hex3-hexw3の減算
			movf	hexw3,W
			subwf	hex3,F
			btfss	STATUS,C
			retlw	0FFh
			retlw	0h

;		16ビットバイナリ加算　ver1.2(バグ修正版)
;		hex(0-1)=hex(0-1)+hexw(0-1)
;		W=0の時、正常終了
;		W=FFHの時、エラー発生（キャリー）、演算結果は保障されない
;		hexw(0-1)は保存される
ADD16B
			movf	hexw0,W		;W=hexw0
			addwf	hex0,F		;hex0=hex0+hexw0
			movlw	01h			;この命令はフラグ変化しない
			btfss	STATUS,C
			goto	ad11		;キャリー無で次の加算
			addwf	hex1,F		;キャリー発生、hex1=hex1+1
			btfsc	STATUS,C
			retlw	0FFH			;桁上がり発生、加算エラー終了
ad11		movf	hexw1,W		;W=hexw1
			addwf	hex1,F		;hex1=hex1+hexw1
			btfsc	STATUS,C
			retlw	0FFH		;キャリー発生、加算エラー終了
			retlw	0h			;加算正常終了


;		16ビットバイナリ減算　Ver1.1(バグ修正版)
;		hex(0-1)=hex(0-1)-hexw(0-1)
;		W=0の時、正常終了
;		W=FFHの時、エラー発生（ボロー）、演算結果は保障されない
;		hexw(0-1)は保存される
SUB16B
			movf	hexw0,W		;W=hexw0
			subwf	hex0,F		;hex0=hex0-hexw0
			movlw	01h			;フラグ変化しない
			btfsc	STATUS,C
			goto	sb11		;ボロー無で次の減算
			subwf	hex1,F		;ボロー発生、hex1=hex1-1
			btfss	STATUS,C
			retlw	0FFH		;ボロー発生、減算エラー終了

sb11		movf	hexw1,W		;W=hexw1
			subwf	hex1,F		;hex1=hex1-hexw1
			btfss	STATUS,C
			retlw	0FFh		;ボロー発生、減算エラー終了
			retlw	0h			;減算正常終了


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン	32MHZ用
;									JA0QON	Ver32.1a
;		1cycle	= 0.125us
;		使用ワークレジスタ	cnt0-cnt3
;		BSR		=0(BANK0)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

wait100u						;呼び出しも含めて、100us
								;call is 2cycles
			clrf	BSR
			movlw	09h			;1
			movwf	cnt2		;1
			movlb	0h
;			nop
			nop					;3
w100u		nop					;
			call	wait10u		;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
			clrf	BSR
			call	wait10u
			call	wait10u
			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
			clrf	BSR
			movlw	05h
			movwf	cnt2
w5m			call	wait1m
			decfsz	cnt2,F
			goto	w5m
			return

wait10m							; 10ms
			clrf	BSR
			movlw	d'10'
			movwf	cnt2
w10m		call	wait1m
			decfsz	cnt2,F
			goto	w10m
			return

wait20m							; 20ms
			clrf	BSR
			movlw	d'20'
			movwf	cnt2
w20m		call	wait1m
			decfsz	cnt2,F
			goto	w20m
			return
wait50m							; 50ms
			clrf	BSR
			movlw	d'50'
			movwf	cnt2
w50m		call	wait1m
			decfsz	cnt2,F
			goto	w50m
			return

wait100m						; 100ms
			clrf	BSR
			movlw	d'100'
			movwf	cnt2
w100m		call	wait1m
			decfsz	cnt2,F
			goto	w100m
			return

wait500m						; 500ms
			clrf	BSR
			movlw	05h
			movwf	cnt3
w500m		call	wait100m
			decfsz	cnt3,F
			goto	w500m
			return

wait1s							; 1s
			clrf	BSR
			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
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
wait1m
			clrf	BSR
			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サイクル消費する
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

wait10u
			clrf	BSR
			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

wait05u
			clrf	BSR
			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

wait02u
			clrf	BSR
			movlw	04h			;2us=0.125us*16cycles
			movwf	cnt0		;
w02u0		decfsz	cnt0,F		;2+3*3+2+1+2=16cycles
			goto	w02u0
;			nop
			return				;
wait01u
			clrf	BSR			;1us=0.125us*8cycles
			nop					;2+4+2=8cycles
			nop
			nop
			return

			END					;これ以降アッセンブルされない

