;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		MAX2719　７セグモジュール動作試験　Ver０．１	ＪＡ０ＱＯＮ
;
;		モジュールをソフトでコントロールしてみる
;		
;		PIC12F1822 32MHZ（内部オシレータ）
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



		LIST	P=PIC12F1822
		INCLUDE	P12F1822.INC

;		
;CONFIGURATION WORD 1(ADDRESS:8007H)マニュアル50ページ
;					設定
;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  0  0  0  0  0  0  0  0  0  0  1  1
;
;
	__CONFIG _CONFIG2,	B'0001000000000011'

;	PIC16F688からの重要変更点
;
;	STATUSレジスタの各フラグビット（マニュアルP24)
;
;bit7-5					unimplemented
;			__
;bit4		TO			タイムアウトビット
;						1=電源起動後、CLRWDT命令実行後、SLEEP命令実行後
;			__			0=WDTタイムアウト発生
;bit3		PD			パワーダウンビット
;						1=電源起動後、CLRW命令実行後
;						0=SLEEP命令実行
;bit2		Z			ゼロビット
;						1=演算結果がゼロ
;						0=演算結果がゼロ以外
;						          ____________
;bit1		DC			Ｄｉｇｉｔ Carry/Digit Borrow
;						1=キャリー発生、ボロー無
;						0=キャリー無、ボロー発生
;						　　　　　　______
;bit0		C			Carry/Borrow
;						1=キャリー発生、ボロー無
;						0=キャリー無、ボロー発生
;
;	SFRレジスタ アクセス方法
;
;	BSRレジスタ　xx08h
;	このレジスタの0-4ビットにバンクアドレス(0-1Fh)をセット
;	これが直接アドレッシングの7-11ビット(0-31バンク）に相当する
;	直接アドレッシングの下位0-6ビット(0-7Fh)はオペコードで指定
;
;
;	PORTへの入出力
;
;	PORT入出力方法は基本的には変わりません。
;	TRISA(C)で機能指定
;	PORTA(C)で入出力
;	以上で問題ありません。
;	しかし、PIC12F1822（16F1823)ではLATA(C)レジスタが見えるようになりました。
;	書き込み方法は2種類となり、どちらも結果は、ほぼ同じです。
;	PORTAへ書き込む
;	LATAへ書き込む
;
;	PORTの読込
;	PORTAからの読込はPORTピンの状態を表現しています。
;	LATAからの読込はその時点でのPORTピンの状態を表現してはいません。
;	PORTA(C)とLATA(C)との詳細な違いはマニュアルを読んでください。


;		ワークエリア定義（PIC12F1822,PIC16F1823)
;
;		BANK0	20H-6FH	GPレジスタ　80バイト
;				70H-7FH	comRAM　16バイト
;				AOH-BFH	GPレジスタ　16バイト
;
;		使用していないのもあります
;

hex0		equ		020h		;取得HEXバイナリデータ
hex1		equ		021h
hex2		equ		022h
hex3		equ		023h
digit12		equ		024h		;BCDデータワーク1,2桁
digit34		equ		025h		;BCDデータワーク3,4桁
digit56		equ		026h		;BCDデータワーク5,6桁
digit78		equ		027h		;BCDデータワーク7,8桁
digit9A		equ		028h		;BCDデータワーク9,10桁
colum		equ		029h		;現在の桁位置
cnt0		equ		02ah		;ウエイト用ワーク
cnt1		equ		02bh
cnt2		equ		02ch
cnt3		equ		02dh
tmp0		equ		02eh		;雑用ワーク
tmp1		equ		02fh
bcdw0		equ		030h		;BCD補正処理ワーク
bcdw1		equ		031h
cary1		equ		032h
cary2		equ		033h
cary3		equ		034h
shift		equ		035h		;シリアルデータ受信カウンタ
wrk0		equ		036h
wrk1		equ		037h
bsyc0		equ		038h
bsyc1		equ		039h
hexw0		equ		03ah		;16進バイナリ保存用
hexw1		equ		03bh
hexw2		equ		03ch
hexw3		equ		03dh
flg			equ		03eh		;エラー＆設定フラグ
colw0		equ		03fh		;桁位置処理ワーク
colw1		equ		040h		;
segw0		equ		041h		;
hexb0		equ		042h		;カウントデータ受信バッファ
hexb1		equ		043h
hexb2		equ		044h
hexb3		equ		045h
flgb		equ		046h		;制御フラグ受信バッファ
bitc		equ		047h		;受信ビットカウンタ
icnt0		equ		048h		;割込み内ウエイト用
icnt1		equ		049h		;割込み内ウエイト用
blk			equ		04ah		;ゼロブランキング制御フラグ
;
mode		equ		04bh		;実行モード設定
TMC			equ		04ch		;タイマオーバーフローカウンタ
DCO			equ		04fh		;DAC逐次設定データ
IDC			equ		050h		;
FRQ0		equ		051h		;周波数設定データ
FRQ1		equ		052h
CMD0		equ		053h		;コマンドパケット下位8ビット
CMD1		equ		054h		;コマンドパケット上位8ビット

