;for AQ-T01A sample pgm source
;copy right 2002 bozushi koubou
;*****************************************************************
;	
;	このプログラムはＡＱ－Ｔ０１Ａから調光機能を削除した
;	サンプル・プログラムです。各ポートの制御方法や割り込み
;	方法などを参考にオリジナル。プログラムを構築してください。
;	アッセンブルは秋月電子のpa.exeで行います。
;	2002/08/12 ボズシ工房　田中 穂積
;	
;*****************************************************************

		include	16f84.h


		.osc	hs			;発振子は高速クリスタル
		.pwrt	on			;パワーアップタイマーは有効
		.wdt	off			;ＷＤＴは無効
		.protect off			;プロテクトは無効



		org	0ch			;変数宣言前の決まり文句
po_dig		ds	1			;デジット表示カウンタ

ac_clk		ds	1			;50Hz/60Hzの5回または6回カウンター
ac_clk10	ds	1			;50Hz/60Hzの10回カウンター
hz		ds	1			;50Hz/60Hz判定フラッグ　値は#5/#6

sec		ds	1			;秒カウンター
mini_1		ds	1			;分１桁カウンター
mini_10	ds	1			;分十桁カウンター
hour		ds	1			;時間カウンター
ampm		ds	1			;午前午後カウンター

mini_1_tmp	ds	1			;分１桁表示テンポラリー
mini_10_tmp	ds	1			;分十桁表示テンポラリー
hour_tmp	ds	1			;時間表示テンポラリー

mini_1_on	ds	1			;on時刻 分１桁
mini_10_on	ds	1			;on時刻 分十桁
hour_on	ds	1			;on時刻 時間
ampm_on	ds	1			;on時刻 午前午後

mini_1_off	ds	1			;off時刻 分１桁
mini_10_off	ds	1			;off時刻 分十桁
hour_off	ds	1			;off時刻 時間
ampm_off	ds	1			;off時刻 午前午後

ry_data	ds	1			;リレー制御データー

tm0		ds	1			;ワンショットタイマー変数
tm1		ds	1			;ワンショットタイマー変数
tm2		ds	1			;ワンショットタイマー変数

adj_sw_adge	ds	1			;ADJ スイッチ入力フラッグ
manu_on_adge	ds	1			;manual onスイッチ入力フラッグ
manu_off_adge	ds	1			;manual offスイッチ入力フラッグ
up_sw_adge	ds	1			;up  スイッチ入力フラッグ
down_sw_adge	ds	1			;downスイッチ入力フラッグ
pdown_adge	ds	1			;パワーダウン入力フラッグ
sw_h_tm	ds	1			;スイッチホールド時間

status_temp	ds	1			;割込時のstatus格納エリア
w_temp		ds	1			;割込時のwレジスタ格納エリア
pclath_temp	ds	1			;割込時のpclathレジスタ格納エリア
fsr_temp	ds	1			;割込時のfsrレジスタ格納エリア

mode		ds	1			;mode:RUN/時刻設定/on設定/off設定

;*********************************************************************************
;
;	プログラムスタート
;
;		割り込み時のレジスター待避はこの様にしてください。これで完璧です。
;		秋月のpa.exeソース，rem文にMPASMのソースを示してあります。
;
;*********************************************************************************
		org	0				;リセット時のスタートアドレス
		goto	start
		org	4				;割り込み時のスタートアドレス
		;***************************
		mov	w_temp,w			;1	movwf	w_temp
		mov	w,status			;2	movf	status,0
		clrf	status				;3	clrf	status
		mov	status_temp,w			;4	movwf	status_temp
		mov	pclath_temp,pclath		;5	movf	pclath,0
							;6	movwf	pclath_temp
		clrf	pclath				;7	clrf	pclath
		mov	fsr_temp,fsr			;8	movf	fsr,0
							;9	movwf	fsr_temp
		;***************************
		mov	intcon,#00000000b		;intconレジスター設定割り込み禁止
		;***************************
		call	int_sub			;割り込みプログラム
		;***************************
		mov	intcon,#10100000b		;intconレジスター割込許可設定
		mov	tmr0,#0FFh			;tmr0カウント値プリセット
		;***************************
		clrf	status				;10	clrf	status
		mov	fsr,fsr_temp			;11	movf	fsr_temp,0
							;12	movwf	fsr
		mov	pclath,pclath_temp		;13	movf	pclath_temp,0
							;14	movwf	pclath
		mov	status,status_temp		;15	movf	status_temp,0
							;16	movwf	status
		swap	w_temp				;17	swapf	w_temp,1
		mov	w,<>w_temp			;18	swapf	w_temp,0
		;***************************
		retfie

