;--------------------------------------------------------------------------------
;	デジタルアンプ・ミュート制御
;	モメンタリースイッチ版
;	2007/08/07
;--------------------------------------------------------------------------------

	LIST		P=12F629
	INCLUDE		P12F629.INC
	ERRORLEVEL	-302

CB = _CPD_OFF
CB &= _CP_OFF
CB &= _BODEN_OFF
CB &= _MCLRE_OFF
CB &= _PWRTE_ON
CB &= _WDT_OFF
CB &= _EXTRC_OSC_CLKOUT

	__CONFIG	CB
	__IDLOCS	H'0100'

POWER_STATUS	EQU		0x20	; 電源状態管理変数
COUNTER			EQU		0x21	; ループ用カウンタ

;--------------------------------------------------------------------------------
;	プログラム先頭
;--------------------------------------------------------------------------------
	ORG		H'0'
	GOTO	INITIALIZE

;--------------------------------------------------------------------------------
;	割り込み処理（割り込み未使用）
;--------------------------------------------------------------------------------
	ORG		H'4'	;	念のため割り込み時の処理を記述
	RETFIE

;--------------------------------------------------------------------------------
;	初期化
;--------------------------------------------------------------------------------

INITIALIZE:

	BANKSEL		GPIO
	MOVLW		B'00000000'
	MOVWF		GPIO

	BANKSEL		CMCON
	MOVLW		B'00001111'    ;SETUP DIGITAL I/O MODE
	MOVWF		CMCON

	BANKSEL		TRISIO
	MOVLW		B'00001000'    ;PORT 0,1,2 = OUT, PORT 3 = IN
	MOVWF		TRISIO

	BANKSEL		GPIO

	MOVLW		D'0'
	MOVWF		POWER_STATUS	; Clear Power Status (POWER OFF)

MAIN_LOOP:

	BTFSC	GPIO,3		; ボタンが押されたか?
	GOTO	MAIN_LOOP	; 押されていなければループ、押されていればこのコードはスキップされる

	CALL	Wait_20ms	; 押されたら25ミリ秒待つ

	BTFSC	GPIO,3		; まだボタンが押されているか?
	GOTO	MAIN_LOOP	; 押されていなければループ最初から

	CALL	Wait_200ms	; 200ms 待つ

	DECFSZ		POWER_STATUS,F	;	現在の状態チェック
	GOTO		P_ON			;	STATUS -1 = でないなら電源 ON 処理へ、それ以外ならこのコードはスキップされる
	CALL		POWER_OFF		;	電源 OFF 処理へ
	GOTO		MAIN_LOOP		; ループ最初に戻る

P_ON:
	CALL		POWER_ON
	GOTO		MAIN_LOOP	; ループ最初に戻る

;--------------------------------------------------------------------------------
;	電源 ON 処理
;--------------------------------------------------------------------------------

POWER_ON:

	MOVLW		B'00000000'		; MUTE ON, AMP OFF, VR OFF
	MOVWF		GPIO
	CALL		Wait_1sec
	MOVLW		B'00000001'		; VR ON
	MOVWF		GPIO
	CALL		Wait_1sec
	MOVLW		B'00000011'		; AMP ON
	MOVWF		GPIO
	CALL		Wait_1sec
	MOVLW		B'00000111'		; MUTE OFF
	MOVWF		GPIO
	MOVLW		D'1'
	MOVWF		POWER_STATUS	; Set Power Status (POWER ON)
	RETURN

;--------------------------------------------------------------------------------
;	電源 OFF 処理
;--------------------------------------------------------------------------------

POWER_OFF:

	MOVLW		B'00000011'		; MUTE ON
	MOVWF		GPIO
	CALL		Wait_1sec
	MOVLW		B'00000001'		; AMP OFF
	MOVWF		GPIO
	CALL		Wait_1sec
	MOVLW		B'00000000'		; VR OFF
	MOVWF		GPIO
	MOVLW		D'0'
	MOVWF		POWER_STATUS	; Clear Power Status (POWER OFF)
	RETURN

;--------------------------------------------------------------------------------
;	クロック 1KHz 時 1 step = 1/250 Sec = 4ms
;--------------------------------------------------------------------------------

Wait_20ms:

	MOVLW		D'1'
    MOVWF		COUNTER
	GOTO		WAIT_LOOP

Wait_200ms:

	MOVLW		D'10'
    MOVWF		COUNTER
	GOTO		WAIT_LOOP

Wait_1sec:

	MOVLW		D'50'
    MOVWF		COUNTER
	GOTO		WAIT_LOOP

WAIT_LOOP:						;5 steps = 20 clocks = 20ms loop

	GOTO		$+1
	DECFSZ		COUNTER,F
	GOTO		WAIT_LOOP		; skipped if DECFSZ is ture

	RETURN

;--------------------------------------------------------------------------------
;	プログラム終了
;--------------------------------------------------------------------------------
	END
