;-------------------------------------------------------------------------;
; This is the interrupt routine that is jumped to when TMR0 overflows ;
; (every 4.096 msec) ;
;-------------------------------------------------------------------------;
INTERRUPT MOVWF W_TEMP ; save W
SWAPF STATUS,W ; save status
MOVWF STATUS_TEMP ; without changing flags
; CLRWDT ; Clear Watchdog timer
INCF DIGCTR,F ; next digit #
MOVF DIGCTR,W ; get it into W
ANDLW B'00000011' ; mask off 2 lowest bits
MOVWF DIGIT ; save it for later
ADDLW H'40' ; point at register to display
MOVWF FSR ; use as pointer
MOVF INDF,W ; get value of reg pointed to into W
[B] btfss DIGIT,0 ; These 4 lines check for a 3 in DIGIT
goto NOT_MIN10_DIGIT
btfss DIGIT,1
goto NOT_MIN10_DIGIT
btfsc STATUS, Z ; Check if W is zero
movlw H'0A' ; Make the 4543 display a blank
[/B]
NOT_MIN10_DIGIT
MOVWF PORTA ; output to CD4543
MOVF PORTB,W ; read PORTB bits
ANDLW B'00110000' ; mask bit 4 & 5
MOVWF TEMP ; save it for later
MOVF DIGIT,W ; recall digit #
CALL BITPAT ; get bit pattern
XORWF TEMP,W ; exclusive OR with TEMP
MOVWF PORTB ; select transistor
DECFSZ INTCNT,F ; finished 1 sec?
GOTO RESTORE ; not yet, return and enable inter.
CALL EVERYSEC ; go to every second routine
MOVLW D'244' ; reset INTCNT to normal value
MOVWF INTCNT ;
DECFSZ FUDGE,F ; time for fudge?
GOTO RESTORE ; not yet, continue on
MOVLW H'06' ; reset FUDGE to 6
MOVWF FUDGE ;
INCF INTCNT,F ; INTCNT to 245
RESTORE SWAPF STATUS_TEMP,W ; get original status back
MOVWF STATUS ; into status register
SWAPF STATUS_TEMP,F ; old no flags trick again
SWAPF STATUS_TEMP,W ; to restore W
BCF INTCON,T0IF ; clear the TMR0 interrupt flag
RETFIE ; finished