;*********************************************************************************
;
;	7セグ表示データー参照テーブル
;
;		rem outしてあるget_abcは7セグのアルファベット表示参照テーブルです。
;
;*********************************************************************************
get_seg	jmp	pc+w				;プログラムカウンターpcにwレジスターの値を加算し参照
		retw	00100001b			;0
		retw	01111101b			;1
		retw	00010011b			;2
		retw	00011001b			;3
		retw	01001101b			;4
		retw	10001001b			;5
		retw	10000001b			;6
		retw	00101101b			;7
		retw	00000001b			;8
		retw	00001001b			;9
;get_abc	jmp	pc+w				;プログラムカウンターpcにwレジスターの値を加算し参照
;		retw	00000101b			;A
;		retw	11000001b			;b
;		retw	10100011b			;C
;		retw	01010001b			;d
;		retw	10000011b			;E
;		retw	10000111b			;F
;		retw	10100001b			;G
;		retw	11000101b			;h
;		retw	01110001b			;J
;		retw	11100011b			;L
;		retw	11010101b			;n
;		retw	11010001b			;o
;		retw	00000111b			;P
;		retw	10001001b			;S
;		retw	01100001b			;U
;		retw	01001001b			;y
get_seg_h1	jmp	pc+w				;プログラムカウンターpcにwレジスターの値を加算し参照
		retw	00010011b			;2  12:00
		retw	01111101b			;1   1:00
		retw	00010011b			;2   2:00
		retw	00011001b			;3   3:00
		retw	01001101b			;4   4:00
		retw	10001001b			;5   5:00
		retw	10000001b			;6   6:00
		retw	00101101b			;7   7:00
		retw	00000001b			;8   8:00
		retw	00001001b			;9   9:00
		retw	00100001b			;0  10:00
		retw	01111101b			;1  11:00
get_seg_h10	jmp	pc+w				;プログラムカウンターpcにwレジスターの値を加算し参照
		retw	01111101b			;1  12:00
		retw	11111111b			;    1:00(ゼロサプレス)
		retw	11111111b			;    2:00(ゼロサプレス)
		retw	11111111b			;    3:00(ゼロサプレス)
		retw	11111111b			;    4:00(ゼロサプレス)
		retw	11111111b			;    5:00(ゼロサプレス)
		retw	11111111b			;    6:00(ゼロサプレス)
		retw	11111111b			;    7:00(ゼロサプレス)
		retw	11111111b			;    8:00(ゼロサプレス)
		retw	11111111b			;    9:00(ゼロサプレス)
		retw	01111101b			;1  10:00
		retw	01111101b			;1  11:00
get_ampm	jmp	pc+w
		retw	10111111b			;am
		retw	11111011b			;pm	
get_t_ampm	jmp	pc+w
		retw	00111111b			;am
		retw	11011101b			;pm	
get_on_ampm	jmp	pc+w
		retw	00101111b			;am
		retw	11010101b			;pm	
get_off_ampm	jmp	pc+w
		retw	01001111b			;am
		retw	11110001b			;pm	
get_dig	jmp	pc+w				;74HC4053のbit立て参照テーブル
		retw	0100b				;(bit4)common5 分1桁
		retw	0010b				;(bit2)common4 分10桁
		retw	0000b				;(bit0)common2 時1桁
		retw	0001b				;(bit1)common3 時10桁
		retw	0011b				;(bit3)common1 am pm桁
		retw	0101b				;(bit5)リレー
		retw	0111b				;(bit7)調光
		retw	0110b				;(bit6)入力
;*********************************************************************************
;
;		初期設定
;
;			必要ない初期設定はrem outしてありますがROM容量に空きがあるなら
;			設定してください。時刻やON/OFF設定の初期値は量産TEST時に便利な
;			値となっております。
;
;*********************************************************************************
start		;clr	ra				;ポートraをクリア
;		clr	rb				;ポートrbをクリア
;		mov	hz,#5				;電源周波数(50Hz)
		mov	mode,#0			;モード(0)
		;**********************************
		clr	sec				;時刻初期設定pm8:00
		clr	mini_1				;
		clr	mini_10			;
		mov	hour,#8			;
		mov	ampm,#1			;
		;**********************************
		mov	mini_1_on,#1			;ON時間初期設定pm8:01
		mov	mini_10_on,#0			;
		mov	hour_on,#8			;
		mov	ampm_on,#1			;
		;**********************************
		mov	mini_1_off,#2			;OFF時間初期設定pm8:02
		mov	mini_10_off,#0		;
		mov	hour_off,#8			;
		mov	ampm_off,#1			;
		;**********************************
