;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		ＰＩＣキットによる温湿度計
;		温湿度センサ ＨＤＣ１０００を使う
;
;								　Ver1.0 ＪＡ０ＱＯＮ
;
;		PIC12F1823 32MHZ（内部オシレータ）
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



		LIST	P=PIC16F1823
		INCLUDE	P16F1823.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=有効　クロックが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  １  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					Unimplemented
;bit10		BORV	0	ブラウンアウト･リセット電圧選択ビット（Vbor参照)
;						1=低電圧で動作
;						0=高電圧で動作
;bit9		STVREN	0	スタック･オーバーフロー･リセット設定
;						1=有効
;						0=無効
;bit8		PLLEN	0	PLL設定
;						1=4xPLL有効
;						0=4xPLL無効
;bit7-5					Unimplemented
;bit4					Reserved
;bit3-2					Unimplemented
;bit1-0		WRT		11	フラッシュメモリ プロテクション設定（EECONレジスタ参照)
;						11=無効
;						10=0h-1FFh有効
;						01=0h-3FFh有効
;						00=0h-7FFh有効
;
;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  1  1  1
;
;
	__CONFIG _CONFIG2,	B'0001100011111111'


;		ワークエリア定義
;
;		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		;実行モード設定
hexd		equ		030h		;小数部分
CYC0		equ		031h		;呼び出し周期カウンタ
CYC1		equ		032h		;呼び出し周期カウンタ
DCM0		equ		033h		;基数演算用ワーク
DCM1		equ		034h		;
DCM2        equ     035h        ;
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
;
DATA0		equ		052h
DATA1		equ		053h
SIGN		equ		05eh
DSP_ADR     equ     05fh
icw0        equ     060h
icw1        equ     061h
MSAD0		equ		062h
MSAD1		equ		063h
TMP_H		equ		06bh
TMP_L		equ		06ch
HUM_H		equ		06dh
HUM_L		equ		06eh
LDWR		equ		06fh
;
;	液晶表示バッファ
;
;	A0H-AFH		1行目16バイトでA0Hは最右側、AFHが最左側
;	B0H-BFH		2行目
;	FSR0でアクセス

			ORG		0h
			goto	init
			ORG		04h

