; 16F876_Solarkettle.asm						2007/08/11 17:42:40

; 					RB7 +10		input L 電磁弁テスト	RC7 上回転	output L
;					RB6 +1		input L 回転テスト	RC6 下回転	output L
; RA5 AN4	analoginput 温度	RB5 7SEG-MSB	output L 上LimitSW	RC5 左回転	output L
; RA4 PUMP	output H ポンプ		RB4 7SEG-LSB	output L 下LimitSW	RC4 右回転	output L
; RA3 AN3	analoginput 上		RB3 7SEG-D	output			RC3 電磁弁	output H
; RA2 AN2	analoginput 下		RB2 7SEG-C	output			RC2 上下LimitSW	input L
; RA1 AN1	analoginput 左		RB1 7SEG-B	output			RC1 左LimitSW	input L
; RA0 AN0	analoginput 右		RB0 7SEG-A	output			RC0 右LimitSW	input L
; TRISA		b'00101111'		TRISB		b'11000000'		TRISC		b'00000111'

	list		p=PIC16F876
	#include	<P16F876.INC>

	__CONFIG	_CP_OFF & _CPD_OFF & _BODEN_OFF & _DEBUG_OFF & _HS_OSC & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _WRT_ENABLE_ON

	CBLOCK	20H
	F_control		; 2^0 電磁弁onフラグ 0:停止中(設定温度>測定温度) 1:on中(設定温度<測定温度)
				; 2^1 ポンプonフラグ 0:停止中(設定温度>測定温度) 1:on中(設定温度<測定温度)
				; 2^2 ポンプoff後waitフラグ 0:wait終了 1:wait中
				; 2^4 電磁弁テストモード  2^5 回転テストモード
				; 2^6 +1前回ON  2^7 +10前回ON
	UDLimit			; 2^1 上LimitSW  2^0 下LimitSW
	work			; 汎用バッファ
	RB_buff			; PORTB 出力用バッファ
	RC_buff			; PORTC 出力用バッファ
	MGVontime		; 電磁弁on時間
	Pumpontime		; ポンプon時間
	one_conton		; +1連続カウンタ
	ten_conton		; +10連続カウンタ
	sseg_cnt		; MSB LSB 切換カウンタ
	set_LSB			; 温度設定値
	set_MSB
	set_BIN			; 2進数 温度設定値
	tmp_LSB			; 温度表示データ(10進)
	tmp_MSB
	tmp_BIN			; 2進数 温度
	adbuf4			; 温度 A/D変換値
	adbuf3			; 上   A/D変換値
	adbuf2			; 下   A/D変換値
	adbuf1			; 左   A/D変換値
	adbuf0			; 右   A/D変換値
	cntdutyUD		; カウンタ for 上下duty
	cntdutyLR		; カウンタ for 左右duty
	cnt20u			; カウンタ for 20μsec
	cntxxm			; カウンタ for xxmsec
	cnt1sec			; カウンタ for 1sec

	W_temp
	FSR_temp
	STATUS_temp
	pclath_temp
	ENDC

Pofwait	equ	d'10'		; ポンプoff後wait時間 初期値 10sec
MGVini	equ	d'25'		; MGVontime 初期値 25sec
Pumpini	equ	d'13'		; Pumpontime 初期値 13sec
dutyUD	equ	1		; 上下 duty 1/1
dutyLR	equ	1		; 左右 duty 1/1

	org	2100H
	de	MGVini		; MGVontime 初期値 24sec アドレス=0
	de	Pumpini		; Pumpontime 初期値 13sec アドレス=1
	de	d'5'		; 設定温度初期値 85℃ アドレス=2
	de	d'8'		;                     アドレス=3

	org	0
	BANKSEL	ADCON1
	goto	start

	org	4
	movwf	W_temp		; save W
	movf	STATUS,W
	movwf	STATUS_temp	; save STATUS
	movf	FSR,W
	movwf	FSR_temp	; save FSR
	movf	PCLATH,W
	movwf	pclath_temp	; save PCLATH
	call	intrqt
	movf	pclath_temp,W
	movwf	PCLATH		; restore PCLATH
	movf	FSR_temp,W
	movwf	FSR		; restore FSR
	movf	STATUS_temp,W
	movwf	STATUS		; restore STATUS
	swapf	W_temp,F
	swapf	W_temp,W	; restore W
	retfie