;		clr	adj_sw_adge			;ADJ スイッチ入力フラッグ
;		clr	manu_on_adge			;manual onスイッチ入力フラッグ
;		clr	manu_off_adge			;manual offスイッチ入力フラッグ
;		clr	up_sw_adge			;up  スイッチ入力フラッグ
;		clr	down_sw_adge			;downスイッチ入力フラッグ
		clr	sw_h_tm			;スイッチホールド時間
		clr	ry_data			;リレーデーター
		;**********************************
		mov	!ra,#10000b			;ポートraを出力ポートに設定
		mov	!rb,#00000000b		;ポートrbを出力ポートに設定
		;**********************************
		mov	ra,#0000b			;拡張ポート初期設定
		mov	rb,#00000000b			;
		call	ss_wait			;ラッチタイミングワンショット
		mov	ra,#0101b			;リレーポートall Lowラッチ
		nop					;
		mov	ra,#0111b			;調光ポートall Lowラッチ
		call	s_wait				;ホールドタイミングワンショット
		;**********************************
		call	judge_56			;50Hz/60Hz判定ルーチン呼び出し
		;**********************************
		mov	option,#11111000b		;optionレジスター設定
		mov	intcon,#10100000b		;intconレジスター割込許可設定
;*********************************************************************************
;
;		メインルーチン(モードセレクター)
;
;			メインルーチンはmode毎に枝分かれした後，main_1に合流し，拡張
;			ポートを出力した後，タクトSW入力をモニターし，mainに戻って
;			来ます。時刻カウンターsec,mini_1,mini_10,hour,ampmは割り込み
;			ルーチンでカウントアップします。
;
;*********************************************************************************
main		clr	po_dig				;デジットカウンタpo_digをクリア
;		cje	mode,#0,mode_0		;if (mode = 0)then goto mode_0
		cje	mode,#1,mode_1		;if (mode = 1)then goto mode_1
		cje	mode,#2,mode_2		;if (mode = 2)then goto mode_2
		cjae	mode,#3,mode_3		;if (mode >= 3)then goto mode_3
;*********************************************************************************
;
;				mode0 時間表示ルーチン
;
;*********************************************************************************
mode_0		call	deg_4_bf			;分１桁～時10桁表示ルーチン
		;mode0*****   am pm桁   ***********
		call	dig_scan			;デジットスキャン
		mov	w,ampm				;AMPMデーターampmをwレジスターに代入
		call	get_ampm			;get_ampm呼び出し
		call	dig_end			;デジット終了ルーチン
		;mode0***   mode0終了   ***********
		goto	main_1				;ループ2へ
;*********************************************************************************
;
;				mode1 時刻合わせ表示ルーチン
;
;*********************************************************************************
mode_1		call	deg_4_bf			;分１桁～時10桁表示ルーチン
		;mode1*****   am pm桁   ***********
		call	dig_scan			;デジットスキャン
		mov	w,ampm				;AMPMデーターampmをwレジスターに代入
		call	get_t_ampm			;get_t_ampm呼び出し
		call	dig_end			;デジット終了ルーチン
		;mode1***   mode1終了   ***********
		goto	main_1				;ループ2へ
;*********************************************************************************
;
;				mode2 ON時間設定表示ルーチン
;
;*********************************************************************************
mode_2		mov	mini_1_tmp,mini_1_on		;分1桁データーmini_1_onを保存
		mov	mini_10_tmp,mini_10_on	;分10桁データーmini_10_onを保存
		mov	hour_tmp,hour_on		;時データーhour_onを保存
		call	deg_4				;分１桁～時10桁表示ルーチン
		;mode2*****   am pm桁   ***********
		call	dig_scan			;デジットスキャン
		mov	w,ampm_on			;AMPMデーターampm_onをwレジスターに代入
		call	get_on_ampm			;get_on_ampm呼び出し
		call	dig_end			;デジット終了ルーチン
		;mode2***   mode2終了   ***********
		goto	main_1				;ループ2へ
;*********************************************************************************
;
;				mode3 OFF時間設定表示ルーチン
;
;*********************************************************************************
mode_3		mov	mini_1_tmp,mini_1_off	;分1桁データーmini_1_offを保存
		mov	mini_10_tmp,mini_10_off	;分10桁データーmini_10_offを保存
		mov	hour_tmp,hour_off		;時1桁データーhour_offを保存
		call	deg_4				;分１桁～時10桁表示ルーチン
		;mode3*****   am pm桁   ***********
		call	dig_scan			;デジットスキャン
		mov	w,ampm_off			;時10桁データーampm_offをwレジスターに代入
		call	get_off_ampm			;get_off_ampm呼び出し
		call	dig_end			;デジット終了ルーチン
		;mode3***   mode3終了   ***********
		;goto	main_1				;ループ2へ
