;******************************************************************************************
;  タイマーサンプル
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H17.08.01
;   History      :
;******************************************************************************************
;
	LIST	P=PIC16F88,ST=OFF,R=DEC
	INCLUDE	"P16F88.inc"	
;	__CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO
	__CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _HS_OSC
	__CONFIG _CONFIG2 , _IESO_OFF & _FCMEN_OFF
;
NUM1	EQU	0x20
NUM2	EQU	0x21
NUM3	EQU	0x22
NUM4	EQU	0x23
DEC7IN	EQU	0x24
TIM	EQU	0x25
TIM1	EQU	0x26
TIM001	EQU	0x27
LP	EQU	0x28
LP1	EQU	0x29
LP2	EQU	0x2A

	ORG	0
	GOTO	START
	ORG	4
	GOTO	START
START
; Bank0での設定
	BANKSEL	PORTA	; PortAのBankを選択する
	CLRF	PORTA	; PortAの初期化(Bank0)
	MOVLW	B'01111111'
	MOVWF	PORTB	

; Bank1での設定
	BANKSEL	ANSEL	; ANSELのBankを選択する(Bank1)
	MOVLW	B'00000000'	; 全てをDegitalに設定
	MOVWF	ANSEL	; Degital Inputに設定(Bank1)
	MOVLW	B'00010000'
	MOVWF	TRISA	; PortAのI/O設定(Bank1)
	MOVLW	B'00000000'
	MOVWF	TRISB	; PortBのI/O設定(Bank1)
; Bank0に戻す
	BANKSEL	PORTA	; PortAのBankを選択する

	CLRF	NUM1
	CLRF	NUM2
	CLRF	NUM3
	CLRF	NUM4
MAIN
	CALL	DWSW
	GOTO	MAIN

;******************************************************************************************
;   Function Name : DINIT
;   Disctiption   : 初期メッセージ表示(PUSH)
;   Input         : 
;   Output        : 
;******************************************************************************************
DINIT
; P文字 
	MOVLW	B'01111111'
	MOVWF	PORTB
	MOVLW	B'00000001'
	MOVWF	PORTA
	MOVLW	B'00010010'
	MOVWF	PORTB
	CALL	WAT001
; U文字
	MOVLW	B'01111111'
	MOVWF	PORTB
	MOVLW	B'00000010'
	MOVWF	PORTA
	MOVLW	B'00001100'
	MOVWF	PORTB
	CALL	WAT001
; S文字
	MOVLW	B'01111111'
	MOVWF	PORTB
	MOVLW	B'00000100'
	MOVWF	PORTA
	MOVLW	B'01000001'
	MOVWF	PORTB
	CALL	WAT001
; H文字
	MOVLW	B'01111111'
	MOVWF	PORTB
	MOVLW	B'00001000'
	MOVWF	PORTA
	MOVLW	B'00010100'
	MOVWF	PORTB
	CALL	WAT001
	RETURN

;******************************************************************************************
;   Function Name : UPSW
;   Disctiption   : UPカウント（時間設定）
;   Input         : 
;   Output        : 
;******************************************************************************************
UPSW
	CALL	UPCNT
	MOVLW	060H
	MOVWF	LP
UPSW1
	CALL	OUTSUB4
	DECFSZ	LP,F
	GOTO	UPSW1
	RETURN

;******************************************************************************************
;   Function Name : UPCNT
;   Disctiption   : UPカウンタ（時計形式）
;   Input         : NUM1～4
;   Output        : NUM1～4
;******************************************************************************************
UPCNT
	MOVLW	H'01'
	ADDWF	NUM1,F		; 1桁目（１分）は10進カウンタ(0Aで桁上げ)
	MOVFW	NUM1
	SUBLW	H'0A'
	BTFSS	STATUS,Z
	RETURN

	CLRF	NUM1
	MOVLW	H'01'
	ADDWF	NUM2,F		; 2桁目（１０分）は6進カウンタ(06で桁上げ)
	MOVFW	NUM2
	SUBLW	H'06'
	BTFSS	STATUS,Z
	RETURN

	CLRF	NUM2
	MOVLW	H'01'
	ADDWF	NUM3,F		; 3桁目（１時間）は10進カウンタ(0Aで桁上げ)
	MOVFW	NUM3
	SUBLW	H'0A'
	BTFSS	STATUS,Z
	RETURN

	CLRF	NUM3
	MOVLW	H'01'
	ADDWF	NUM4,F		; 4桁目（１０時間）は3進カウンタ(03で桁上げ)
	MOVFW	NUM4
	SUBLW	H'03'
	BTFSS	STATUS,Z
	RETURN

	CLRF	NUM1
	CLRF	NUM2
	CLRF	NUM3
	CLRF	NUM4
	RETURN
;******************************************************************************************
;   Function Name : DWSW
;   Disctiption   : DOWNカウント（時間設定）
;   Input         : 
;   Output        : 
;******************************************************************************************
DWSW
	CALL	DWCNT
	MOVFW	NUM1
	XORLW	H'FF'
	BTFSS	STATUS,Z
	GOTO	DWSW0
DWSW0L
	CALL	DINIT
	BTFSS	PORTA,4
	GOTO	DWSW0L
	CLRF	NUM1
