list p=16F690 ; list directive to define processor
#include <p16F690.inc>
errorlevel -302 , -207 ; suppress message 302 from list file
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
cblock 0x20
Display
W_Save
STATUS_Save
endc
org 0
goto init
org 0x0004
ISR:
movwf W_Save
movf STATUS,w
movwf STATUS_Save
btfss PORTA,5 ;test bit, skip if set
goto ExitISR
btfsc PORTA,5
goto Start_Stop
clrf Display
goto ExitISR
Start_Stop:
bcf INTCON,RABIF ;clear flag
bcf OPTION_REG,PSA ;prescaler is assigned to the Timer0 module
ExitISR:
movf STATUS_Save,w
movwf STATUS
swapf W_Save,f
swapf W_Save,w
retfie
init
banksel OSCCON ;select oscillator control
bcf OSCCON,6 ;set postscaler to 250 kHz
bsf STATUS,RP0
movlw b'00000000';111' ; configure Timer0. Sourced from the Processor clock;
movwf OPTION_REG ; Maximum Prescaler
clrf TRISC ; Make PortC all output
clrf Display
bcf STATUS,RP0
bsf INTCON,7 ;global interrupt enabled
bsf INTCON,RABIE
bsf STATUS,RP1
clrf ANSEL
bcf STATUS,RP0
bcf STATUS,RP1
bsf TRISA,5
bsf STATUS,RP0
bcf STATUS,RP1
bsf IOCA,5 ;interrupt on change enabled
bcf STATUS,RP0
bcf STATUS,RP1
;btfss PORTA,5 ;test bit, skip if set
ForeverLoop:
btfss INTCON,T0IF ; wait here until Timer0 rolls over
goto ForeverLoop
bcf INTCON,T0IF ; flag must be cleared in software
incf Display,f ; increment display variable
movf Display,w ; send to the LEDs
movwf PORTC
goto ForeverLoop
end