;*********************************************************************************
;
;				mode else ２番目のメインルーチン
;
;*********************************************************************************
main_1
		;********** CO2 ON判定 ************
		cse	mini_1,mini_1_on		;if mini_1 = mini_1_on then skip
		jmp	ry_con_1			;else goto ry_con_1
		cse	mini_10,mini_10_on		;if mini_10 = mini_10_on
		jmp	ry_con_1			;else goto ry_con_1
		cse	hour,hour_on			;if hour = hour_on then skip
		jmp	ry_con_1			;else goto ry_con_1
		cse	ampm,ampm_on			;if ampm = ampm_on then skip
		jmp	ry_con_1			;else goto ry_con_1
		setb	ry_data.2			;CO2リレーON
ry_con_1	;********** CO2 OFF判定 ***********
		cse	mini_1,mini_1_off		;if mini_1 = mini_1_off then skip
		jmp	ry_con_2			;else goto ry_con_2
		cse	mini_10,mini_10_off		;if mini_10 = mini_10_off then skip
		jmp	ry_con_2			;else goto ry_con_2
		cse	hour,hour_off			;if hour = hour_off then skip
		jmp	ry_con_2			;else goto ry_con_2
		cse	ampm,ampm_off			;if ampm = ampm_off then skip
		jmp	ry_con_2			;else goto ry_con_2
		clrb	ry_data.2			;CO2リレーOFF
ry_con_2	;******** LAMP AIR 判定 ***********
		jnb	ry_data.2,ry_con_3		;if ry_data.2 = 0 (CO2がoffなら) then ry_con_3
		setb	ry_data.0			;els if LAMPリレーON
		clrb	ry_data.1			;AIRリレーOFF
		jmp	ry_con_4
ry_con_3	clrb	ry_data.0			;LAMPリレーOFF
		setb	ry_data.1			;AIRリレーON
ry_con_4	;*********** ry出力 ***************
		mov	rb,ry_data			;リレー出力
		nop					;nop 2サイクルタイマー
		nop					;150nS
		call	dig_scan			;デジットスキャン(拡張ポートexbに出力)
		call	ss_wait			;ホールドタイミング
		;*********  調光ポート出力 *********
		mov	rb,sec				;仮に！　ポートrbに秒データー出力
		call	ss_wait			;ラッチタイミング
		call	dig_scan			;デジットスキャン(拡張ポートexaに出力)
		call	ss_wait			;ホールドタイミング
		;********* タクト入力 **************
		mov	rb,#00000000b			;プルダウンによる鈍り防止　一旦LOWにする
		clr	rb				;ポートrbをクリア
		mov	!rb,#11111111b		;ポートrbを入力ポートに設定
		call	dig_scan			;デジットスキャン
		;********* bit5停電検出 ***********
inp_pdown_1	rl	pdown_adge			;pdown_adge<<=1(左1ビットシフト)
		movb	pdown_adge.0,rb.5		;ポートrbのbit5をpdown_adgeのbit0に代入
		snb	pdown_adge.0			;if pdown_adge.0 = 0 then skip(停電の場合)
		jmp	inp_pdown_2			;停電じゃない場合
		nop					;停電の場合
		mov	intcon,#00000000b		;intconレジスター設定割り込み禁止
		call	int_sub			;割込カウンター呼び出し
		call	wait20				;16.7mS/20mSワンショットタイマー
		jmp	inp_pdown_1			;ループする
inp_pdown_2	cse	pdown_adge,#01h		;if adj_sw_adge = 01h(ポジエッジ検出) then skip
		jmp	inp_pdown_3			;ポジエッジじゃなければ抜け出る
		call	judge_56			;50Hz/60Hz判定ルーチン
inp_pdown_3	mov	intcon,#10100000b		;intconレジスター割込許可設定
		;******** bit0エッジ検出 **********
		rl	adj_sw_adge			;adj_sw_adge<<=1(左1ビットシフト)
		movb	adj_sw_adge.0,rb.0		;ポートrbのbit0をadj_sw_adgeのbit0に代入
		;******* bit0ダウンエッジ検出 *****
		cse	adj_sw_adge,#0F0h		;if adj_sw_adge = F0h then skip
		jmp	inp_Y				;ダウンエッジじゃなかったらinp_Yへ
		clr	sw_h_tm			;ダウンエッジならsw_h_tmをクリアーし
		jmp	inp_1				;inp_1へ
		;******* bit0ポジエッジ検出 ********
inp_Y		cje	mode,#0,inp_Z			;if (mode = 0)then goto inp_Z
		cje	adj_sw_adge,#0Fh,inp_0	;if adj_sw_adge = #00001111b(ポジエッジ検出) then goto inp_0
		jmp	inp_1				;else if goto inp_1
		;****** mode0 bit0長押し検出 ******
