El timer lo puedes configurar de varias maneras, todo esta en las hojas de especificaciones busca el timer1 que te servira, yo estoy haciendo un programa que utiliza algo parecido y utilizo el timer 1 por interrupcion
#include <18F4585.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV21 //Brownout reset at 2.1V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOPBADEN //PORTB pins are configured as DIGITAL input channels on RESET
#FUSES BBSIZ4K //4K words Boot Block size
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES MCLR //Master Clear pin enabled
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=32000000)
#use FAST_IO(B)
#use FAST_IO(C)
#use FAST_IO(D)
#BYTE FILAS=0xF81
#BYTE DATOS=0xF82
#BYTE COLUM=0xF83
#BYTE TRISB=0xf93
#BYTE TRISC=0xf94
#BYTE TRISD=0xf95
BYTE ndesplegar[6]={0};
BYTE Display[6][3]={0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF};
BYTE col=0b00000100;
BYTE fil=0b00010000;
BYTE NoDis=0,NoMod=0;
#inline
void NOP(){
#asm
Nop
#endasm
}
#INT_TIMER1
void Matriz( void ){
DATOS=0;
if(col==0){
fil<<=1;
col=0x04;
}
if(fil==0x80)
fil=0x10;
if(NoDis==3){
NoMod++;
NoDis=0;
}
if(NoMod==6)
NoMod=0;
FILAS=fil;
COLUM=col;
DATOS=Display[NoMod][NoDis++];
col<<=1;
set_timer1(0xE119);
NOP();
return;
}
void main(){
BYTE i,j;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_oscillator(OSC_32MHZ|OSC_NORMAL|OSC_PLL_ON);
set_timer1(0xE0BF);
SETUP_TIMER_1((T1_INTERNAL|T1_DIV_BY_1)&0x7F);
ENABLE_INTERRUPTS(INT_TIMER1);
ENABLE_INTERRUPTS(GLOBAL);
TRISB=0x8F;
TRISC=0x00;
TRISD=0x03;
while(TRUE);
}
Disculpa que no lo haya podido reducir pero se ven las partes principales del programa por interrupcion
para configurar el timer tienes que decidir si vas a usar el reloj del sistema o uno externo, si utilizas el de sistema tienes que dividir la frecuencia entre cuatro
Fosc/4Ahora lo siguiente a configurar es el preescaler el cual dependiendo del pic puedes usarlo a 2 ,4, 8, etc. Este es un divisor de frecuencia, de la frecuencia de sistema
Fosc/4 con esto configuraras la frecuencia del timer.
El timer genera una interrupcion cuando pasa de FFFF a 0000 es una interrupcion de sobreflujo.
Asi entonces para generar un evento, lo que tienes que hacer es definir la frecuencia de tu timer, despues de acuerdo a eso, calcular cuantos pulsos de reloj se necesitan para ocupar el tiempo que tu quieres, con este dato del numero de ciclos, se los restas a FFFF ya que los timer siempre son incrementales. y disparas el reloj, cuando tenga un sobreflujo, activara la interrupcion y ejecutara el codigo de la funcion correspondiente.
Espero te ayude cualquier cosa avisa