start	movlw	b'00000010'	; 左詰め AN4～AN0
	movwf	ADCON1
	movlw	b'00101111'
	movwf	TRISA
	movlw	b'11010111'	; pullup off TMR0CLK=osc/4
	movwf	OPTION_REG	; prescaler=1/256  51.2μsec
	movlw	b'11000000'
	movwf	TRISB
	movlw	b'00000111'
	movwf	TRISC
	BANKSEL	ADCON0
	movlw	b'10000000'	; fosc/32 turn off A/D
	movwf	ADCON0
	movlw	b'11101111'
	movwf	PORTA		; ポンプ off
	movlw	b'11111111'
	movwf	PORTB		; 7SEG off
	movlw	b'11110111'
	movwf	PORTC		; motor 電磁弁 off
	movlw	F_control
	movwf	FSR
start1	clrf	INDF		; clear memory
	incf	FSR,F
	movlw	pclath_temp+1
	subwf	FSR,W
	btfss	STATUS,Z
	goto	start1

	movlw	d'2'
	call	rderom
	movwf	set_LSB		; 設定温度初期化
	movlw	d'3'
	call	rderom
	movwf	set_MSB
	call	exBin		; 設定値2進数化
	movlw	b'11110000'	; 上下左右motor off
	movwf	RC_buff
	movlw	d'176'		; set timer value 256-4.096ms/0.0512ms = 176
	movwf	TMR0		; TMR0 = 4.0968ms
	movlw	b'10100000'	; GIE=1,T0IE=1
	movwf	INTCON		; interrupt enable

	movf	PORTB,W
	andlw	h'C0'
	btfsc	STATUS,Z	; skip if +10 off or +1 off
	goto	v_reset		; goto v_reset if +10 & +1 on
	btfss	PORTB,7		; skip if +10 off
	goto	v_test		; goto v_test if +10 on
	btfss	PORTB,6		; skip if +1 off
	goto	m_test		; goto m_test if +1 on
	goto	main3

main	btfsc	F_control,0	; skip if 電磁弁off
	goto	main2
	btfsc	F_control,1	; skip if ポンプoff
	goto	main4
	btfss	F_control,2	; skip if ポンプoff後wait
	goto	main1
	movf	cnt1sec,F
	btfss	STATUS,Z	; skip if 1sec up
	goto	main5
	movlw	d'244'		; 1sec= 244*4.0968msec
	movwf	cnt1sec
	decfsz	Pumpontime,F	; skip if ポンプoff後wait時間 up
	goto	main5
	bcf	F_control,2	; reset ポンプoff後waitフラグ

main1	movf	tmp_BIN,W
	subwf	set_BIN,W	; 設定値-測定値
	btfsc	STATUS,C	; skip if 設定値<測定値
	goto	main5

	movlw	d'0'
	call	rderom
	movwf	MGVontime	; 電磁弁on時間 set
	bsf	F_control,0	; set 電磁弁onフラグ
	bcf	F_control,1	; reset ポンプonフラグ
	bcf	F_control,2	; reset ポンプoff後waitフラグ
	bsf	PORTC,3		; 電磁弁 on
	bcf	PORTA,4		; ポンプ off
	movlw	d'244'		; 1sec= 244*4.0968msec
	movwf	cnt1sec
	goto	main6

main2	bsf	F_control,0	; set 電磁弁onフラグ
	bcf	F_control,1	; reset ポンプonフラグ
	bcf	F_control,2	; reset ポンプoff後waitフラグ
	bsf	PORTC,3		; 電磁弁 on
	bcf	PORTA,4		; ポンプ off
	movf	cnt1sec,F
	btfss	STATUS,Z	; skip if 1sec up
	goto	main6
	movlw	d'244'		; 1sec= 244*4.0968msec
	movwf	cnt1sec
	decfsz	MGVontime,F	; skip if 電磁弁on時間 up
	goto	main6