inp_Z		cse	adj_sw_adge,#0FFh		;if adj_sw_adge = #11111111b then skip
		jmp	inp_1				;
		inc	sw_h_tm			;変数sw_h_tmに1を加算
		cjb	sw_h_tm,#0FFh,inp_1		;if sw_h_tm < FFh then goto inp_1
		;********  mode設定 ***************
inp_0		inc	mode				;modeに1を加算
		cjb	mode,#4,inp_1			;if mode < 4 then goto inp_1
		clr	mode				;else if mode = 0
		;****** Select Case mode **********
inp_1		cje	mode,#0,inp_2			;if (mode = 0)then goto inp_2
		cjae	mode,#1,inp_3			;if (mode >= 1)then goto inp_3
		;****** Case mode0 ****************
inp_2		mov	intcon,#10100000b		;intconレジスター割込許可設定
		goto	inp_7
		;****** Case mode1,2,3 ************
inp_3		mov	intcon,#00000000b		;intconレジスター設定割り込み禁止
		;******* bit1連続押し検出 **********
		rl	up_sw_adge			;up_sw_adge<<=1(左1ビットシフト)
		movb	up_sw_adge.0,rb.1		;ポートrbのbit1をup_sw_adgeのbit0に代入
		cse	up_sw_adge,#0FFh		;if up_sw_adge = #11111111b then skip
		jmp	inp_4				;
		call	up_count			;
inp_4		;******* bit1ダウンエッジ検出 ******
		cse	up_sw_adge,#0F0h		;if up_sw_adge = F0h then skip
		jmp	inp_5				;
		clr	sw_h_tm			;
inp_5		;******* bit2連続押し検出 **********
		rl	down_sw_adge			;down_sw_adge<<=1(左1ビットシフト)
		movb	down_sw_adge.0,rb.2		;ポートrbのbit2をdown_sw_adgeのbit0に代入
		cse	down_sw_adge,#0FFh		;if down_sw_adge = #11111111b then skip
		jmp	inp_6				;
		call	down_count			;
inp_6		;******* bit2ダウンエッジ検出 ******
		cse	down_sw_adge,#0F0h		;if down_sw_adge = F0h then skip
		jmp	inp_7				;
		clr	sw_h_tm			;
inp_7		;***bit3マニュアルONポジエッジ検出***
		rl	manu_on_adge			;manu_on_adge<<=1(左1ビットシフト)
		movb	manu_on_adge.0,rb.3		;ポートrbのbit3をmanu_on_adgeのbit0に代入
		cse	manu_on_adge,#0Fh		;if manu_on_adge = 0Fh(ポジエッジ検出) then skip
		jmp	inp_8				;else if goto inp_8
		setb	ry_data.2			;CO2リレーON
inp_8		;***bit4マニュアルOFFポジエッジ検出**
		rl	manu_off_adge			;manu_off_adge<<=1(左1ビットシフト)
		movb	manu_off_adge.0,rb.4		;ポートrbのbit4をmanu_off_adgeのbit0に代入
		cse	manu_off_adge,#0Fh		;if manu_off_adge = 0Fh(ポジエッジ検出) then skip
		jmp	inp_end			;else if goto inp_end
		jb	ry_data.2,inp_9		;if ry_data.2 = 1 then goto inp_9
inp_9		clrb	ry_data.2			;CO2リレーOFF
inp_end	;******* ポート喧嘩防止 ************
		mov	rb,#11111111b			;LED消灯
		mov	!rb,#00000000b		;ポートrbを出力ポートに設定
		goto	main				;ループ頭へ戻る
;*********************************************************************************
;
;		ワンショット・タイマー・ルーチン
;
;			ここから下は全てサブルーチンです。
;
;*********************************************************************************
ss_wait	mov	tm1,#1				;変数tm1をセット
		jmp	wait1
sm_wait	mov	tm1,#7				;変数tm1をセット
		jmp	wait1
s_wait		mov	tm1,#14			;変数tm1をセット
		jmp	wait1
wait		mov	tm1,#71			;変数tm1をセット
wait1		mov	tm2,#12			;変数tm2をセット
wait2		djnz	tm2,wait2			;if ((tm1-1) <> 0) then goto wait2
		djnz	tm1,wait1			;if ((tm1-1) <> 0) then goto wait1
		ret
		;********* LONGタイマー ***********
wait18		mov	tm0,#32			;33回18.2mSecタイマー
		jmp	wait3
wait20		mov	tm0,#35			;変数tm0をセット36回20mSec
		cje	hz,#5,wait3			;if hz = 5 then goto wait3
		mov	tm0,#29			;変数tm0をセット30回16.7mSec