;
DBUF0		equ		070h		;データ編集用バッファ
DBUF1		equ		071h
DBUF2		equ		072h
DBUF3		equ		073h
DBUF4		equ		074h
DBUF5		equ		075h
DBUF6		equ		076h
DBUF7		equ		077h
;
			ORG		0h
			goto	init
			ORG		04h
			goto	init

			org		05h
			


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			PIC16F1822　イニシャライズ
;
;		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
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



init
;			各レジスタ初期設定

			;クロック設定
			movlb	01h			;BANK１に切替
			movlw	0f0h		;1111000B
			movwf	OSCCON		;内部発振器は8MHZに設定
								;4xPLL=ON
			;I/Oポート初期化
			movlb	0h			;BANK0
			clrf	PORTA		;Init PORT
			movlb	02h			;BANK2
			clrf	LATA		;出力ラッチﾚｼﾞｽﾀ
			movlb	03h			;BANK3
			movlw	0h			;00000000B
			movwf	ANSELA		;RA,アナログ無
								;RA0-5,デジタルI/O
			movlb	01h			;BANK1
			movlw	08h			;00001000B
			movwf	TRISA		;RA0-2,4,5出力
								;RA3入力
			movlb	0h			;BANK0


			;TMR0およびプルアップ設定
;			movlb	01h			;BANK1
;			movlw	090H		;10010000b
;			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース内部（Fosc/4）
								;TMR0カウントエッジ↑
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/2にセット

			;ADC
;			movlb	01h			;BANK1
;			movlw	030h		;0011000B
;			movwf	ADCON1		;左詰め、基準電圧VDD
								;ADCクロック　Fosc/64=2us(32MHZ)

;			FSR0アドレスをDBUF0アドレスに設定
;			movlw	070h
;			movwf	FSR0L
;			clrf	FSR0H
;
;
;			MAX2719コマンド一覧
;
;	Bモード（デコード有）アドレッシング
;		上位	下位（D15-D0の16ビット)
;		x0H	xxH		NOP
;		x1H	00H-07H	0桁0-9表示（ドット無）
;		x1H	80H-87H	0桁0-9表示（ドット有）
;		x1H	*0H-*7H	*bit7=1でドット有、bit4-6は何でもいい
;		x1H	F0H-F7H	0桁0-9表示（ドット有）
;
;		x2H	**H-**H	1桁、下位7ビットは上記と同じ
;		x3H	**H-**H	2桁、下位7ビットは上記と同じ
;		x4H	**H-**H	4桁、下位7ビットは上記と同じ
;		x5H	**H-**H	5桁、下位7ビットは上記と同じ
;		x6H	**H-**H	6桁、下位7ビットは上記と同じ
;		x7H	**H-**H	7桁、下位7ビットは上記と同じ
;		x8H	**H-**H	8桁、下位7ビットは上記と同じ
;
;	機能設定
;		x9H	**H		デコードモードレジスタ設定
;			00H		7-0桁デコード無(初期設定値)
;			01H		0桁デコード有、7-1桁デコード無
;		xAH	**H		輝度レジスタ設定
;			x0H		1/32(初期設定値)
;			x1H		3/32
;			x2H		5/32
;			x3H		7/32
;			x4H		9/32
;			x5H		11/32
;			x6H		13/32
;			x7H		15/32
;			x8H		17/32
;			x9H		19/32
;			xAH		21/32
;			xBH		23/32
;			xCH		25/32
;			xDH		27/32
;			xEH		29/32
;			xFH		31/32
;
;		xBH	**H		スキャンリミットレジスタ設定（注1）
;			x0H		0桁目のみ(初期設定値)
;			x1H		0&1桁
;			x2H		012桁
;			x3H		0123桁
;			x4H		01234桁
;			x5H		012345桁
;			x6H		0123456桁
;			x7H		01234567桁
;
;		xCH	**H		シャットダウンレジスタ設定
;			x0H		シャットダウンモード(初期設定値)
;			x1H		ノーマルオペレーションモード
;
;		xFH	**H		ディスプレイテストレジスタ設定
;			x0H		ノーマルオペレーションモード(初期設定値)
;			x1H		ディスプレイテストモード
;
;		コードBフォントの使用方法
;		DBUFx　	各桁バッファ データフォーマット（Bモードに適用）
;		bit0-3	表示する十進数値データ	0H-9H→0-9(注2)
;				0AH→-、0BH→E、OCH→H、0DH→L、0EH→P
;				0FH=Blank(注3)
;		bit4	不使用
;		bit5	不使用
;		bit6	不使用
;		bit7　　	ドット表示	0=OFF、1=ON
;
;		注1）基本的に8桁表示設定で使用するのが良いと思われる
;		注2)表示数値データはMAX2719内部でLED表示ビットデータに変換されます
;		注3)ブランク命令はa-gセグメントのみ有効、DPセグメントには適応されない
;
;