main3	movlw	d'1'
	call	rderom
	movwf	Pumpontime	; ポンプon時間 set
	bcf	F_control,0	; reset 電磁弁onフラグ
	bsf	F_control,1	; set ポンプonフラグ
	bcf	F_control,2	; reset ポンプoff後waitフラグ
	bcf	PORTC,3		; 電磁弁 off
	bsf	PORTA,4		; ポンプ on
	movlw	d'244'		; 1sec= 244*4.0968msec
	movwf	cnt1sec
	goto	main6

main4	bcf	F_control,0	; reset 電磁弁onフラグ
	bsf	F_control,1	; set ポンプonフラグ
	bcf	F_control,2	; reset ポンプoff後waitフラグ
	bcf	PORTC,3		; 電磁弁 off
	bsf	PORTA,4		; ポンプ on
	movf	cnt1sec,F
	btfss	STATUS,Z	; skip if 1sec up
	goto	main6
	movlw	d'244'		; 1sec= 244*4.0968msec
	movwf	cnt1sec
	decfsz	Pumpontime,F	; skip if ポンプon時間 up
	goto	main6
	bsf	F_control,2	; set ポンプoff後waitフラグ
	movlw	Pofwait
	movwf	Pumpontime	; ポンプoff後wait時間 set

main5	bcf	F_control,1	; reset ポンプonフラグ
	bcf	F_control,0	; reset 電磁弁onフラグ
	bcf	PORTC,3		; 電磁弁 off
	bcf	PORTA,4		; ポンプ off
main6	movf	adbuf0,W
	subwf	adbuf1,W	; 左-右
	btfsc	STATUS,C	; skip if 左光センサー<右光センサー(右側が明るい)
	goto	main7

	btfss	PORTC,0		; skip if 右LimitSW off
	goto	main8
	xorlw	h'FF'
	addlw	d'1'		; 絶対値化
	movwf	work
	movlw	b'11001111'
	iorwf	RC_buff,W
	xorlw	h'FF'
	movlw	h'FC'		; 左右motor off時は下位2Bitは無視する
	btfss	STATUS,Z	; skip if 左右motor off
	movlw	h'FE'		; 左右motor on時は下位1Bitは無視する
	andwf	work,W
	btfsc	STATUS,Z	; skip if 右側が明るい(右-左>1 or 3)
	goto	main8
	call	r_drive		; motor 右on
	goto	main9

main7	btfss	PORTC,1		; skip if 左LimitSW off
	goto	main8
	movwf	work
	movlw	b'11001111'
	iorwf	RC_buff,W
	xorlw	h'FF'
	movlw	h'FC'		; 左右motor off時は下位2Bitは無視する
	btfss	STATUS,Z	; skip if 左右motor off
	movlw	h'FE'		; 左右motor on時は下位1Bitは無視する
	andwf	work,W
	btfsc	STATUS,Z	; skip if 左側が明るい(左-右1 or 3)
	goto	main8
	call	l_drive		; motor 左on
	goto	main9

main8	movlw	b'00110000'
	iorwf	RC_buff,F	; 左右motor off

main9	movf	adbuf2,W
	subwf	adbuf3,W	; 上-下
	btfsc	STATUS,C	; skip if 上光センサー<下光センサー(下側が明るい)
	goto	mainA

	btfss	UDLimit,0	; skip if 下LimitSW off
	goto	mainB
	xorlw	h'FF'
	addlw	d'1'		; 絶対値化
	movwf	work
	movlw	b'00111111'
	iorwf	RC_buff,W
	xorlw	h'FF'
	movlw	h'FC'		; 上下motor off時は下位2Bitは無視する
	btfss	STATUS,Z	; skip if 上下motor off
	movlw	h'FE'		; 上下motor on時は下位1Bitは無視する
	andwf	work,W
	btfsc	STATUS,Z	; skip if 下側が明るい(下-上>1 or 3)
	goto	mainB
	call	d_drive		; motor 下on
	goto	main