wait3		call	wait				;ワンショットタイマー
		djnz	tm0,wait3			;if ((tm0-1) <> 0) then goto wait3
		call	sm_wait			;微調整
		ret
;*********************************************************************************
;
;		50Hz/60Hz判定ルーチン
;
;			電源投入後に電源周波数をモニターします。ポジとネガをポーリング
;			した後，18.2mSのタイマーをはたき，ra.4が「H」か「L」かで判定
;			します。50Hzの1サイクルは20mS，60Hzは16.7mSです。判定の精度は
;			20MHzのセラロックの精度に依存します。
;
;*********************************************************************************
judge_56	;***** TCKポートポジエッジ検出 *****(ポーリング・ルーチン)
		rl	adj_sw_adge			;adj_sw_adge<<=1(左1ビットシフト)
		movb	adj_sw_adge.0,ra.4		;ポートraのbit4をadj_sw_adgeのbit0に代入
		cse	adj_sw_adge,#0Fh		;if adj_sw_adge = #0Fh(ポジエッジ検出) then skip
		jmp	judge_56			;else if goto judge_56
		;***** TCKポートネガエッジ検出 *****(念のためもう一度ポーリング)
judge_n	rl	adj_sw_adge			;adj_sw_adge<<=1(左1ビットシフト)
		movb	adj_sw_adge.0,ra.4		;ポートraのbit4をadj_sw_adgeのbit0に代入
		cse	adj_sw_adge,#0F0h		;if adj_sw_adge = #F0h(ネガエッジ検出) then skip
		jmp	judge_n			;else if goto judge_n
		;***** 2波(1サイクル)終了 **********
		call	wait18				;18.2mSecタイマー
		jb	ra.4,judge_5			;if ra.4 = 1 then judge_5
		jnb	ra.4,judge_6			;if ra.4 = 0 then judge_6
judge_5	mov	hz,#5				;50Hz
		ret
judge_6	mov	hz,#6				;60Hz
		ret
;*********************************************************************************
;
;				アップルーチン
;
;*********************************************************************************
up_count	inc	sw_h_tm			;変数sw_h_tmに1を加算
		cje	sw_h_tm,#1,up_c_1		;if sw_h_tm = 1 then goto up_c_1
		cjb	sw_h_tm,#0FFh,up_c_end	;if sw_h_tm < FFh then goto up_c_end
		mov	sw_h_tm,#0FAh			;変数sw_hold_tmにFAhを代入
up_c_1		;***** mode slector ********
		cje	mode,#1,up_c_2		;if (mode = 1)then goto up_c_2
		cje	mode,#2,up_c_3		;if (mode = 2)then goto up_c_3
		cjae	mode,#3,up_c_4		;if (mode >= 3)then goto up_c_4
up_c_2		;******* 時刻設定 **********
		inc	mini_1				;変数mini_1に1を加算
		cjb	mini_1,#10,up_c_end		;if mini_1 < 10 then goto up_c_end
		clr	mini_1				;else if 変数mini_1をクリア
		;***************************
		inc	mini_10			;変数mini_10に1を加算
		cjb	mini_10,#6,up_c_end		;if mini_10 < 6 then goto up_c_end
		clr	mini_10			;else if 変数mini_10をクリア
		;***************************
		inc	hour				;変数hourに1を加算
		cjb	hour,#12,up_c_end		;if hour < 12 then goto up_c_end
		clr	hour				;else if 変数hourをクリア
		;***************************
		inc	ampm				;変数ampmに1を加算
		cjb	ampm,#2,up_c_end		;if ampm < 2 then goto up_c_end
		clr	ampm				;else if 変数ampmをクリア
		jmp	up_c_end
up_c_3		;******** ON時間設定 ********
		inc	mini_1_on			;変数mini_1_onに1を加算
		cjb	mini_1_on,#10,up_c_end	;if mini_1_on < 10 then goto up_c_end
		clr	mini_1_on			;else if 変数mini_1_onをクリア
		;***************************
		inc	mini_10_on			;変数mini_10_onに1を加算
		cjb	mini_10_on,#6,up_c_end	;if mini_10_on < 6 then goto up_c_end
		clr	mini_10_on			;else if 変数mini_10_onをクリア
		;***************************
		inc	hour_on			;変数hour_onに1を加算
		cjb	hour_on,#12,up_c_end		;if hour_on < 12 then goto up_c_end
		clr	hour_on			;else if 変数hour_onをクリア
		;***************************
		inc	ampm_on			;変数ampmに1を加算
		cjb	ampm_on,#2,up_c_end		;if ampm < 2 then goto up_c_end
		clr	ampm_on			;else if 変数ampm_onをクリア
		jmp	up_c_end