;
;		割込み処理ルーチン
;
;		割込み発生から割込みベクタまで3サイクル程度（同期割込み）
;		FSRxはコアレジスタなので、自動で PUSH-POPされる
;		よって、割り込み終了後、元の設定値に戻る
;
INT
;
INTOUT
;
			retfie				;




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			PIC16F1823　イニシャライズ
;
;		OSCCON(BANK1　099H) マニュアル69ページ
;			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）　マニュアル126ページ
;			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）　マニュアル130ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RC5-4	デジタルI/O
;			bit3	RC3-0	デジタルI/O、アナログ入力
;
;		TRISA(BANK1　08CH)　マニュアル126ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-4	1=入力、0=出力
;			bit3	RA3		常に1
;			bit2	RA2-0	1=入力、0=出力
;
;		TRISC(BANK1　08EH)　マニュアル130ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-0	1=入力、0=出力
;
;		LATA(BANK2　10CH)　データラッチﾚｼﾞｽﾀ　マニュアル127ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-4	出力データ保持
;			bit3	Unimplemented(read=0)
;			bit2	RA2-0	出力データ保持
;			（このラッチデータはTRISAレジスタ設定で各ピンに反映される）
;
;		LATC(BANK2　10EH)　データラッチﾚｼﾞｽﾀ　マニュアル130ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-0	RA5-4	出力データ保持
;			（このラッチデータはTRISCレジスタ設定で各ピンに反映される）
;
;
;		ANSELA(BANK3　18CH)　マニュアル127ページ
;			bit7-5	Unimplemented(read=0)
;			bit4	ANSA3/RA4	アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			bit3	Unimplemented(read=0)
;			bit2-0	ANA2-0/RA2-0アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			＊デフォルトでは、すべて1(アナログ入力)となっている
;
;		ANSELC(BANK3　18EH)　マニュアル131ページ
;			bit7-4	Unimplemented(read=0)
;			bit3-0	ANSC3-0/RC3-0　アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			＊デフォルトではアナログ入力となっている
;
;		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=PORTC各ビットプルアップ有効
;					 _____	0=PORTC各ビットプルアップ無効
;					*WPUENビットが有効の時のみ、設定有効となる。
;
;
;		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モジュール
;
;
;		OPTION_REG(BANK1　095H)　マニュアル177ページ
;					_____
;			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
;
;   SSP1CON1    SSP制御レジスタ１   BSR=4
;       bit7    WCOL：書込みコリジョン検出ビット
;               マスタの場合
;               1=I2Cの送信開始条件が無効の時にSSP1BUFレジスタへ書込みが行われた
;               0=問題無
;               スレーブの場合
;               1=前のワードの送信中にSSP1BUFレジスタへの書き込みが行われた
;               0=問題無
;                   *ソフトウエアでクリアする必要あり
;       bit6    SSP1OV：受信オーバーフロー インジケータービット(注1)
;               1=オーバーフロー発生
;               2=問題無
;                   *ソフトウエアでクリアする必要あり
;       bit5    SSP1EN：同期シリアルポートイネーブルビット
;               1=シリアルポート有効(注2)
;               0=シリアルポート無効、I/Oポート使用可
;       bit4    CKP：クロック極性選択ビット
;               1=クロックを有効化
;               0=クロックをLOWに保持（クロックストレッチ）
;                   *マスタモードでは使用しない
;       bit3-0  SSP1M：同期シリアルポート モード選択ビット
;               0110=スレーブモード、7ビットアドレス
;               0111=スレーブモード、10ビットアドレス
;               1000=マスターモード、クロック=FOSC/(4*SP1ADD+1))(注3)
;               1011=ファームウエア制御のマスターモード（スレーブアイドル）
;               1110=スレーブモード、7ビットアドレス、
;                    スタートビットとストップビットの割込み有効
;               1111=スレーブモード、10ビットアドレス、
;                    スタートビットとストップビットの割込み有効
;
;       注1)マスターモードの場合、新たな送受信はSSP1BUFへの書込みによって
;       　　開始するため、オーバーフロービットはセットされない
;       注2)SDAピンとSCLピンは入力としてTRIS設定
;       注3)SP1ADDの値、0,1,2はサポートされない
;
;   SSP1CON2    SSP制御レジスタ２
;       bit7    GCEN：ジェネラルコールイネーブルビット
;               1=SSP1SRでGCアドレス(00H)を受信した時の割込みを有効にする
;               0=GCアドレスを無効にする
;       bit6    ACKSTAT：肯定応答(ACK)ステータスビット
;               1=ACK受信した
;               0=ACK受信していない
;       bit5    ACKDT：ACKデータビット（受信モード）
;               1=ACKしない
;               0=ACKあり
;       bit4    ACKEN：ACKシーケンス イネーブルビット（マスタ受信モード）（注1）
;               1=ACKシーケンスを開始し、ACKDTビットを送信する
;               0=ACKシーケンスをアイドルにする
;       bit3    RCEN：受信イネーブルビット（マスターモードのみ）（注1）
;               1=受信モードを有効にする
;               0=受信をアイドルにする
;       bit2    PEN：ストップ条件イネーブルビット（注1）
;               SCK解放制御
;               1=ストップ条件を開始する、ハードウエアによって自動でクリアされる
;               0=ストップ条件をアイドルにする
;       bit1    RSEN：反復スタート条件イネーブルビット（注1）
;               1=反復スタート条件を開始する
;               　ハードウエアによって自動でクリアされる
;               0=反復スタート条件をアイドルにする
;       bit0    SEN：スタート条件イネーブルビット（注1）
;               マスターモードの場合
;               1=スタート条件を開始する、ハードウエアによって自動でクリアされる
;               0=スタート条件をアイドルにする
;
;       注1）I2Cモジュールがアイドルで無い場合、これらのビットはセットされず、
;            SSP1BUFに書き込まれない場合がある（SSP1BUFへの書込み無効）
;
;   SSP1CON3    SSP1制御レジスタ３
;       bit7    ACKTIM：肯定応答(ACK)タイムステータスビット（注1）
;               1=ACKシーケンスを実行中。
;               　SCLクロックの8番目の立下りエッジでセットされる
;               0=ACKシーケンスではない。
;               　SCLクロックの9番目の立上がりエッジでクリアされる
;       bit6    PCIE：ストップ条件割込みイネーブルビット
;               1=ストップ条件検出時の割込みを有効にする
;               0=ストップ条件検出時の割込みを無効にする
;       bit5    SCIE：スタート条件割込みイネーブルビット
;               1=スタート／リスタート条件検出時の割込みを有効にする
;               0=スタート条件検出時の割込みを無効にする
;       bit4    BOEN：バッファ上書きイネーブルビット
;               1=SSP1BUFは更新され、受信したアドレス／データバイトに対して
;               　ACK信号が生成される。
;               　BFビットが0の場合のみSSP1OVビットの状態を無視する。
;               0=SSP1OVがクリアされている時のみSSP1BUFが更新される
;               *マスタモードの場合、このビットは無視される
;       bit3    SDAHT：SDAホールド時間の選択ビット
;               1=SDAのホールド時間はSCLの立下りエッジから最小300ns
;               0=SDAのホールド時間はSCLの立下りエッジから最小100ns
;       bit2    SBCDE：スレーブモードのバスコリジョン検出イネーブルビット
;               1=スレーブバスコリジョン割込みを有効にする
;               0=スレーブバスコリジョン割込みを無効にする
;       bit1    AHEN：アドレスホールドイネーブルビット（スレーブモードのみ）
;               1=一致受信アドレスバイトのSCLの8番目の立下りエッジ後、SSP1CON1
;               　レジスタのCKPビットをクリアし、SCLがLOWに保持される
;               0=アドレスホールド機能を無効にする
;       bit0    DHEN：データホールドイネーブルビット（スレーブモードのみ）
;               1=受信データバイトのSCLの8番目の立下りエッジ後、スレーブハードウ
;               エアがSSP1CON1レジスタのCKPビットをクリアし、SCLがLOWに保持される
;               0=データホールド機能を無効にする
;       *注1）ACKTIMステータスビットがアクティブになるのは、AHENビットまたは、
;             DHENビットがセットされている場合のみ
;
;   SSP1MSK     SSP1マスクレジスタ
;       bit7-1  MSK：マスクビット
;               1=受信アドレスbitnをSSP1ADD(n)と比較して、I2Cアドレス一致を検出
;               0=受信アドレスbitnをI2Cアレス一致の検出に使わない
;       bit0    I2Cスレーブモードのマスクビット、10ビットアドレス
;               I2Cスレーブモード、10ビットアドレス（SSP1M3-0=0111または1111)
;               1=受信アドレスbit0をSSP1ADD(0)と比較して、I2Cアドレス一致を検出
;               0=受信アドレスbit0をI2Cアレス一致の検出に使わない
;               *スレーブモード、7ビットアドレスでは、このビットは無視される
;
;   SSP1ADD     MSSP1アドレス／ボーレートジェネレータ
;               マスターモードの場合
;       bit7-0  ADD：ボーレートクロック分周ビット（(ADD(7-0)+1)*4）/FOSC
;               スレーブモードの場合
;       bit7-1  ADD：7ビットのアドレス
;       bit0    未使用
;           *10ビットアドレスモードでの状態は割愛します
;
;   SSP1STAT    SSP1ステータスレジスタ
;       bit7    SMP：スルーレート制御
;               1=スルーレート制御の標準速度モード(100KHZ,1MHZ)を無効にする
;               0=スルーレート制御の高速モード(100KHZ)を有効にする
;       bit6    CKE：SMBus仕様互換入力
;               1=しきい値がSMBus仕様に準拠する入力
;               0=無効
;       bit5    D_NOT_A：データ/アドレスビット
;               1=最後に送受信したバイトがデータ
;               0=最後に送受信したバイトがアドレス
;       bit4    P：ストップビット
;               1=最後にストップビットが検出された事を示す
;               0=最後にストップビットが検出されなかった事を示す
;       bit3    S：スタートビット
;               1=最後にスタートビットが検出された事を示す
;               0=最後にスタートビットが検出されなかった事を示す
;       bit2    R_NOT_W：READ/WRITEビット情報
;               スレーブモード
;               1=読み出し
;               0=書込み
;               マスタモード
;               1=送信動作中
;               0=送信動作中で無い
;       *このビットとSEN,RSEN,PEN,RCEN,ACKENのどれかをORするとMSSP1がアイドル中
;        かどうかが判る
;       bit1    UA：交信アドレスビット（10ビットアドレスモードのみ）
;               1=アドレスの更新が必要
;               0=アドレスの更新が不要
;       bit0    BF：バッファフル ステータスビット
;               受信
;               1=受信が完了、SSP1BUFがフルである
;               0=受信が完了していない、SSP1BUFがエンプティ
;               送信
;               1=データ送信中(ACK及びｽﾄｯﾌﾟﾋﾞｯﾄを含まない)SSP1BUFはフル
;               0=データ送信完了(ACK及びｽﾄｯﾌﾟﾋﾞｯﾄを含まない)SSP1BUFはエンプティ
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