;
;		メインループ
;

coldst
			clrf	PORTA
			clrf	flg
			clrf	hex0
			clrf	hex1
			clrf	hex2
			clrf	hex3

;			MAX2719イニシャライズ

			call	wait100m	;MAX2719電源投入安定化待ち
			movlw	0fh			;ディスプレイテストレジスタアドレス
			movwf	CMD1
			movlw	01h
			movwf	CMD0		;テストモード
			call	SEND_CMD
			call	wait1s

			movlw	0fh			;ディスプレイテストレジスタアドレス
			movwf	CMD1
			clrf	CMD0		;ノーマルオペレーション
			call	SEND_CMD

			movlw	0bh			;スキャンレジスタアドレス
			movwf	CMD1
			movlw	07h			;8桁表示セット
			movwf	CMD0
			call	SEND_CMD

			movlw	0ah			;輝度レジスタアドレス
			movwf	CMD1
			movlw	07h			;輝度　15/32
			movwf	CMD0
			call	SEND_CMD

			movlw	09h			;デコードモードレジスタアドレス
			movwf	CMD1
			movlw	0ffh		;8桁Bモード
			movwf	CMD0
			call	SEND_CMD
			call	BRKL		;全表示ブランク

			movlw	0ch			;シャットダウンモードレジスタアドレス
			movwf	CMD1
			movlw	01h			;ノーマルモードへ移行
			movwf	CMD0
			call	SEND_CMD
			call	wait1s		;モード安定化待ちト

main
			call	rxs_data	;データ受信
;			call	DBG_DAT		;デバッグ用データ生成
			call	setmode		;モード設定
			call	bcd			;BCD変換
			call	setbuf		;データ整理
			call	PUTL		;モジュールに送信
;			call	wait100m	;デバッグ用ウェイト
			goto	main

DBG_DAT		;デバッグ用バイナリデータ生成
			movlw	04fh		;flg=01001111B
			movwf	flg			;8桁、ゼロブランキングON
								;4,7桁ドット有
			incf	hex0,F
			btfss	STATUS,Z	;桁上がりか？
			goto	ckerr
			
			incf	hex1,F
			btfss	STATUS,Z
			return
			
			incf	hex2,F
			btfss	STATUS,Z
			return
			
			incf	hex3,F
			btfss	STATUS,Z
			return
			clrf	hex0
			clrf	hex1
			clrf	hex2
			clrf	hex3
			return
ckerr
			movf	hex0,W		;16の倍数時に警告フラグON
			andlw	0fh
			btfsc	STATUS,Z
			bsf		flg,7		;疑似エラー発生
			return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			動作モードセット設定
;
;	入力制御フラグ	flg　この内容は保存される
;	　2桁表示指令	flg=xxxxx001
;	　4桁表示指令	flg=xxxxx011
;	　6桁表示指令	flg=xxxxx101
;	　8桁表示指令	flg=xxxxx111
;	　ゼロブランキング	flg=xxxx0xxx　しない
;				flg=xxxx1xxx　する
;	　ドット表示指令	flg=x000xxxx　表示なし
;					bit4=1	2,5桁点燈
;					bit5=1	3,6桁点燈
;					bit6=1	4,7桁点燈
;	　警告LED		flg=1xxxxxxx　LED点灯する
;				flg=0xxxxxxx　LED点灯しない
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

setmode
			movf	flg,W
			andlw	07h
			iorlw	0h
			btfsc	STATUS,Z
			movlw	07h
			movwf	colum
stmd0		btfss	flg,7		;オーバーフローLED制御
			goto	stmd1
			bsf		PORTA,5		;LED ON
			return

stmd1		bcf		PORTA,5		;LED OFF
			return