mainA	btfss	UDLimit,1	; skip if 上LimitSW off
	goto	mainB
	movwf	work
	movlw	b'00111111'
	iorwf	RC_buff,W
	xorlw	h'FF'
	movlw	h'FC'		; 上下motor off時は下位2Bitは無視する
	btfss	STATUS,Z	; skip if 上下motor off
	movlw	h'FE'		; 上下motor on時は下位1Bitは無視する
	andwf	work,W
	btfsc	STATUS,Z	; skip if 上側が明るい(上-下>1 or 3)
	goto	mainB
	call	u_drive		; motor 上on
	goto	main

mainB	movlw	b'11000000'
	iorwf	RC_buff,F	; 上下motor off
	goto	main

; ------------------------------テストモード--------------------------------
;	電磁弁 & ポンプON時間 初期化

v_reset	bsf	F_control,4	; set 電磁弁テストモード
	movlw	MGVini
	movwf	MGVontime
	movlw	MGVontime
	movwf	FSR
	movlw	d'0'		; write MGVontime to EEPROM
	bcf	INTCON,GIE	; disable interrupts
	call	wterom
	movlw	Pumpini
	movwf	Pumpontime
	movlw	Pumpontime
	movwf	FSR
	movlw	d'1'		; write Pumpontime to EEPROM
	call	wterom
	bsf	INTCON,GIE	; enable interrupts
v_res1	movlw	d'244'		; 1sec= 244*4.0968msec
	movwf	cnt1sec
v_res2	movlw	d'50'-MGVini
	movwf	work
	movf	cnt1sec,F
	btfss	STATUS,Z	; skip if 1sec up
	goto	v_res2
	movlw	d'244'		; 1sec= 244*4.0968msec
	movwf	cnt1sec
v_res3	movlw	d'50'-Pumpini
	movwf	work
	movf	cnt1sec,F
	btfss	STATUS,Z	; skip if 1sec up
	goto	v_res3
	goto	v_res1

;	電磁弁 & ポンプテスト

v_test	bsf	F_control,4	; set 電磁弁テストモード
	btfss	PORTB,7		; skip if +10 off
	goto	v_test

v_test1	btfsc	PORTB,6		; skip if +1 on
	goto	v_test4
	movlw	d'50'		; 50sec ON時間
	movwf	work
v_test2	bsf	PORTC,3		; 電磁弁 on
	movlw	d'244'		; 1sec wait
	call	waitxx		; xx= n*4.0968msec
	btfsc	PORTB,6		; skip if +1 on
	goto	v_test3
	decfsz	work,F		; skip if 50sec up
	goto	v_test2
v_test3	movlw	d'50'
	movwf	MGVontime
	movf	work,W
	subwf	MGVontime,F	; 50sec-ON時間
	btfsc	STATUS,Z	; skip if not 0sec
	incf	MGVontime,F
	movlw	MGVontime
	movwf	FSR
	movlw	d'0'		; write MGVontime to EEPROM
	bcf	INTCON,GIE	; disable interrupts
	call	wterom
	bsf	INTCON,GIE	; enable interrupts
v_test4	bcf	PORTC,3		; 電磁弁 off
	btfsc	PORTB,7		; skip if +10 on
	goto	v_test7
	movlw	d'50'		; 50sec ON時間
	movwf	work
v_test5	bsf	PORTA,4		; ポンプ on
	movlw	d'244'		; 1sec wait
	call	waitxx		; xx= n*4.0968msec
	btfsc	PORTB,7		; skip if +10 on
	goto	v_test6
	decfsz	work,F		; skip if 50sec up
	goto	v_test5
v_test6	movlw	d'50'
	movwf	Pumpontime
	movf	work,W
	subwf	Pumpontime,F	; 50sec-ON時間
	btfsc	STATUS,Z	; skip if not 0sec
	incf	Pumpontime,F
	movlw	Pumpontime
	movwf	FSR
	movlw	d'1'		; write Pumpontime to EEPROM
	bcf	INTCON,GIE	; disable interrupts
	call	wterom
	bsf	INTCON,GIE	; enable interrupts
v_test7	bcf	PORTA,4		; ポンプ off
	goto	v_test1

;	回転テスト

m_test	bsf	F_control,5	; set 回転テストモード
	btfss	PORTB,6		; skip if +1 off
	goto	m_test