init
;			各レジスタ初期設定(PIC16F1823)
			movlb	0h			;BANK0
			movlw	000h		;00000000B
			movwf	INTCON		;全割込みOFF

;			システムクロック設定
			movlb	01h			;BANK１
			movlw	0f0h		;1111000B
			movwf	OSCCON		;内部発振器は8MHZに設定
								;4xPLL=ON

;			I/Oポート設定 (TRIS→BANK1、LAT→BANK2、ANSEL→BANK3)
			movlb	0h			;BANK0
			clrf	PORTA		;Init PORT
			clrf	PORTC
			movlb   02h         ;BANK2
			clrf    LATA
			clrf    LATC
			movlb	03h			;BANK3
			clrf	ANSELA		;RA0-5=デジタル
			clrf	ANSELC      ;RC0-5=デジタル
			movlb	01h			;BANK1
			movlw	0fh			;00001111B
			movwf	TRISA		;RA0-3入力、RA4-5出力
            movlw	03fh		;00111111B
            movwf	TRISC       ;RC0-5入力

			;TMR0およびプルアップ(BANK1)
			movlb	01h			;BANK1
			movlw	083H		;10000011b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース内部（Fosc/4）
								;TMR0カウントエッジ↓
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/16にセット

;			10ビットADC(BANK1)
;			movlw	020h		;0010000B
;			movwf	ADCON1		;左詰め、基準電圧VDD
								;ADCクロック　Fosc/32=1us(32MHZ)

;			FVR(BANK2)
;			movlb	02h			;BANK2
;			movlw	088h		;10001000B
;			movwf	FVRCON		;FVRイネーブル
								;DACとCPSに2.048V
								;ADCにはOFF

;			初期設定終了
			clrf	BSR
coldst
			call	wait1s		;モジュール安定化待ち
			call	MSSP_MAS	;MSSP1起動、I2Cアイドル
			call	INIT_LCD	;LCDモジュール初期化