;
;		表示データバッファのセッティング
;
;	入力データ		5バイト(10桁分)BCD　この内容は保存される
;				digit12
;				digit34
;				digit56
;				digit78
;				digit9A（表示されない）
;
;	表示桁		colum　この内容は保存される
;	
;	入力制御フラグ	flg　この内容は保存される
;	　2桁表示指令	flg=xxxxx001
;	　4桁表示指令	flg=xxxxx011
;	　6桁表示指令	flg=xxxxx101
;	　8桁表示指令	flg=xxxxx111
;	　ゼロブランキング	flg=xxxx0xxx　
;					bit3=0	しない
;				flg=xxxx1xxx
;					bit3=1	　する
;	　ドット表示指令	flg=x000xxxx　表示なし
;					bit4=1	2,5桁点燈
;					bit5=1	3,6桁点燈
;					bit6=1	4,7桁点燈
;	　警告LED		flg=1xxxxxxx　LED点灯する
;				flg=0xxxxxxx　LED点灯しない
;
;			上位桁から書き込みます
;
;		コードBフォントの使用方法
;		DBUFx　	各桁バッファ データフォーマット（Bモードに適用）
;		bit0-3	表示する十進数値データ	0H-9H→0-9(注1)
;				0AH→-、0BH→E、OCH→H、0DH→L、0EH→P
;				0FH=Blank(注2)
;		bit4	不使用
;		bit5	不使用
;		bit6	不使用
;		bit7　　	ドット表示	0=OFF、1=ON
;		注1)表示数値データはMAX2719内部でLED表示ビットデータに変換されます
;		注2)ブランク命令はa-gセグメントのみ有効、DPセグメントには適応されない
;
;	使用ワーク	bufw0
;

setbuf
;			表示する十進数値データを全バッファに書込み
			swapf	digit78,W
			andlw	0fh			;8桁目のみのデータを抽出
			movwf	DBUF7		;8桁目バッファに抽出データ書込み
								;以下同じ
			movf	digit78,W
			andlw	0fh
			movwf	DBUF6		;7桁目に数値データ書込み
			
			swapf	digit56,W
			andlw	0fh
			movwf	DBUF5		;6桁目に数値データ書込み

			movf	digit56,W
			andlw	0fh
			movwf	DBUF4		;5桁目に数値データ書込み
			
			swapf	digit34,W
			andlw	0fh
			movwf	DBUF3		;4桁目に数値データ書込み

			movf	digit34,W
			andlw	0fh
			movwf	DBUF2		;3桁目に数値データ書込み
			
			swapf	digit12,W
			andlw	0fh
			movwf	DBUF1		;2桁目に数値データ書込み

			movf	digit12,W
			andlw	0fh
			movwf	DBUF0		;1桁目に数値データ書込み

;			その他指定処理を全バッファに行う
;			呼び出し順番によっては上手く機能しなくなるので注意
			call	zbk			;ゼロブランキング処理
			call	spos		;指定表示桁数処理
			call	addot		;ドット表示処理

;			オーバーフローチェック
;			警告LEDを発光させる、7セグ表示は残り8桁分を表示
			movf	digit9A,W	;ここにデータがある場合O.Fとなる
			iorlw	0h
			btfss	STATUS,Z
			goto	sbfer
			bcf		PORTA,5			
			return
sbfer		bsf		PORTA,5		;オーバーフロー発生
			retlw	01h

;
;			ゼロブランキング処理
;
;		入力		DBUFx　（数値データ設定済であること)
;				flg	ビット3　ZBKフラグ
;		使用ワーク	無
;
;		方法		数値データ=0FHとする(CMD0)（注1）
;				その場合、DPセグメントは処理されない
;
;
;		注1）	表示桁数とゼロブランキングについて
;			ゼロブランキング処理にスキャンレジスタ使用はNG
;
;
zbk
			btfss	flg,3		;ZBK命令フラグチェック
			return				;命令無いので終了
			movf	DBUF7,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlw	0fh
			movwf	DBUF7		;ブランキングセット

			movf	DBUF6,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlw	0fh
			movwf	DBUF6		;ブランキングセット

			movf	DBUF5,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlw	0fh
			movwf	DBUF5		;ブランキングセット

			movf	DBUF4,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlw	0fh
			movwf	DBUF4		;ブランキングセット

			movf	DBUF3,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlw	0fh
			movwf	DBUF3		;ブランキングセット

			movf	DBUF2,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlw	0fh
			movwf	DBUF2		;ブランキングセット

			movf	DBUF1,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			movlw	0fh
			movwf	DBUF1		;ブランキングセット

			return				;DBUF0はゼロブランキングしない



