		
LIST P=16F627
#INCLUDE "P16F627.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _CP_OFF & _WDT_OFF & _MCLRE_OFF & _LVP_OFF
	
		errorlevel -302 ; Turn off banking message
                		; known tested (good) code


		cblock 0x70      			;variables
		it_cnt						;1 sec counter
		second						;second counter
		min							;minute counter
		hour						;hour counter
		flag						;for tick & other flags
		W_TEMP						;W temp while It
		STATUS_TEMP					;Status temp while It
		endc
#define tick flag,0		

			org	0x00				; RESET	vector
			goto	Init
			org	0x04
			goto	Inter			; IT Vector

;IT rutin							; This function is called every time
									; if the timer1 overflows (65535->0).

Inter		movlw	low .15542
			movwf	TMR1L			;Load  TMR1L Low part of TMR1 value
			movlw	high .15542
			movwf	TMR1H			;Load  TMR1L High part of TMR1 value
			bcf		PIR1,TMR1IF		;Clear TMR1 IT Flag
			bsf		tick			; Set Tick bit
			retfie

;Main program

Init		
		; PORTA
		MOVLW	B'00000111'
		MOVWF	CMCON
		BSF		STATUS,RP0
		MOVLW	B'10000'
		MOVWF	TRISA
		; PORTB
		MOVLW	B'11000000'
		MOVWF	TRISB
		BCF 	STATUS,RP0
			bsf		PIE1,TMR1IE		;enable TMR1IT
			bcf		STATUS,RP0		;Bank 0 select
			movlw	.20
			movwf	it_cnt			;load IT counter
			clrf	second			; clear second cntr
			clrf	min				; clear minute cntr
			clrf	hour			; clear hour cntr
			clrf	flag			; clear tick bit
			movlw	low .15542		;Load  TMR1L Low part of TMR1 value
			movwf	TMR1L
			movlw	high .15542
			movwf	TMR1H			;Load  TMR1L High part of TMR1 value
			movlw	b'00000001'		;TMR1 Clk intern, prescaler 1, enable 
			movwf	T1CON			;
			movlw	b'11000000'
			movwf	INTCON			;Enable GIE, PIE

Loop
			nop
			btfss	tick			;Tick = 1?
			goto	Loop			;	
			bcf		tick			;clear tick bit
			decfsz	it_cnt,f		;decrement IT cntr
			goto	Loop
			movlw	.20
			movwf	it_cnt			;load IT counter
			incf	second,f		;increment second cntr
		call	DISPLAY
			movlw	.60
			subwf	second,w		;second cntr = 60 ?
			bnz		Loop
			clrf	second
		call	DISPLAY
			incf	min,f			;increment min cntr
			movlw	.60
			subwf	min,w			;min cntr = 60 ?
			bnz		Loop
			clrf	min
			incf	hour,f			;increment hour cntr
			movlw	.24
			subwf	hour,w			;hour cntr = 24 ?
			bnz		Loop
			clrf	hour
			goto	Loop

DISPLAY
		movfw	second
		CALL	BCD
		MOVLW	B'000001'			; some display
		MOVWF	PORTB
		movfw	ones
		movwf	PORTA
		MOVLW	B'000010'			; some display
		MOVWF	PORTB
		movfw	tens
		movwf	PORTA
	return		

BCD
tens    equ     0x1A            ; packed BCD 'hundreds' & 'tens'
ones    equ     0x1B            ; single BCD 'ones'
mask    equ     0x1C            ;

Bin2Bcd
        clrf    tens            ;
        decf    tens,F          ; preset 'tens' to -1
div10   movwf   ones            ;
        incf    tens,F          ; bump 'tens', 0x00..0x25
        movlw   6               ; using "packed bcd" format
        addwf   tens,W          ; bcd "digit carry"?
        skpndc                  ; no, skip, else
        movwf   tens            ; fix 'tens'
        movlw   10              ; ones = ones - 10
        subwf   ones,W          ; borrow?
        bc      div10           ; no, branch, else
return

end					;The end & a bit whisky