;			goto	DEBUG02		;温度演算デバッグ
			call	INIT_HDC	;温湿度センサ初期化
;			goto	DEBUG01		;LCD動作チェック


;			計測データ表示
mloop
;
			movlw	LOW MSG01	;MSG01間接アドレス値下位8ビット
			movwf	MSAD0
			movlw	HIGH MSG01	;MDG01間接アドレス値上位8ビット
			movwf	MSAD1
			call	CLRLCD		;LCD画面全クリア
			call	PUTL1		;"TMP "
;
			call	MEAS_TH		;計測データ取得
			movf	TMP_L,W
			movwf	hex0
			movf	TMP_H,W
			movwf	hex1
			clrf	hex2
			clrf	hex3
			clrf	hexw0
			clrf	hexw1
			clrf	hexw2
			clrf	hexw3
			call	MLT32_X165
			call	DIV32_X256
;
			movlw	0d8h		;28Hの2の補数
			movwf	hexw1
			clrf	hexw0
			call	ADD16B		;hex(0-1)=hex(0-1)-2800H
;			補数変換
			btfss	hex1,7		;bit7=1ならば、負の数
			bra		posi
nega
			comf	hex0,F
			comf	hex1,F
			movlw	01h
			movwf	hexw0
			clrf	hexw1
			call	ADD16B		;hex(0-1)の2の補数
			movlw	'-'			;マイナス表記
			call	PUTW
			incf	DSP_ADR,F
			goto	mlp02
;
posi
			movlw	' '			;プラス表記だが、SPのみ
			call	PUTW
			incf	DSP_ADR,F
;
mlp02		clrf	hex2
			clrf	hex3
			call	DIV32_X256
			clrf	hex1
			clrf	hex2
			clrf	hex3
;
			call	BCD
			movf	digit12,W	;十進数に変換
			call	NUTOASC		;整数域をASCIIに変換
;
			movf	DBUF1,W
			call	PUTW		;上位桁
			incf	DSP_ADR,F
			movf	DBUF0,W		;下位桁
			call	PUTW
			incf	DSP_ADR,F
;
			movlw	"."
			call	PUTW
			incf	DSP_ADR,F
;
			movf	hexd,W		;小数域
			call	DECM_8
			call	NUTOASC
			movf	DBUF1,W
			call	PUTW		;小数点1位
			incf	DSP_ADR,F
			movf	DBUF0,W		;小数点2位
			call	PUTW
			incf	DSP_ADR,F
;
			movlw	" "
			call	PUTW		;
			incf	DSP_ADR,F
			movlw	0dfh		;
			call	PUTW
			incf	DSP_ADR,F
			movlw	"C"
			call	PUTW
			incf	DSP_ADR,F
;
;			湿度表示
			movlw	LOW MSG02
			movwf	MSAD0
			movlw	HIGH MSG02
			movwf	MSAD1
			call	PUTL2		;"HUM "
;
			movf	HUM_L,W
			movwf	hex0
			movf	HUM_H,W
			movwf	hex1
			clrf	hex2
			clrf	hex3
			clrf	hexw0
			clrf	hexw1
			clrf	hexw2
			clrf	hexw3
			call	MLT32_X10
			call	MLT32_X10
			call	DIV32_X65K
;
			call	BCD
			movf	digit12,W	;十進数に変換
			call	NUTOASC		;整数域をASCIIに変換
			incf	DSP_ADR,F
			movf	DBUF1,W
			call	PUTW		;上位桁
			incf	DSP_ADR,F
			movf	DBUF0,W		;下位桁
			call	PUTW
			incf	DSP_ADR,F
;
			movlw	"."
			call	PUTW
			incf	DSP_ADR,F
;
			movf	hexd,W		;小数域
			call	DECM_8
			call	NUTOASC
			movf	DBUF1,W
			call	PUTW		;小数点1位
			incf	DSP_ADR,F
			movf	DBUF0,W		;小数点2位
			call	PUTW
			incf	DSP_ADR,F
;
			movlw	" "
			call	PUTW		;
			incf	DSP_ADR,F
			movlw	"%"
			call	PUTW
			incf	DSP_ADR,F
;
			call	wait1s
			goto	mloop

MSG01		DT		"TMP "
			DW		0			;エンドコード
MSG02		DT		"HUM "
			DW		0
MSG03		DT		"temperature &"
			DW		0			;エンドコード
MSG04		DT		"humidity"
			DW		0			;エンドコード
MSG05		DT		"measuring system"
			DW		0			;エンドコード
MSG06		DT		"hygrothermograph"
			DW		0			;エンドコード
MSG07		DT		"J A 0 Q O N"
			DW		0


;			デバッグ２　温度センサ用演算デバッグプログラム
;	TMP=DATA*165/65536-40
;
;		摂氏マイナス領域からプラス領域まで、
;		仮想取得値を変化させる。
;		それを演算処理してLCDに表示
;		
DEBUG02
			movlw	00h
			movwf	DATA0
			movlw	01Fh		;初期値DATA=1F00H
			movwf	DATA1
			clrf	hexw0
			clrf	hexw1
			clrf	hexw2
			clrf	hexw3