;
;			表示桁位置調整サブルーチン
;			データバッファへの準備ルーチンから呼ばれる事を想定
;
;			指定表示桁数になるまでバッファのデータを右シフトする
;			余った左側桁は「0」に書換える
;			はみ出た下位桁は破棄される
;
;		入力		DBUFx	調整処理するデータバッファ
;				colum	設定表示桁数
;		出力		DBUFx	調整処理されたデータバッファ
;		使用ワーク	colw0	桁位置ワーク
;

spos
			movlw	07h
			subwf	colum,W		;バイトシフト回数設定
			btfsc	STATUS,C	;ボローなら処理開始
			return				;表示桁変更無で終了
			movf	colum,W		;バイトシフト回数設定
			sublw	07h			;W=07-W
			movwf	colw0
spos01		;1バイト右シフト
			movf	DBUF1,W		;DB1→DB0
			movwf	DBUF0
			
			movf	DBUF2,W		;DB2→DB1
			movwf	DBUF1
			
			movf	DBUF3,W		;DB3→DB2
			movwf	DBUF2
			
			movf	DBUF4,W		;DB4→DB3
			movwf	DBUF3
			
			movf	DBUF5,W		;DB5→DB4
			movwf	DBUF4
			
			movf	DBUF6,W		;DB6→DB5
			movwf	DBUF5
			
			movf	DBUF7,W		;DB7→DB6
			movwf	DBUF6
			
			movlw	0fh			;
			movwf	DBUF7		;ブランクセット
			
			decf	colw0,F
			btfss	STATUS,Z
			goto	spos01
			retlw	0h


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			ドットを表示するか否かの処理ルーチン
;
;		入力	flg		
;
;		出力	DBUFx,7=0		ドット点燈無
;		出力	DBUFx,7=1		ドット点燈有
;
;		flg
;			ドット表示位置		flg=x111xxxx
;							bit4=1	2,5桁点燈
;							bit5=1	3,6桁点燈
;							bit6=1	4,7桁点燈
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

addot
			bcf		DBUF0,7		;ドット点灯ビットリセット
			bcf		DBUF1,7		;
			bcf		DBUF2,7		;
			bcf		DBUF3,7		;
			bcf		DBUF4,7		;
			bcf		DBUF5,7		;
			bcf		DBUF6,7		;
			bcf		DBUF7,7		;

			;2,5桁点燈指令チェック
			btfss	flg,4		;2,5点燈指令か？
			goto	adt2		;違うので次ビットチェック
			;2桁目点燈処理
			movf	DBUF1,W
			call	ckbrk
			iorlw	0h
			btfsc	STATUS,Z
			bsf		DBUF1,7		;2桁目ドット点燈
			;5桁目点燈処理
			movf	DBUF4,W
			call	ckbrk
			iorlw	0h
			btfsc	STATUS,Z
			bsf		DBUF4,7		;5桁目ドット点燈
			return

adt2		;3,6桁点燈指令チェック
			btfss	flg,5		;3,6点燈指令か？
			goto	adt4		;違うので次ビットチェック
			;3桁目点燈処理
			movf	DBUF2,W
			call	ckbrk
			iorlw	0h
			btfsc	STATUS,Z
			bsf		DBUF2,7		;3桁目ドット点燈
			;6桁目点燈処理
			movf	DBUF5,W
			call	ckbrk
			iorlw	0h
			btfsc	STATUS,Z
			bsf		DBUF5,7		;6桁目ドット点燈
			return

adt4		;4,7桁点燈指令チェック			
			btfss	flg,6		;4,7点燈指令か？
			return				;点灯無終了
			;4桁点燈処理
			movf	DBUF3,W
			call	ckbrk
			iorlw	0h
			btfsc	STATUS,Z
			bsf		DBUF3,7		;4桁目ドット点燈
			;7桁目点燈処理
			movf	DBUF6,W
			call	ckbrk
			iorlw	0h
			btfsc	STATUS,Z
			bsf		DBUF6,7		;7桁目ドット点燈
			return


;
;		ブランキング処理済みかどうかチェック
;
;		入力	WregにDBUFxのデータ
;		出力	W=0、表示有効データあり
;			W=1、ブランク処理済み桁
;

ckbrk		;
			andlw	0fh
			movwf	tmp0
			incf	tmp0,F
			btfss	tmp0,4
			retlw	0h
			retlw	01h