m_test1	btfsc	PORTB,7		; skip if +10 on
	goto	m_test5
	btfss	PORTC,0		; skip if 右LimitSW off
	goto	m_test2
	call	r_drive		; motor 右on
	goto	m_test1

m_test2	movlw	b'11110000'
	iorwf	RC_buff,F	; 左右motor off

m_test3	btfsc	PORTB,7		; skip if +10 on
	goto	m_test5
	btfss	PORTC,1		; skip if 左LimitSW off
	goto	m_test4
	call	l_drive		; motor 左on
	goto	m_test3

m_test4	movlw	b'11110000'
	iorwf	RC_buff,F	; 左右motor off
	goto	m_test1

m_test5	movlw	b'11110000'
	iorwf	RC_buff,F	; 左右motor off

m_test6	btfsc	PORTB,6		; skip if +1 on
	goto	m_testA
	btfss	UDLimit,1	; skip if 上LimitSW off
	goto	m_test7
	call	u_drive		; motor 上on
	goto	m_test6

m_test7	movlw	b'11110000'
	iorwf	RC_buff,F	; 上下motor off

m_test8	btfsc	PORTB,6		; skip if +1 on
	goto	m_testA
	btfss	UDLimit,0	; skip if 下LimitSW off
	goto	m_test9
	call	d_drive		; motor 下on
	goto	m_test8

m_test9	movlw	b'11110000'
	iorwf	RC_buff,F	; 上下motor off
	goto	m_test6

m_testA	movlw	b'11110000'
	iorwf	RC_buff,F	; 上下motor off
	goto	m_test1

; -------------------------------interrupt routine--------------------------------

intrqt	btfss	INTCON,T0IF	; time out interruption ?
	return			; return at illegal interrupt
	movlw	d'176'		; set timer value 256-4.096ms/0.0512ms = 176
	movwf	TMR0		; TMR0 = 4.0968ms
	bcf	INTCON,T0IF	; clear timer int flag
	call	ad_conv		; A/D変換
	call	exDtmp		; 測定温度変換 for S8100B 2進→10進
	movf	cntxxm,F
	btfss	STATUS,Z	; skip if xxmsec up
	decf	cntxxm,F
	movf	cnt1sec,F
	btfss	STATUS,Z	; skip if 1sec up
	decf	cnt1sec,F
	call	S_seg
	btfsc	F_control,4	; skip if not 電磁弁テストモード
	goto	testdip

;	上下motor 出力

	movf	RC_buff,W
	iorlw	b'00111111'
	xorlw	h'FF'
	btfss	STATUS,Z	; skip if 上下motor off
	goto	intrqt1
	bsf	PORTC,7		; 上下motor off
	nop
	nop
	bsf	PORTC,6
	goto	intrqt5

intrqt1	movf	cntdutyUD,F
	btfss	STATUS,Z	; skip if on duty
	goto	intrqt3
	btfsc	RC_buff,7	; skip if 上方向 on
	goto	intrqt2
	bsf	PORTC,6
	nop
	nop
	bcf	PORTC,7		; 上方向 on
	goto	intrqt4

intrqt2	btfsc	RC_buff,6	; skip if 下方向 on
	goto	intrqt3
	bsf	PORTC,7
	nop
	nop
	bcf	PORTC,6		; 下方向 on
	goto	intrqt4

intrqt3	bsf	PORTC,7		; 上下motor off
	nop
	nop
	bsf	PORTC,6
intrqt4	incf	cntdutyUD,F
	movlw	dutyUD
	subwf	cntdutyUD,W
	btfsc	STATUS,C	; skip if not one cycle
intrqt5	clrf	cntdutyUD	; 初期化

;	左右motor 出力

	movf	RC_buff,W
	iorlw	b'11001111'
	xorlw	h'FF'
	btfss	STATUS,Z	; skip if 左右motor off
	goto	intrqt6
	bsf	PORTC,5		; 左右motor off
	nop
	nop
	bsf	PORTC,4
	goto	intrqtA

intrqt6	movf	cntdutyLR,F
	btfss	STATUS,Z	; skip if on duty
	goto	intrqt8
	btfsc	RC_buff,5	; skip if 左方向 on
	goto	intrqt7
	bsf	PORTC,4
	nop
	nop
	bcf	PORTC,5		; 左方向 on
	goto	intrqt9