dbg01
			call	wait100m
			call	wait100m
			call	wait100m
			call	wait100m
			call	wait100m
			call	CLRLCD
			movlw	080h
			movwf	DSP_ADR
			movlw	"T"
			call	PUTW
			incf	DSP_ADR,F
			movlw	"M"
			call	PUTW
			incf	DSP_ADR,F
			movlw	"P"
			call	PUTW
			incf	DSP_ADR,F
			movlw	" "
			call	PUTW		;PRINT "TMP "
			incf	DSP_ADR,F
;
			movf	DATA0,W
			movwf	hex0
			movf	DATA1,W
			movwf	hex1
			clrf	hex2
			clrf	hex3		;
			call	MLT32_X165
			call	DIV32_X256
;
;			movlw	0d8h		;28Hの2の補数
;			movwf	hexw1
			clrf	SIGN		;正負符号bit1=1でマイナス、0でプラス
			movlw	028h		;40
			movwf	hexw1
			comf	hexw1,F
			incf	hexw1,F		;D8H=-40
			clrf	hexw0
			call	ADD16B		;hex(0-1)=hex(0-1)-2800H
;			補数変換
			btfss	hex1,7		;bit7=1ならば、負の数
			bra		norm
subzero
			comf	hex0,F
			comf	hex1,F
			movlw	01h
			movwf	hexw0
			clrf	hexw1
			call	ADD16B
			bsf		SIGN,0
;			movf	SIGN,W
;			iorlw	0h
;			btfsc	STATUS,Z
;			goto	dbg02
			movlw	'-'			;マイナス表記
			call	PUTW
			incf	DSP_ADR,F
			goto	dbg02
;
norm
			movlw	' '			;プラス表記だが、SPのみ
			call	PUTW
			incf	DSP_ADR,F
;
dbg02		clrf	hex2
			clrf	hex3
			call	DIV32_X256
			clrf	hex1
			clrf	hex2
			clrf	hex3
;
			call	BCD
			movf	digit12,W	;十進数に変換
			call	NUTOASC		;整数域をASCIIに変換
;
			movf	DBUF1,W
			call	PUTW		;上位桁
			incf	DSP_ADR,F
			movf	DBUF0,W		;下位桁
			call	PUTW
			incf	DSP_ADR,F
;
			movlw	"."
			call	PUTW
			incf	DSP_ADR,F
;
			movf	hexd,W		;小数域
			call	DECM_8
			call	NUTOASC
			movf	DBUF1,W
			call	PUTW		;小数点1位
			incf	DSP_ADR,F
			movf	DBUF0,W		;小数点2位
			call	PUTW
			incf	DSP_ADR,F
;
			movlw	0dfh		;
			call	PUTW
			incf	DSP_ADR,F
;
			movlw	"C"
			call	PUTW
			incf	DSP_ADR,F
;			DATA変更
			movf	DATA0,W
			movwf	hex0
			movf	DATA1,W
			movwf	hex1
			movlw	01h
			movwf	hexw0
			clrf	hexw1
			call	ADD16B
			movf	hex0,W
			movwf	DATA0
			movf	hex1,W
			movwf	DATA1
			movlw	00h
			movwf	hexw0
			movlw	0f0h
			movwf	hexw1
			call	SUB16B		;ボローでW=1
			iorlw	0h
			btfss	STATUS,Z
			goto	dbg01		;
			goto	DEBUG02		;データリセット


;			デバッグ１　ＬＣＤアクセス
DEBUG01
			movlw	LOW MSG03	;MSG01間接アドレス値下位8ビット
			movwf	MSAD0
			movlw	HIGH MSG03	;MDG01間接アドレス値上位8ビット
			movwf	MSAD1
			call	CLRLCD		;LCD画面全クリア
			call	PUTL1		;LCD1行目にMSG01の内容を連続書込み
			call	wait1s
			movlw	LOW MSG04
			movwf	MSAD0
			movlw	HIGH MSG04
			movwf	MSAD1
			call	PUTL2		;LCD2行目に連続書込み
			call	wait1s
			call	wait1s

			movlw	LOW MSG05
			movwf	MSAD0
			movlw	HIGH MSG05
			movwf	MSAD1
			call	CLRLCD
			call	PUTL1
			call	wait1s
			movlw	LOW MSG07
			movwf	MSAD0
			movlw	HIGH MSG07
			movwf	MSAD1
			call	PUTL2
			call	wait1s
			call	wait1s
			goto	DEBUG01

;
;		温湿度センサＨＤＣ１０００　初期設定
;
;	Pointer		Resister Name
;	00H			Temperature
;	01H			Humidity
;	02H			Configuration
;
;	Configurationレジスタ（アドレスポインタ ０２Ｈ）
;		bit15		RST			ソフトウエアリセット
;					1=リセット
;					0=ノーマル動作
;		bit14-13	Reserved	ゼロにセットする事
;		bit12		MODE		計測方法
;					1=温度・湿度の順で32bitで取込み
;					0=温度・湿度、別個に16bitずつ取込み※
;					※Pointer Byteで指定
;		bit11		BTST		電源状態
;					1=2.8V以上（Read only）
;					0=2.8V未満（Read only)
;		bit10		TRES		温度分解能指定
;					1=11bit分解能
;					0=14bit分解能
;		bit9-8		HRES		湿度分解能指定
;					10=8bit分解能
;					01=11bit分解能
;					00=14bit分解能
;		bit7-0		Reserved	ゼロにセット
;