;
;		8桁すべて表示させる
;		表示位置指定はできない
;		表示データは、バッファレジスタDBUFxに事前に準備必要
;
;		入力		DBUF0-DBUF7
;
;		番号は桁番号と一致、例)DBUF7=8桁目（最上位桁）
;
;	Bモード（デコード有）アドレッシング
;		上位	下位（D15-D0の16ビット)
;		x0H	xxH		NOP
;		x1H	00H-07H	0桁0-9表示（ドット無）
;		x1H	80H-87H	0桁0-9表示（ドット有）
;		x1H	*0H-*7H	*bit7=1でドット有、bit4-6は何でもいい
;		x1H	F0H-F7H	0桁0-9表示（ドット有）
;
;		x2H	**H-**H	1桁、下位7ビットは上記と同じ
;		x3H	**H-**H	2桁、下位7ビットは上記と同じ
;		x4H	**H-**H	4桁、下位7ビットは上記と同じ
;		x5H	**H-**H	5桁、下位7ビットは上記と同じ
;		x6H	**H-**H	6桁、下位7ビットは上記と同じ
;		x7H	**H-**H	7桁、下位7ビットは上記と同じ
;		x8H	**H-**H	8桁、下位7ビットは上記と同じ
;


PUTL
			movf	DBUF0,W		;桁データをレジスタに転送
			movwf	CMD0
			movlw	01h
			movwf	CMD1
			call	SEND_CMD

			movf	DBUF1,W
			movwf	CMD0
			incf	CMD1,F
			call	SEND_CMD

			movf	DBUF2,W
			movwf	CMD0
			incf	CMD1,F
			call	SEND_CMD

			movf	DBUF3,W
			movwf	CMD0
			incf	CMD1,F
			call	SEND_CMD

			movf	DBUF4,W
			movwf	CMD0
			incf	CMD1,F
			call	SEND_CMD

			movf	DBUF5,W
			movwf	CMD0
			incf	CMD1,F
			call	SEND_CMD

			movf	DBUF6,W
			movwf	CMD0
			incf	CMD1,F
			call	SEND_CMD

			movf	DBUF7,W
			movwf	CMD0
			incf	CMD1,F
			call	SEND_CMD

			return



;
;		8桁すべてブランク表示とする
;
BRKL
			movlw	0fh			;ブランクコマンド
			movwf	CMD0
			movlw	01h
			movwf	CMD1
			call	SEND_CMD
			incf	CMD1,F
			call	SEND_CMD
			incf	CMD1,F
			call	SEND_CMD
			incf	CMD1,F
			call	SEND_CMD
			incf	CMD1,F
			call	SEND_CMD
			incf	CMD1,F
			call	SEND_CMD
			incf	CMD1,F
			call	SEND_CMD
			incf	CMD1,F
			call	SEND_CMD
			return


;
;		MAX2719　コマンドパケット送出サブルーチン
;
;		事前にCMD0、CMD1に命令コードを入れておくこと
;		CMDxのデータは保存される
;
;		RA0=CLOCK(CLK)
;		RA1=DATA(DIN)
;		RA4=LATCH(LOAD)
;
;		パケット送出シークェンス（１コマンドパケットは１６ビット幅)
;		(１)CLK=0、LOAD=0
;		(2)DINにデータビットをセット（bit15からbit0へ順番にセット)
;		(3)CLK=L→HでDINのデータビットはシフトレジスタにロードされる
;		(4)CLK=H→Lにして、(2)に行く、これを16回繰り返す
;		(5)LOAD=L→Hで16bitのシフトレジスタ内容がラッチされる
;		(6)CLK=0、LOAD=0にして終了
;
;		使用ワーク
;			CMD0	命令コード下位8ビット
;			CMD1	命令コード上位8ビット
;			tmp0	カウントワーク
;			tmp1	コマンドワーク

SEND_CMD
			bcf		PORTA,0		;CLK=0
			nop
			bcf		PORTA,4		;LOAD=0
			movf	CMD1,W
			movwf	tmp1		;上位8ビット送出データ
			call	sendbt
			movf	CMD0,W
			movwf	tmp1		;下位8ビット送出データ
			call	sendbt

;			ラッチパルス送出して終了
			bsf		PORTA,4		;LOAD=1
			call	w01u
			bcf		PORTA,4		;LOAD=0
			call	w01u
			return

sendbt		;シフトレジスタに8ビット分送出、ラッチはしない
			movlw	08h			;8ビット分
			movwf	tmp0		;カウンタ
sbtlp		lslf	tmp1,F		;C=MSB
			btfsc	STATUS,C
			goto	sbt01
			
