#define CRYSTAL 4194304
PROCESSOR PIC16F877
TITLE "TMR0"
INCLUDE "P16F877.INC"
LIST p=16F877, r=DEC
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF
ERRORLEVEL -302,-305,-306
RESET_V EQU 0x0000
CBLOCK 0x20
tmr0count
ENDC
ORG RESET_V
clrf STATUS
clrf INTCON
goto Init
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
main:
WaitTmr0Overflow:
btfss INTCON,T0IF
goto WaitTmr0Overflow
bcf INTCON,T0IF
; here we have 0.0625 seconds delay
decfsz tmr0count,F
goto WaitTmr0Overflow
movlw 16
movwf tmr0count
; here wa have 1 second delay
call UserSubroutineEvery1Second
goto main
UserSubroutineEvery1Second:
;
; Some code
;
return
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Init: clrf PIR1
clrf PIR2
clrf PORTA
clrf PORTB
clrf PORTC
clrf T1CON
clrf T2CON
clrf SSPCON
clrf CCP1CON
clrf ADCON0
bsf _RP0 ; bank1
clrf PIE1
clrf PIE2
movlw 0x06
movwf ADCON1 ; Set PORTA digital
movlw B'11010000'
movwf TRISA
movlw B'11111011'
movwf TRISB
movlw B'11011000'
movwf TRISC
; TMR0 delay:
; 4 / 4194304 = 9.5367431E-07
; TMR0 prescaler 1:256
; Delay = 256 * 256 * 9.5367431E-07 = 0.0625 seconds
; if tmr0count is 16, then total Delay is: 16 * 0.0625 = 1 second
movlw 0x07 ; 1:256, pull-up enabled
movwf OPTION_REG ; 1:256 TMR0 prescaler
bcf _RP0 ; bank0
movlw 16
movwf tmr0count
clrf TMR0
bcf INTCON,T0IF
bcf INTCON,T0IE
goto main
END