INIT_HDC	bsf		PORTA,4		;LED-Green ON
			call	STARTCON	;スタートコンディション送信
			movlw	080h		;HDC1000 I2Cアドレス+WRITE
			call	SEND_BYTE	;アドレス送信
;			CONFIG値送信
			movlw	02h			;ポインタアドレス 02H=CONFIG
			call	SEND_BYTE	;コントロールバイト送信
			movlw	010h		;CONFIG_COMMAND上位8bit、32bit連続送信
			call	SEND_BYTE   ;データバイト送信
			movlw	00h			;下位8bit
			call	SEND_BYTE	;CONFIG
			call	STOPCON
			bcf		PORTA,4		;LED OFF
			call	wait100m
;
;			計測データ受信
;
;		温度データ	TMP_H	上位8bit
;					TMP_L	下位8bit
;		湿度データ	HUM_H	上位8bit
;					HUM_L	下位8bit
;
MEAS_TH
			bsf		PORTA,4		;LED_ON
			call	STARTCON	;スタートコンディション送信
			movlw	080h		;HDC1000 I2Cアドレス+WRITE
			call	SEND_BYTE	;アドレス送信
			movlw	00h			;ポインタアドレス 00H=TEMP
			call	SEND_BYTE	;コントロールバイト送信
			call	STOPCON
			call	wait10m		;スレーブ計測待ち
			call	wait10m
			call	STARTCON	;スタートコンディション送信
			movlw	081h		;HDC1000 I2Cアドレス+READ
			call	SEND_BYTE   ;アドレス送信
			call	RCV_BYTE	;TMP_H
			movwf	TMP_H
			call	RCV_BYTE	;TMP_L
			movwf	TMP_L
			call	RCV_BYTE	;HUM_H
			movwf	HUM_H
;			call	LAST_RCV	;HUM_L
			call	RCV_BYTE	;HUM_L
			movwf	HUM_L
			call	STOPCON
			bcf		PORTA,4		;LED_OFF
			return


;
;       ＬＣＤ　ＤＩＳＰＬＡＹ　ＡＥ-ＡＱＭ１６０２ＸＡ
;
;       書込みサブルーチン群
;
;       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

;
;	指定のデータをＬＣＤ1行目に先頭から連続書込み
;
;		MSAD0	指定データ格納アドレス下位8ビット
;		MSAD1	指定データ格納アドレス上位7ビット
;
PUTL1
			movlw	080h		;1行目DDRAM先頭アドレス
			movwf	DSP_ADR		;DDRAMアドレス
			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	PUTW		;コマンドワード送信（W=DATA、DSP_ADR=CMD）
			incf	FSR0L,F
			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アドレス
			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	PUTW		;コマンドワード送信（W=DATA、DSP_ADR=CMD）
			incf	FSR0L,F
			incf	DSP_ADR,F
			movlw	0d0h		;データアドレス オーバー
			xorwf	DSP_ADR,W
			btfss	STATUS,Z
			bra		PTL21
PTL22		return				;


;
;	Ｗｒｅｇのキャラクタデータをチェック
;	ヌルデータはスペース(20H)に置き換える
;
CKCW
			iorlw	0h
			btfsc	STATUS,Z
			retlw	020h
			return
;
;		ＬＣＤ画面オールクリア
;
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    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



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	ＰＩＣ１６Ｆ１ｘ ＭＳＳＰモジュール
;	Ｉ２Ｃマスターモード制御サブルーチン群
;
;									Ver0.2 JA0QON
;		履歴
;		マスタ送信のみ		Ver0.1
;		マスタ受信追加		Ver0.2
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;
;   I2C　マスタモード初期化サブルーチン
;
;       RC0     SCL         I2Cクロック
;       RC1     SDA         I2Cデータ
;
MSSP_MAS
			movlb	04h
			movlw	028h        ;28H=00101000
			movwf	SSP1CON1    ;SSP1ﾏｽﾀｰﾓｰﾄﾞ ｲﾈｰﾌﾞﾙ
			movlw	04fh
			movwf	SSP1ADD		;100KHZボーレート
			clrf	BSR
            call	MSSP_IDLE	;
			return

;
;		MSSPアイドル待ち
;
;   R/WとSEN,RSEN,PEN,RCEN,ACKENのどれかとＯＲ演算すると
;   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をクリア
			bsf		PORTA,5
            return

;
;		MSSP反復スタート
;
RESTART
            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
;
;   最終バイト受信
;
LAST_RCV
            movlb   04h
            bsf SSP1CON2,RCEN   ;受信許可
            btfsc   SSP1CON2,RCEN
            bra     $-1         ;受信終了待ち
            bsf SSP1CON2,ACKDT  ;NACKにセット
            bsf SSP1CON2,ACKEN
            btfsc   SSP1CON2,ACKEN
            bra     $-1
            movf    SSP1BUF,W
            clrf    BSR
            movwf   wrk1
			call    MSSP_IDLE   ;アイドル待ち
            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	;アイドル待ち
			bcf		PORTA,5
			return