sbt00		;DATA=0送出
			bcf		PORTA,1		;DIN=0
			call	w01u		;ウエイト1us
			bsf		PORTA,0		;CLK=1
			call	w01u		;ウエイト1us
			bcf		PORTA,0		;CLK=0
			goto	sbten
			
sbt01		;DATA=1送出
			bsf		PORTA,1		;DIN=1
			call	w01u		;ウエイト1us
			bsf		PORTA,0		;CLK=1
			call	w01u		;ウエイト1us
			bcf		PORTA,0		;CLK=0

sbten		;
			decfsz	tmp0,F
			goto	sbtlp		;残ビットチェック
			call	w01u		;ウエイト1us
			return


;
;		Wregの8ビットデータを送信し、ラッチはしない
;
;		これによりMAX2719シフトレジスタの上位8ビットに転送される
;		それまでの上位8ビットデータは下位8ビットにシフトする。
;		旧下位8ビットデータはDOUTから破棄されます。
;		MAX2719は何の反応もしない
;
;		RA0=CLOCK(CLK)
;		RA1=DATA(DIN)
;		RA4=LATCH(LOAD)
;
;		使用変数	wrk0、wrk1
;

PUTW
			movwf	wrk0		;送信8ビットデータ
			movlw	08h			;8ビット分送出カウンタ
			movwf	wrk1		;カウンタ
			bcf		PORTA,0		;CLK=0
			nop
			bcf		PORTA,4		;LOAD=0
ptwlp
			lslf	wrk0,F		;C=LSB
			btfsc	STATUS,C
			goto	ptw01
			
ptw00		;DATA=0送出
			bcf		PORTA,1		;DIN=0
			call	w01u		;ウエイト1usec
			bsf		PORTA,0		;CLK=1
			call	w01u		;ウエイト1usec
			bcf		PORTA,0		;CLK=0
			goto	ptwen
			
ptw01		;DATA=1送出
			bsf		PORTA,1		;DIN=1
			call	w01u		;ウエイト1usec
			bsf		PORTA,0		;CLK=1
			call	w01u		;ウエイト1usec
			bcf		PORTA,0		;CLK=0

ptwen		;
			decfsz	wrk1,F
			goto	ptwlp		;残ビット有
			return


;			ラッチパルス送出
;
;			コールするだけでOK
;			
PTLAT		bsf		PORTA,4		;LOAD=1
			call	w01u
			bcf		PORTA,4		;LOAD=0
			call	w01u
			return



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		４バイトバイナリの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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			シリアルデータ、ハンドシェイク受信サブルーチン(1ビット50usec版)
;
;			適応クロック	32MHZ（インストラクションクロック　8MHZ）
;
;		出力バッファ		hex0	16進バイナリ32ビット
;					hex1
;					hex2
;					hex3
;					flg	制御フラグ8ビット
;		ステータス		W=0	受信成功
;					W=1　送信未準備
;					W=2	受信失敗
;
;
;		データ線		1ビット幅		50us
;					DATA/TX		RA3	データビット受信ポート
;					RX			RA2	受信可信号送信ポート
;
;		使用ワーク	bsyc0,shift
;
;	ハンドシェイク版信号転送フォーマット
;
;	送信側					受信側
;	通常(DATA/TX=H)			DATA/TXポートを監視（TX=L待ち）
;		↓						↓
;	準備OK(TX=L)送信待機		TX=L確認でRX=H送出
;		↓						↓
;	RX=H確認でスタートビット送出		スタートビット確認でデータ本体待ち
;	(DATA=L,50us)
;		↓						↓
;	データビット連続送信(各50us)	データビットを連続受信(各50us)
;		↓						↓
;	ストップビット(DATA=H,50us)	ストップビットを確認(50us)
;		↓						↓
;	通常(DATA/TX=H)			受信終了、RX=Lとする(通常)
;
;	データ送出順序
;	1バイトは上位ビットから送信されます
;	データは5バイトで下記の通りに送信されます
;	hex3→hex2→hex1→hex0→flg	
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