intrqt7	btfsc	RC_buff,4	; skip if 右方向 on
	goto	intrqt8
	bsf	PORTC,5
	nop
	nop
	bcf	PORTC,4		; 右方向 on
	goto	intrqt9

intrqt8	bsf	PORTC,5		; 左右motor off
	nop
	nop
	bsf	PORTC,4
intrqt9	incf	cntdutyLR,F
	movlw	dutyLR
	subwf	cntdutyLR,W
	btfsc	STATUS,C	; skip if not one cycle
intrqtA	clrf	cntdutyLR	; 初期化

	btfsc	F_control,5	; skip if not 回転テストモード
	return

;	+1key入力

	movf	one_conton,F
	btfsc	STATUS,Z	; skip if +1連続on中
	goto	intrqtE
	decf	one_conton,F	; +1連続カウンタ カウント
	btfsc	F_control,6	; skip if +1前回OFF
	goto	intrqtB
	btfsc	PORTB,6		; skip if +1 on
	goto	intrqtF
	bsf	F_control,6	; 前回ONフラグセット
	goto	intrqtC

intrqtB	btfsc	PORTB,6		; skip if +1 on
	goto	intrqtD
	bsf	F_control,6	; 前回ONフラグセット
	movf	one_conton,F
	btfss	STATUS,Z	; skip if +1連続カウンタ up
	goto	intrqtG
intrqtC	incf	set_LSB,F
	movlw	d'10'
	subwf	set_LSB,W
	btfsc	STATUS,C	; skip if set_LSB<10
	clrf	set_LSB		; 初期化 0
	movlw	set_LSB
	movwf	FSR
	movlw	d'2'		; write set_LSB to EEPROM
	call	wterom
	movlw	d'97'		; 4.0968msec*97=397msec
	movwf	one_conton
	goto	intrqtG

intrqtD	bcf	F_control,6	; 前回ONフラグリセット
	movlw	d'244'		; 4.0968msec*244=999msec
	movwf	one_conton
	goto	intrqtG

intrqtE	btfsc	PORTB,6		; skip if +1 on
	goto	intrqtF
	bsf	F_control,6	; 前回ONフラグセット
	movlw	d'244'		; 4.0968msec*244=999msec
	movwf	one_conton
	goto	intrqtG

intrqtF	bcf	F_control,6	; 前回ONフラグリセット

;	+10key入力

intrqtG	movf	ten_conton,F
	btfsc	STATUS,Z	; skip if +10連続on中
	goto	intrqtL
	decf	ten_conton,F	; +10連続カウンタ カウント
	btfsc	F_control,7	; skip if +10前回OFF
	goto	intrqtH
	btfsc	PORTB,7		; skip if +10 on
	goto	intrqtM
	bsf	F_control,7	; 前回ONフラグセット
	goto	intrqtJ

intrqtH	btfsc	PORTB,7		; skip if +10 on
	goto	intrqtK
	bsf	F_control,7	; 前回ONフラグセット
	movf	ten_conton,F
	btfss	STATUS,Z	; skip if +10連続カウンタ up
	goto	intrqtN
intrqtJ	incf	set_MSB,F
	movlw	d'10'
	subwf	set_MSB,W
	movlw	d'3'
	btfsc	STATUS,C	; skip if set_MSB<10
	movwf	set_MSB		; 初期化 3
	movlw	set_MSB
	movwf	FSR
	movlw	d'3'		; write set_MSB to EEPROM
	call	wterom
	movlw	d'97'		; 4.0968msec*97=397msec
	movwf	ten_conton
	goto	intrqtN

intrqtK	bcf	F_control,7	; 前回ONフラグリセット
	movlw	d'244'		; 4.0968msec*244=999msec
	movwf	ten_conton
	goto	intrqtN

intrqtL	btfsc	PORTB,7		; skip if +10 on
	goto	intrqtM
	bsf	F_control,7	; 前回ONフラグセット
	movlw	d'244'		; 4.0968msec*244=999msec
	movwf	ten_conton
	goto	intrqtN