;
;		16進8bitバイナリ数値をASCIIコードに変換
;
;		入力	Wreg:00H-FFH
;		出力	DBUF0:下位4bit分のASCIIコード
;			DBUF1:上位4bit分のASCIIコード
NUTOASC
			movwf	LDWR		;Wreg退避
			andlw	0fh
			addlw	030h
			movwf	DBUF0
			;
			swapf	LDWR,W
			andlw	0fh
			addlw	030h
			movwf	DBUF1
			return

;
;		小数2位まで（8bit)演算
;
;		入力		Wreg	除算等によるバイナリ小数8bit
;		出力		Wreg
;				bit7-4	小数第1位の10進数値(0-9)
;				bit3-0	小数第2位の10進数値(0-9)
;

DECM_8
			movwf	DCM0		;pushW
			swapf	DCM0,W		;
			andlw	0fh			;bit7-4=0
			movwf	hex0
			clrf	hex1
			call	MLT16_X10
			call	MLT16_X10
			call	MLT16_X10	;1000倍
			call	DIV16_X16	;1/16
			movf	hex0,W		;上位4bit
			movwf	DCM1
			movf	hex1,W
			movwf	DCM2
;
			movf	DCM0,W
			andlw	0fh
			movwf	hex0
			clrf	hex1
			call	MLT16_X10
			call	MLT16_X10
			call	MLT16_X10	;1000倍
			call	DIV16_X16	;
			call	DIV16_X16	;1/256
			movf	DCM1,W		;上位4bit
			movwf	hexw0
			movf	DCM2,W
			movwf	hexw1
			call	ADD16B
			clrf	hex2
			clrf	hex3
			call	BCD
			movf	digit12,W	;下位4bitの十進数値
			movwf	DCM1		;小数点第2位、第3位
			movf	digit34,W	;上位4bitの十進数値
			movwf	DCM2		;小数点第1位
;			限定的四捨五入処理
			movf	DCM1,W
			andlw	0fh
			sublw	04h			;W=K-W
			btfsc	STATUS,C	;ボローチェック
			goto	DEM81		;四捨五入無
;			小数点2位が4の時だけ3位を四捨五入する
			swapf	DCM1,W
			andlw	0fh
			xorlw	04h			;2位が4かどうかのチェック
			btfss	STATUS,Z
			goto	DEM81		;処理しない
			movlw	010h
			addwf	DCM1,F		;小数点2位を桁上げ
;
DEM81		movlw	0fh
			swapf	DCM1,F
			andwf	DCM1,F		;小数点3位を切り捨て
			swapf	DCM2,W
			andlw	0f0h
			iorwf	DCM1,F		;小数点1位2位を合成
			movf	DCM1,W
			return


;
;		16bitバイナリ1/16
;
;		入出力hex(0-1)
;
DIV16_X16
			bcf		STATUS,C	;/2
			rrf		hex1,F
			rrf		hex0,F
			bcf		STATUS,C	;/4
			rrf		hex1,F
			rrf		hex0,F
			bcf		STATUS,C	;/8
			rrf		hex1,F
			rrf		hex0,F
			bcf		STATUS,C	;/16
			rrf		hex1,F
			rrf		hex0,F
			return

;
;			32ビットバイナリ10倍演算(符号無整数)
;
;		入力	hex(0-3)	32ビット
;		出力	hex(0-3)
;
;		使用ワーク	hexw0-3	4バイト
;

MLT32_X10
;			データ保存
			movf	hex0,W
			movwf	hexw0
			movf	hex1,W
			movwf	hexw1
			movf	hex2,W
			movwf	hexw2
			movf	hex3,W
			movwf	hexw3

;			32ビットデータを8倍
			bcf		STATUS,C	;
			rlf		hex0,F		;2倍を3回実行する
			rlf		hex1,F
			rlf		hex2,F
			rlf		hex3,F
			bcf		STATUS,C	;
			rlf		hex0,F
			rlf		hex1,F
			rlf		hex2,F
			rlf		hex3,F
			bcf		STATUS,C
			rlf		hex0,F
			rlf		hex1,F
			rlf		hex2,F
			rlf		hex3,F

			call	ADD32B		;元データを加算
			call	ADD32B


			btfss	STATUS,C	;オーバーフローか？
			retlw   0h
            retlw   01h

;
;       16ビットバイナリ　10倍演算（符号無整数)
;
;       hex(0-1)=hex(0-1)*10
;		W=0の時、正常終了
;		W=1の時、エラー発生、演算結果は保障されない
;
MLT16_X10
			movf	hex0,W
			movwf	hexw0
			movf	hex1,W
			movwf	hexw1
			bcf		STATUS,C	;Cフラグクリア
			rlf		hex0,F		;左ローテート（下位8ビット×２）
			rlf		hex1,F		;左ローテート（上位8ビット×２）
			bcf		STATUS,C
			rlf		hex0,F		;左ローテート（下位8ビット×２）
			rlf		hex1,F		;左ローテート（上位8ビット×２）
			bcf		STATUS,C
			rlf		hex0,F		;左ローテート（下位8ビット×２）
			rlf		hex1,F		;左ローテート（上位8ビット×２）
			bcf		STATUS,C
			call	ADD16B		;元データを加算
			call	ADD16B
			retlw	01h			;演算オーバーフロー発生
			retlw	0h			;演算正常終了