up_c_4		;******** OFF時間設定 *******
		inc	mini_1_off			;変数mini_1_offに1を加算
		cjb	mini_1_off,#10,up_c_end	;if mini_1_off < 10 then goto up_c_end
		clr	mini_1_off			;else if 変数mini_1_offをクリア
		;***************************
		inc	mini_10_off			;変数mini_10_offに1を加算
		cjb	mini_10_off,#6,up_c_end	;if mini_10_off < 6 then goto up_c_end
		clr	mini_10_off			;else if 変数mini_10_offをクリア
		;***************************
		inc	hour_off			;変数hour_offに1を加算
		cjb	hour_off,#12,up_c_end	;if hour_off < 12 then goto up_c_end
		clr	hour_off			;else if 変数hour_offをクリア
		;***************************
		inc	ampm_off			;変数ampm_offに1を加算
		cjb	ampm_off,#2,up_c_end		;if ampm_off < 2 then goto up_c_end
		clr	ampm_off			;else if 変数ampm_offをクリア
up_c_end	ret
;*********************************************************************************
;
;				ダウンルーチン
;
;*********************************************************************************
down_count	inc	sw_h_tm			;変数sw_h_tmに1を加算
		cje	sw_h_tm,#1,down_c_1		;if sw_h_tm = 1 then goto down_c_1
		cjb	sw_h_tm,#0FFh,down_c_end	;if sw_h_tm < FFh then goto down_c_end
		mov	sw_h_tm,#0FAh			;変数sw_hold_tmにFAhを代入
down_c_1	;***** mode slector ********
		cje	mode,#1,down_c_2		;if (mode = 1)then goto down_c_2
		cje	mode,#2,down_c_3		;if (mode = 2)then goto down_c_3
		cjae	mode,#3,down_c_4		;if (mode >= 3)then goto down_c_4
down_c_2	;******* 時刻設定 **********
		dec	mini_1				;変数mini_1から1を減算
		cse	mini_1,#0FFh			;if mini_1 = FFh then skip
		goto	down_c_end
		mov	mini_1,#9			;変数mini_1に9を代入
		;***************************
		dec	mini_10			;変数mini_10から1を減算
		cse	mini_10,#0FFh			;if mini_10 =FFh then skip
		goto	down_c_end
		mov	mini_10,#5			;変数mini_10に5を代入
		;***************************
		dec	hour				;変数hourから1を減算
		cse	hour,#0FFh			;if hour = FFh then skip
		goto	down_c_end
		mov	hour,#11			;変数hourに11を代入
		;***************************
		dec	ampm				;変数ampmから1を減算
		cse	ampm,#0FFh			;if ampm = FFh then skip
		goto	down_c_end
		mov	ampm,#1			;変数ampmに1を代入
		jmp	down_c_end
down_c_3	;****** ON時間設定 *********
		dec	mini_1_on			;変数mini_1_onから1を減算
		cse	mini_1_on,#0FFh		;if mini_1_on = FFh then skip
		goto	down_c_end
		mov	mini_1_on,#9			;変数mini_1_onに9を代入
		;***************************
		dec	mini_10_on			;変数mini_10_onから1を減算
		cse	mini_10_on,#0FFh		;if mini_10_on = FFh then skip
		goto	down_c_end
		mov	mini_10_on,#5			;変数mini_10_onに5を代入
		;***************************
		dec	hour_on			;変数hourから1を減算
		cse	hour_on,#0FFh			;if hour_on = FFh then skip
		goto	down_c_end
		mov	hour_on,#11			;変数hour_onに11を代入
		;***************************
		dec	ampm_on			;変数ampm_onから1を減算
		cse	ampm_on,#0FFh			;if ampm_on = FFh then skip
		goto	down_c_end
		mov	ampm_on,#1			;変数ampm_onに1を代入
		jmp	down_c_end
down_c_4	;****** OFF時間設定 ********
		dec	mini_1_off			;変数mini_1_offから1を減算
		cse	mini_1_off,#0FFh		;if mini_1_off = FFh then skip
		goto	down_c_end
		mov	mini_1_off,#9			;変数mini_1_offに9を代入
		;***************************
		dec	mini_10_off			;変数mini_10_offから1を減算
		cse	mini_10_off,#0FFh		;if mini_10_off =FFh then skip
		goto	down_c_end
		mov	mini_10_off,#5		;変数mini_10_offに5を代入
		;***************************
		dec	hour_off			;変数hour_offから1を減算
		cse	hour_off,#0FFh		;if hour_off = FFh then skip
		goto	down_c_end
		mov	hour_off,#11			;変数hour_offに11を代入
		;***************************
		dec	ampm_off			;変数ampm_offから1を減算
		cse	ampm_off,#0FFh		;if ampm_off = FFh then skip
		goto	down_c_end
		mov	ampm_off,#1			;変数ampm_offに1を代入