intrqtM	bcf	F_control,7	; 前回ONフラグリセット

intrqtN	call	exBin		; 設定値2進数化
	return

testdip	decfsz	one_conton,F	; skip if time up
	return
	movlw	d'50'
	movwf	set_LSB
	movf	work,W
	subwf	set_LSB,F	; 50sec-ON時間
	clrf	set_MSB
testdp1	movlw	d'10'
	subwf	set_LSB,W
	btfss	STATUS,C	; skip if set_LSB=>10?
	goto	testdp2
	movwf	set_LSB
	incf	set_MSB,F	; 10位+1
	goto	testdp1

testdp2	movlw	d'49'		; 4.0968msec*49=200msec
	movwf	one_conton
	return

; -------------------------------sub routine--------------------------------

;	7SEG制御

S_seg	incf	sseg_cnt,F	; 7SEGカウンタ +1
	movlw	b'00110000'
	movwf	RB_buff
	movlw	b'11111111'
	movwf	PORTB		; 7SEG off
	movf	one_conton,F
	btfss	STATUS,Z	; skip if +1 off
	goto	S_seg1
	movf	ten_conton,F
	btfss	STATUS,Z	; skip if +10 off
	goto	S_seg1
	movlw	tmp_LSB
	goto	S_seg2

S_seg1	movlw	set_LSB
S_seg2	movwf	FSR
	btfsc	sseg_cnt,0	; skip if 7SEG=1桁目?
	goto	S_seg3
	bcf	RB_buff,4	; 7SEG LSB on
	goto	S_seg4

S_seg3	incf	FSR,F
	bcf	RB_buff,5	; 7SEG MSB on
S_seg4	movf	INDF,W
	andlw	b'00001111'
	iorwf	RB_buff,W
	movwf	PORTB		; 7SEG on
	call	wait2u		; 19.6+0.4μsec wait
	bsf	UDLimit,1
	bsf	UDLimit,0
	btfsc	PORTC,2		; skip if 上下LimitSW on
	return
	btfss	sseg_cnt,0	; skip if 7SEG MSB on
	goto	S_seg5
	bcf	UDLimit,1	; set 上LimitSW on
	return

S_seg5	bcf	UDLimit,0	; set 下LimitSW on
	return

;	上回転

u_drive	btfsc	RC_buff,6	; skip if 下回転中
	goto	u_drv1
	bsf	RC_buff,6	; motor off
	call	wait100		; 100msec wait
u_drv1	bcf	RC_buff,7	; motor 上on
	return

;	下回転

d_drive	btfsc	RC_buff,7	; skip if 上回転中
	goto	d_drv1
	bsf	RC_buff,7	; motor off
	call	wait100		; 100msec wait
d_drv1	bcf	RC_buff,6	; motor 下on
	return

;	左回転

l_drive	btfsc	RC_buff,4	; skip if 右回転中
	goto	l_drv1
	bsf	RC_buff,4	; motor off
	call	wait100		; 100msec wait
l_drv1	bcf	RC_buff,5	; motor 左on
	return

;	右回転

r_drive	btfsc	RC_buff,5	; skip if 左回転中
	goto	r_drv1
	bsf	RC_buff,5	; motor off
	call	wait100		; 100msec wait
r_drv1	bcf	RC_buff,4	; motor 右on
	return

;	設定温度変換 10進→2進

exBin	bcf	STATUS,C
	movf	set_MSB,W
	movwf	set_BIN		; *2^1
	rlf	set_BIN,F
	movf	set_BIN,W
	rlf	set_BIN,F
	rlf	set_BIN,F	; *2^3
	addwf	set_BIN,F	; 2^3+2^1=10倍
	movf	set_LSB,W
	addwf	set_BIN,F	; LSB+MSB*10
	return

;	測定温度変換 for S8100B 2進→10進

exDtmp	clrf	tmp_BIN		; 2進数 温度 0℃以下は0
	clrf	tmp_MSB
	movf	adbuf4,W	; adbuf4 読込
	sublw	d'230'
	movwf	tmp_LSB
	btfsc	STATUS,C	; skip if 0℃以下?
	goto	exDtmp3
	xorlw	d'255'
	addlw	d'1'
	movwf	tmp_LSB
	sublw	d'9'
	btfss	STATUS,C	; skip if -10℃以上?
	goto	exDtmp2
