Primero que nada debes aprender como funcionan los TIMER. Los TIMER se incrementan cada vez que ocurre un ciclo o varios ciclos de reloj en dependencia de su preescaler.
Por ejemplo el TIMER0 tiene 8 preescaler distintos 1:1, 1:2, 1:4, 1:8, 1:16, 1:32, 1:64, 1:128 y 1:256. Si por ejemplo escojes el prescaler 1:256 entonces el TIMER0 se incrmentara cada 256 ciclos del oscilador y si tu cristal es de 4 MHz entonces el TIMER0 se incrementara cada 256us, por ello no puedes leer directamente el valor del TIMER0.
Otra cosa importante es que cada vez que el TIMER0 tiene un valor de 255d (0b11111111) y se incrementa su siguiente valor es 0d(0b0000 0000), a esto se le llama desbordamiento del TIMER0, y este activa el flag de interrupcion, y si suponemos igual que antes prescaler 1:256 y Fosc=4MHz entonces la interrupcion ocurrira cada 65ms.
La ecuacion que se utiliza para calcular el tiempo que tarda en realizarce una interrupción por desbordamiento de TIMR0 es la siguiente.
$$T_{desborde} = {4 \over {F_{OSC} }} \cdot T0div\left( {256 - TMR0} \right)
Si deseas que el desborde ocurra cada 1ms entonces debes calcular el valor de TMR0.
$$TMR0 = {{T_{desborde} \cdot F_{OSC} } \over {4 \cdot T0div}} = 256 - {{1ms \times 4MHz} \over {4 \times 8}} = 131
Luego de esto dentro del main debes hacer lo siguiente
void main(void){
...
setup_timer_0(T0_INTERNAL|T0_DIV_8);
set_timer0(131);
enable_interrupts(INT_TMR0);
enable_interrupts(GLOBAL);
...
}
Y en la funcion de interrupcion que debe ir arriba del main debes poner lo siguiente
int msec,sec,min,hor;
#int_timerX
void imprimir_cronometro(){
set_timer0(131);
lcd_gotoxy(1,7); //Imprimira valor en la posicion 1,7
printf(lcd_putc,"%02u",msec);//Imprime el valor de mseccon ceros
if(msec++>99){ //incrementa el valor de msec y si es mayor a 99
msec=0; //pone msec a 0.
lcd_gotoxy(1,4); //Imprimira valor en la posicion 1,4
printf(lcd_putc,"%02u",min);//Imprime el valor de sec con ceros
if(sec++>59){
sec=0;
lcd_gotoxy(1,1); //Imprimira valor en la posicion 1,1
printf(lcd_putc,"%02u",min);//Imprime el valor de min con ceros
if(min++>60){
min=0;
lcd_gotoxy(1,4); //Imprimira valor en la posicion 1,4
printf(lcd_putc,"%02u",min);//Imprime el valor de hor con ceros
if(hor++>23){
hor=0;
}
}
}
}
}
Debido a que en los lenguajes de alto nivel es imposible saber cuanto tarda con exactitud cada instrucción deberas modificar el valor de TIMER0 hasta que la temporización sea de 1ms, es decir debes cambiar el valor de 131 a otro.