down_c_end	ret
;*********************************************************************************
;
;			日→日	デジットスキャンルーチン
;
;*********************************************************************************
dig_scan	mov	w,po_dig			;変数po_digをwレジスターに代入
		call	get_dig			;get_seg呼び出し
		mov	ra,w				;ポートraにwの内容を出力
		inc	po_dig				;変数po_digに1を加算
		ret
;*********************************************************************************
;
;		┌→日→・・・→日→┐	デジットエンドルーチン
;		└─────────┘
;*********************************************************************************
dig_end	mov	rb,w				;ポートrbにwの内容を出力
dig_end_0	call	wait				;wait呼び出し
		mov	rb,#11111111b			;LED消灯
		ret
;*********************************************************************************
;
;				標準４桁表示ルーチン
;
;*********************************************************************************
deg_4_bf	mov	mini_1_tmp,mini_1		;分1桁データーmini_1を保存
		mov	mini_10_tmp,mini_10		;分10桁データーmini_10を保存
		mov	hour_tmp,hour			;時データーhourを保存
deg_4		;*********    分１桁    ***********
		call	dig_scan			;デジットスキャン
		mov	w,mini_1_tmp			;分1桁データーmini_1_tmpをwレジスターに代入
		call	get_seg			;get_seg呼び出し
		mov	rb,w				;ポートrbにwの内容を出力
		;*********  dotの点滅  ************
		csae	ac_clk10,#5			;if ac_clk10 >= 5 then skip
		clrb	rb.0				;ポートrbビット0をlow
		call	dig_end_0			;デジット終了ルーチン
		;*********    分10桁    ***********
		call	dig_scan			;デジットスキャン
		mov	w,mini_10_tmp			;分10桁データーmini_10_tmpをwレジスターに代入
		call	get_seg			;get_seg呼び出し
		call	dig_end			;デジット終了ルーチン
		;*********    時１桁    ***********
		call	dig_scan			;デジットスキャン
		mov	w,hour_tmp			;時データーhour_tmpをwレジスターに代入
		call	get_seg_h1			;get_seg_h1呼び出し
		call	dig_end			;デジット終了ルーチン
		;*********    時10桁    ***********
		call	dig_scan			;デジットスキャン
		mov	w,hour_tmp			;時データーhour_tmpをwレジスターに代入
		call	get_seg_h10			;get_seg_h10呼び出し
		call	dig_end			;デジット終了ルーチン
		ret
;*********************************************************************************
;
;		割込ルーチン
;
;			ra.3を割り込み中に「H」にしており，割り込みルーチンの負荷や，
;			ノイズによる過割り込みなどがモニタできます。
;			尚，当ルーチンは停電中にも（割り込み禁止）セラロックの精度で
;			呼び出されます。
;
;*********************************************************************************
int_sub	setb	ra.3				;ポートraビット3をhigh(割込時間モニタ)
		;**********************************
		inc	ac_clk				;変数ac_clkに1を加算
		cjb	ac_clk,hz,int_end		;if ac_clk < hz then goto int_end
		clr	ac_clk				;else if 変数ac_clkをクリア
		;*** ここは0.1秒毎に通過 ***********
		inc	ac_clk10			;変数ac_clk10に1を加算
		cjb	ac_clk10,#10,int_end		;if ac_clk10 < 10 then goto int_end
		clr	ac_clk10			;else if 変数ac_clkをクリア
int_sec	;**** ここは１秒毎に通過 ***********
		inc	sec				;変数secに1を加算
		cjb	sec,#60,int_end		;if sec < 60 then goto int_end
		clr	sec				;else if 変数secをクリア
		;**** ここは１分毎に通過 ***********
		inc	mini_1				;変数mini_1に1を加算
		cjb	mini_1,#10,int_end		;if mini_1 < 10 then goto int_end
		clr	mini_1				;else if 変数mini_1をクリア
		;**** ここは10分毎に通過 ***********
		inc	mini_10			;変数mini_10に1を加算
		cjb	mini_10,#6,int_end		;if mini_10 < 6 then goto int_end
		clr	mini_10			;else if 変数mini_10をクリア
		;***** ここは１時間毎に通過 ********
		inc	hour				;変数hourに1を加算
		cjb	hour,#12,int_end		;if hour < 12 then goto int_end
		clr	hour				;else if 変数hourをクリア
		;**** ここは12時間毎に通過 *********
		inc	ampm				;変数ampmに1を加算
		cjb	ampm,#2,int_end		;if ampm < 2 then goto int_end
		clr	ampm				;else if 変数ampmをクリア
int_end	;**********************************
		clrb	ra.3				;ポートraビット3をlow(割込時間モニタ)
		ret