exDtmp1	movlw	d'100'		; ⊂記号(-1～-9℃)
	addwf	tmp_LSB,F
	goto	exDtmp4

exDtmp2	movlw	d'109'		; ⊂9(-9℃以下)
	movwf	tmp_LSB
	goto	exDtmp4

exDtmp3	movwf	tmp_BIN		; 2進数 温度
	sublw	d'99'
	btfsc	STATUS,C	; skip if 100℃以上?
	goto	exDtmp4
	movlw	d'99'		; 99
	movwf	tmp_LSB

exDtmp4	movlw	d'10'
	subwf	tmp_LSB,W
	btfss	STATUS,C	; skip if temp=>10?
	return
	movwf	tmp_LSB
	incf	tmp_MSB,F	; 10位+1
	goto	exDtmp4

;	A/D変換

ad_conv	movlw	b'10000001'	; select AN0
	call	s_ad_cv
	movwf	adbuf0		; A/D -> adbuf0
	call	wait2u		; 19.6+0.4μsec wait
	movlw	b'10001001'	; select AN1
	call	s_ad_cv
	movwf	adbuf1		; A/D -> adbuf1
	call	wait2u		; 19.6+0.4μsec wait
	movlw	b'10010001'	; select AN2
	call	s_ad_cv
	movwf	adbuf2		; A/D -> adbuf2
	call	wait2u		; 19.6+0.4μsec wait
	movlw	b'10011001'	; select AN3
	call	s_ad_cv
	movwf	adbuf3		; A/D -> adbuf3
	call	wait2u		; 19.6+0.4μsec wait
	movlw	b'10100001'	; select AN4
	call	s_ad_cv
	movwf	adbuf4		; A/D -> adbuf4
	movlw	b'10000000'	; turn off A/D
	movwf	ADCON0
	return

s_ad_cv	movwf	ADCON0		; select ANx
	call	wait2u		; 19.6+0.4μsec wait
	bsf	ADCON0,GO	; A/D start
adloop	btfsc	ADCON0,GO	; jump if A/D done?
	goto	adloop
	movf	ADRESH,W	; get A/D data
	return

;	20μsec wait

wait2u	movlw	d'23'		; 1 (4n+6)*1サイクル時間(4/fosc)
	movwf	cnt20u		; 1		20MHz 4/8=0.2μsec
wloop	nop			; 1*n		19.6μsec
	decfsz	cnt20u,F	; 1*(n-1)+2
	goto	wloop		; 2*(n-1)
	nop			; 1
	nop			; 1
	nop			; 1
	return			; 2

;	100msec wait

wait100	movlw	d'25'		; 100msec wait
waitxx	movwf	cntxxm		; xx = n*4.0968msec
waitx1	movf	cntxxm,F
	btfss	STATUS,Z	; skip if xxmsec up
	goto	waitx1
	return

;	Read to EEPROM

rderom
	BANKSEL	EEADR
	movwf	EEADR		; 読込アドレス設定
	BANKSEL	EECON1
	bcf	EECON1,EEPGD	; point to data memory
	bsf	EECON1,RD	; start read
	BANKSEL	EEDATA
	movf	EEDATA,W	; データ読込
	BANKSEL	STATUS
	return 

;	write to EEPROM

wterom
	BANKSEL	EEADR
	movwf	EEADR		; 書込アドレス設定
	movf	INDF,W
	BANKSEL	EEDATA
	movwf	EEDATA		; 書込データ set
	BANKSEL	EECON1
	bcf	EECON1,EEPGD	; point to data memory
	bsf	EECON1,WREN	; set write enable	
	movlw	h'55'		; write sequence
	movwf	EECON2		; start write
	movlw	h'AA'
	movwf	EECON2
	bsf	EECON1,WR	; go write
wterom1	nop
	btfsc	EECON1,WR	; skip if write end
	goto	wterom1
	bcf	EECON1,WREN	; reset write enable
	BANKSEL	STATUS
	return 

	end