DWSW0H
	CALL	UPSW
	BTFSS	PORTA,4
	RETURN
	GOTO	DWSW0H	
DWSW0
	CALL	WAIT1M

	RETURN

;******************************************************************************************
;   Function Name : WAIT1M
;   Disctiption   : １分待つ
;                   ※このWAIT以外は一瞬なので、誤差として考えない
;   Input         : 
;   Output        : 
;******************************************************************************************
WAIT1M
	MOVLW	29
	MOVWF	LP2
WAIT1MC
	MOVLW	60
	MOVWF	LP1
WAIT1MB
	MOVLW	100
	MOVWF	LP
WAIT1MA
	CALL	OUTSUB4		;1268 STEP
	DECFSZ	LP,F
	GOTO	WAIT1MA
	DECFSZ	LP1,F
	GOTO	WAIT1MB
	DECFSZ	LP2,F
	GOTO	WAIT1MC

	RETURN

;******************************************************************************************
;   Function Name : DWCNT
;   Disctiption   : DOWNカウンタ（時計形式）
;   Input         : NUM1～4
;   Output        : NUM1～4
;******************************************************************************************
DWCNT
	MOVFW	NUM1
	XORLW	H'00'
	BTFSC	STATUS,Z
	GOTO	DWCNT2
	DECF	NUM1,F
	RETURN
DWCNT2
	MOVLW	H'09'		; 1桁目（１分）は10進カウンタ(0=>9)
	MOVWF	NUM1
	MOVFW	NUM2
	XORLW	H'00'
	BTFSC	STATUS,Z
	GOTO	DWCNT3
	DECF	NUM2,F
	RETURN
DWCNT3
	MOVLW	H'05'		; 2桁目（１０分）は6進カウンタ(0=>5)
	MOVWF	NUM2
	MOVFW	NUM3
	XORLW	H'00'
	BTFSC	STATUS,Z
	GOTO	DWCNT4
	DECF	NUM3,F
	RETURN
DWCNT4
	MOVLW	H'09'		; 3桁目（１時）は10進カウンタ(0=>9)
	MOVWF	NUM3
	MOVFW	NUM4
	XORLW	H'00'
	BTFSC	STATUS,Z
	GOTO	DWCNT5
	DECF	NUM4,F
	RETURN
DWCNT5
	MOVLW	H'FF'		; 4桁目（１０時）は終了
	MOVWF	NUM1
	CLRF	NUM2
	CLRF	NUM3
	CLRF	NUM4

	RETURN

;******************************************************************************************
;   Function Name : OUTSUB4
;   Disctiption   : ７セグメント表示（NORMAL　TYPE）
;   Input         : NUM1～4
;   Output        : PORTB
;******************************************************************************************
OUTSUB4				; 1268 STEP
	MOVFW	NUM1
	MOVWF	DEC7IN
	MOVLW	B'11111111'
	MOVWF	PORTB
	MOVLW	B'00001000'
	MOVWF	PORTA
	CALL	DEC7SEG		;    7 STEP
	CALL	WAT001		;  304 STEP

	MOVFW	NUM2
	MOVWF	DEC7IN
	MOVLW	B'11111111'
	MOVWF	PORTB
	MOVLW	B'00000100'
	MOVWF	PORTA
	CALL	DEC7SEG	
	CALL	WAT001

	MOVFW	NUM3
	MOVWF	DEC7IN
	MOVLW	B'11111111'
	MOVWF	PORTB
	MOVLW	B'00000010'
	MOVWF	PORTA
	CALL	DEC7SEG	
	CALL	WAT001

	MOVFW	NUM4
	MOVWF	DEC7IN
	MOVLW	B'11111111'
	MOVWF	PORTB
	MOVLW	B'00000001'
	MOVWF	PORTA
	CALL	DEC7SEG	
	CALL	WAT001

	RETURN

;******************************************************************************************
;   Function Name : DEC7SEG
;   Disctiption   : ７セグメントドライバー
;   Input         : DEC7IN(BINARY)
;   Output        : PORTB
;******************************************************************************************
DEC7SEG
	MOVFW	DEC7IN	
	CALL	TABLE7
	MOVWF	PORTB
	RETURN
TABLE7
	ADDWF	PCL,F
	RETLW	B'10001000'		; 0
	RETLW	B'11111100'		; 1
	RETLW	B'10100010'		; 2
	RETLW	B'11100000'		; 3
	RETLW	B'11010100'		; 4
	RETLW	B'11000001'		; 5
	RETLW	B'10000001'		; 6
	RETLW	B'11111000'		; 7
	RETLW	B'10000000'		; 8
	RETLW	B'11000000'		; 9
	RETLW	B'10010000'		; A
	RETLW	B'10000101'		; B
	RETLW	B'10001011'		; C
	RETLW	B'10100100'		; D
	RETLW	B'10000011'		; E
	RETLW	B'10010011'		; F


;******************************************************************************************
;   Function Name : WAT001
;   Disctiption   : タイマー関数
;   Input         : 
;   Output        : 
;******************************************************************************************
WAT001
	MOVLW	100
	MOVWF	TIM001	
WAT001A	NOP
	DECFSZ	TIM001,F
	GOTO	WAT001A
	RETURN

	END