rxs_data
;
;		受信チェック
;
;		RA5ポートDATA線兼TX線(Lにて送信準備OK）
;		RA2ポートRX線制御
;
			btfss	PORTA,3		;TX 受信チェック
			goto	rsst
			retlw	01h			;送信未準備
		
;
;		受信可能ステータス送出
;
;		RA2	RX送出、アクティブH
;		RA3	DATA受信
;
rsst		movlw	028h		;40ビット分
			movwf	shift		;シフトカウンタ
			bsf		PORTA,2		;RX_ON送出、受信準備OK
			call	wait25u
			btfss	PORTA,3		;スタートビット(0)確認
			goto	rsloop		;データ受信開始
			call	wait25u
			bcf		PORTA,2		;RX_OFF　送信
			retlw	02h			;受信失敗
		

;
;		40bitシリアルデータ受信開始
;
;		１ループに付き、50us間隔でデータ取込
;		1cycle=0.125us
;		データ送出順序
;		1バイトは上位ビットから送信されます
;		データは5バイトで下記の通りに送信されます
;		hex3→hex2→hex1→hex0→flg	
;

rsloop
			call	w10u
			call	w10u
			call	w10u
			call	w10u
			call	w05u
			call	w02u
			call	w01u		;48usec
rslp0		rlf		flg,F		;Cフラグを通し次々にビット左シフト
			rlf		hex0,F		;flgからhex3へとデータがシフト
			rlf		hex1,F		;
			rlf		hex2,F
			rlf		hex3,F		;
			bcf		flg,0		;最下位に0をセット
			btfsc	PORTA,3		;入力データを取得
			bsf		flg,0		;最下位に1にセット
								;ここまで8サイクル(1usec)
			nop
			nop
			nop
			nop
			nop					;nopで5サイクル
			decfsz	shift,F		;40ビット受信完了か
			goto	rsloop		;16cyc×0.125=2.0us

			call	wait50u		;
			btfss	PORTA,3		;ストップビット確認
			goto	rslp2
			goto	rslp3

rslp2		call	wait50u
			bcf		PORTA,2		;RX OFF
		
			bsf		PORTA,5		;LED ON
			call	wait100m
			bcf		PORTA,5		;LED OFF
		
			retlw	02h			;受信失敗

rslp3		call	wait50u
			bcf		PORTA,2		;RX OFF
			retlw	0h			;受信完了


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;			Ａ／Ｄ変換サブルーチン
;
;		アナログ入力ポート		RA0/AN0/CH0
;		結果格納方法		ADFM=0/左詰め/ADRESHのみ取得
;		出力データ			hex0（上位8ビット）
;		使用フラグ			flg　ビット1　変更有=1,変更無=0
;
;		ADCON0レジスタ（BANK1　09DH)　マニュアル147ページ
;		bit7	Unimplemented(read=0)
;		bit6-2	CHSx	アナログチャンネル指定
;						00000 = AN0/RA0
;						00001 = AN1/RA1
;						00010 = AN2/RA2
;						00011 = AN3/RA3
;						00100 = AN4/RC0(#1)
;						00101 = AN5/RC1(#1)
;						00110 = AN6/RC2(#1)
;						00111 = AN7/RC3(#1)
;						01000 = Reserved.No channel connected
;						    ・
;						11100 = Reserved.No channel connected
;						11101 = 温度表示器(#4)
;						11110 = DAC出力(#2)
;						11111 = FVRバッファ1出力(#3)
;		bit1	GO/DONE	A/D変換ステータスビット
;						1=変換開始指令（１にすると変換動作開始）
;						0=変換完了(変換完了すると０になる）
;		bit0	ADON	A/D変換ステータスビット
;						1=A/Dコンバータ動作
;						0=A/Dコンバータ停止
;
;		(#1)PIC16F1823のみ
;		(#2)ADC入力はDAC出力に接続される。
;		(#3)ADC入力はFVRバッファ1に接続される。
;		(#4)ADC入力は温度表示モジュール出力に接続される。
;
;		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モジュール
;
;
;		使用ワーク	tmp0
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;			VRによる分圧電圧取得

get_adc
			movf	hex0,W
			movwf	tmp0		;hex0保存
			movlb	01h
			movlw	01h			;00000001b
								;左詰め、基準電圧VDD、
								;AN0(RA0)選択、ADON_ON
			movwf	ADCON0		;電圧サンプリング開始
			call	w10u		;サンプリング電圧安定化待ち
			call	w10u
			movlb	01h
			bsf		ADCON0,GO	;A/D変換開始指令
aloop
			btfsc	ADCON0,GO	;A/D変換完了待ち 
			goto	aloop		;GO=0ならば次へ
			movf	ADRESH,W	;データ上位８ビット
			bcf		ADCON0,ADON	;A/DコンバータOFF
			movlb	0h
			movwf	hex0		;上位８ビットをhex0に保存

			movwf	FRQ0
			xorwf	tmp0,W
			btfss	STATUS,Z
			goto	gad01
			bcf		flg,1		;データ変更無
			return
gad01		bsf		flg,1		;データ変更有
			return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン	32MHZ用
;
;		1cycle	= 0.125us(8MHZ)
;		使用レジスタ	= 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
			

