;
;  Bell Program for PIC16F84
;                          Y.Senta
	list	p=16f84
	#include p16f84.inc
;
;  Define RAM
	cblock 0x0c
		Wreg        ; Wreg Backup
		Status	    ; STATUS Backup

		MSec01      ; 0.1msec
		MSec10	    ; 10msec
		Sec         ; Second
		Min         ; Minute
		Point       ; bell point
		BellCnt     ; bell count
		BellFrqCnt
		MSec        ; temp use

		Tmp
		Flags
	endc

#define TIMER 0x83   ; time interrupt  (0x100-0x83)/10MHz *8= 0.1 msec
;
;	start!!
;
	org	0
	goto	init
;
;	interrupt
;
inth
	org	0x04
	goto	interrupt
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
interrupt
	movwf	Wreg        ; W register push
	movf	STATUS,W    ; Status push
 	movwf	Status
	btfsc	INTCON,2    ; if time interruput
	call	tint        ;	call tint
	movf	Status,W
	movwf	STATUS      ; Status pull
	movf	Wreg,W      ; W register pull
	retfie              ; return to interrupt
;
;	time interrupt
;
tint
	bcf	INTCON,2
	movlw	TIMER+0x4
	addlw	0x04       ; magic number
	movwf	TMR0

	btfsc	Flags,0
	call	beep
	decfsz	MSec01,F
	goto	tintend

	bcf	PORTB,3    ; make 50Hz
	btfss	MSec10,0
	bsf	PORTB,3
	decf	MSec,F     ; for wait timer

	movlw	0x64
	movwf	MSec01
	decfsz	MSec10,F
	goto	tintend

	movlw	0x64
	movwf	MSec10
	incf	Sec,W
	movwf	Sec
	sublw	0x3b
	btfsc	STATUS,0
	goto	tintend

	clrf	Sec
	incf	Min,W
	movwf	Min
	sublw	0x1d
	btfsc	STATUS,0
	goto	tintend

	clrf	Min
	incf	Point,W
	movwf	Point
	movwf	BellCnt
	sublw	0x07
	btfss	STATUS,0
	clrf	Point
tintend
	bsf	INTCON,5
	return
;
beep
	bcf	PORTB,2
	btfss	MSec01,0
	bsf	PORTB,2
	return
;
;  start program
;
init
	org	$

	movlw	0x64
	movwf	MSec01
	movwf	MSec10
	clrf	Sec
	clrf	Min
	clrf	Point
	clrf	Flags
	movlw	0x08
	movwf	BellCnt
	bsf	STATUS,RP0  ; bank 1
        movlw   0x00
	movwf   OPTION_REG
	movlw	0xf0        ; %11110000  set PortA I/O mode   0:Output 1:Input
	movwf	TRISA
	movlw	0xf1        ; %11110001  set PortB I/O mode
	movwf	TRISB
	bcf	STATUS,RP0  ; bank 0
	movlw	TIMER       ; set time interrupt 
	movwf	TMR0
	bcf	PORTB,2     ; Bell
	bcf	PORTB,3     ; test Pin 50Hz
	bsf	INTCON,5    ; time interrupt enable
	bsf	INTCON,7    ; interrupt enable
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;      main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
b1check
	btfsc	PORTB,6
	goto	b2check
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	movf	Min,W
	sublw	0x0e
	btfss	STATUS,0
	goto	countup

	bcf	INTCON,5
	movlw	0x64
	movwf	MSec01
	movwf	MSec10
	clrf	Sec
	clrf	Min
	movf	Point,W
	btfsc	STATUS,2
	movlw	0x08
	movwf	BellCnt
	bsf	INTCON,5

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
b2check
	btfsc	PORTB,7
	goto	LED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
countup
	bcf	INTCON,5
	movlw	0x64
	movwf	MSec01
	movwf	MSec10
	clrf	Sec
	clrf	Min
	incf	Point,W
	movwf	Point
	movwf	BellCnt
	sublw	0x07
	btfss	STATUS,0
	clrf	Point
	bsf	INTCON,5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LED
	movf	Point,W
	movwf	Tmp
LED0  ;  0:00
	btfss	STATUS,2
	goto	LED1
	bcf	PORTB,1
	bsf	PORTA,0
	bsf	PORTA,1
	bsf	PORTA,2
	bsf	PORTA,3
	goto	bell	
LED1  ;  0:30
	decf	Tmp,F
	btfss	STATUS,2
	goto 	LED2
	bsf	PORTB,1
	bcf	PORTA,0
	bcf	PORTA,1
	bcf	PORTA,2
	bcf	PORTA,3
	goto	bell	
LED2  ;  1:00
	decf	Tmp,F
	btfss	STATUS,2
	goto 	LED3
	bcf	PORTB,1
	bsf	PORTA,0
	bcf	PORTA,1
	bcf	PORTA,2
	bcf	PORTA,3
	goto	bell	
LED3  ;  1:30
	decf	Tmp,F
	btfss	STATUS,2
	goto 	LED4
	bsf	PORTB,1
	bcf	PORTA,0
	bsf	PORTA,1
	bcf	PORTA,2
	bcf	PORTA,3
	goto	bell	
LED4  ;  2:00
	decf	Tmp,F
	btfss	STATUS,2
	goto 	LED5
	bcf	PORTB,1
	bsf	PORTA,0
	bsf	PORTA,1
	bcf	PORTA,2
	bcf	PORTA,3
	goto	bell	
LED5  ;  2:30
	decf	Tmp,F
	btfss	STATUS,2
	goto 	LED6
	bsf	PORTB,1
	bcf	PORTA,0
	bsf	PORTA,1
	bsf	PORTA,2
	bcf	PORTA,3
	goto	bell	
LED6  ;  3:00
	decf	Tmp,F
	btfss	STATUS,2
	goto 	LED7
	bcf	PORTB,1
	bsf	PORTA,0
	bsf	PORTA,1
	bsf	PORTA,2
	bcf	PORTA,3
	goto	bell	
LED7  ;  3:30
	bsf	PORTB,1
	bcf	PORTA,0
	bsf	PORTA,1
	bsf	PORTA,2
	bsf	PORTA,3

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
bell
	movf	BellCnt,W
	btfsc	STATUS,2
	goto	mainloop
 
loop
	bsf	Flags,0
	movlw	0x0a
	call	wait
	bcf	Flags,0
	bcf	PORTB,2
	movlw	0x0a
	call	wait
	decfsz	BellCnt,F
	goto	loopnext
	goto	mainloop
loopnext
	bsf	Flags,0
	movlw	0x0a
	call	wait
	bcf	Flags,0
	bcf	PORTB,2
	movlw	0x50
	call	wait
	decfsz	BellCnt,F
	goto	loop
	
mainloop
	goto	main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
wait
	movwf	MSec
waitloop
	movf	MSec,W
	btfss	STATUS,2
	goto	waitloop
	return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