;
;		32ビット　165倍演算 符号無整数
;
;		hex(0-3)=hex(0-3)×165
;
MLT32_X165
			movf	hex0,W		;hexw(0-3)=hex(0-3)
			movwf	hexw0
			movf	hex1,W
			movwf	hexw1
			movf	hex2,W
			movwf	hexw2
			movf	hex3,W
			movwf	hexw3

			bcf		STATUS,C	;X2
			rlf		hex0,F		;32bitローテート
			rlf		hex1,F
			rlf		hex2,F
			rlf		hex3,F
			bcf		STATUS,C	;X4
			rlf		hex0,F		;32bitローテート
			rlf		hex1,F
			rlf		hex2,F
			rlf		hex3,F
			bcf		STATUS,C	;X8
			rlf		hex0,F		;32bitローテート
			rlf		hex1,F
			rlf		hex2,F
			rlf		hex3,F
			bcf		STATUS,C	;X16
			rlf		hex0,F		;32bitローテート
			rlf		hex1,F
			rlf		hex2,F
			rlf		hex3,F
			bcf		STATUS,C	;X32
			rlf		hex0,F		;32bitローテート
			rlf		hex1,F
			rlf		hex2,F
			rlf		hex3,F
			bcf		STATUS,C	;X64
			rlf		hex0,F		;32bitローテート
			rlf		hex1,F
			rlf		hex2,F
			rlf		hex3,F
			bcf		STATUS,C	;X128
			rlf		hex0,F		;32bitローテート
			rlf		hex1,F
			rlf		hex2,F
			rlf		hex3,F
;
			movlw	025h		;37D
			movwf	wrk0		;加算回数カウンタ
M1651		call	ADD32B
			decfsz	wrk0,F
			bra		M1651
			return
			
;
;			32ビット1/65536除算
;			小数点以下は8bitまで演算、それ以下は破棄
;
;			hex(0-3)+hexd0=hex(0-3)÷65536
;			hex(0-3)	整数部分
;			hexd		小数部分
DIV32_X65K
			bcf		STATUS,C	;/2
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/4
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/8
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/16
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/32
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/64
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/128
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/256
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/512
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/1024
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/2048
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/4096
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/8192
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/16384
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/32768
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/65536
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			return

;
;			32ビット1/256除算
;			小数点以下は8bitまで演算、それ以下は破棄
;
;			hex(0-3)=hex(0-3)÷256
;			hex(0-3)	整数部分
;			hexd		小数部分
DIV32_X256
			bcf		STATUS,C	;/2
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/4
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/8
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/16
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/32
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/64
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/128
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			bcf		STATUS,C	;/256
			rrf		hex3,F		;32bitローテート
			rrf		hex2,F
			rrf		hex1,F
			rrf		hex0,F
			rrf		hexd,F
			return


;			32ビットバイナリ加算(整数符号無）
;
;		事前に(hex0-3)、(hexw0-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=1の場合、演算結果は保障されない
;
;		演算
;		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	01h			;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	01h
;			hex2-hexw2の減算
			movf	hexw2,W
			subwf	hex2,F
			movlw	01h
			btfss	STATUS,C
			subwf	hex3,F
			btfss	STATUS,C
			retlw	01h
;			hex3-hexw3の減算
			movf	hexw3,W
			subwf	hex3,F
			btfss	STATUS,C
			retlw	01h
			retlw	0h

;		16ビットバイナリ加算　ver1.1(バグ修正版)
;		hex(0-1)=hex(0-1)+hexw(0-1)
;		W=0の時、正常終了
;		W=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	01h			;桁上がり発生、加算エラー終了
ad11		movf	hexw1,W		;W=hexw1
			addwf	hex1,F		;hex1=hex1+hexw1
			btfsc	STATUS,C
			retlw	01h			;キャリー発生、加算エラー終了
			retlw	0h			;加算正常終了


;		16ビットバイナリ減算
;		hex(0-1)=hex(0-1)-hexw(0-1)
;		W=0の時、正常終了
;		W=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	01h			;ボロー発生、減算エラー終了

sb11		movf	hexw1,W		;W=hexw1
			subwf	hex1,F		;hex1=hex1-hexw1
			btfss	STATUS,C
			retlw	01h			;ボロー発生、減算エラー終了
			retlw	0h			;減算正常終了


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		４バイトバイナリの10桁BCDへの変換
;		MicroChip社のアプリケーションノートより
;
;		入力		4バイト(32ビット)16進バイナリ
;				hex0
;				hex1
;				hex2
;				hex3
;
;		出力		5バイト(10桁)ＢＣＤ
;				digit12
;				digit34
;				digit56
;				gidit78
;				gidit9A
;
;		使用ワーク
;				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



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン	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

