Hola estalli2
Te cuento, el código que pusiste tiene algunos errores como por ejemplo que al hacer la cuenta en un bucle, no hace otra cosa que contar y mostrar los displays, lo que estas haciendo es: decrementas la unidad en 1 y muestras los displays, decrementas otra vez y vuelves a mostrar los displays. Esto hace que la cuenta sea muy rápida.
Para contar segundos lo que tienes que hacer es precisamente eso, decrementar cada segundo y entre cuenta y cuenta, mostrar muchas veces los displays sino no verias nada, te dejo el codigo que hice, cuenta aproximadamente cada 1 segundo por medio del timer0.
#include <16F628.h>
#USE DELAY( CLOCK=4000000)
#FUSES XT,NOWDT,NOPROTECT,NOPUT
#USE fast_IO (B)
#USE fast_IO (A)
byte CONST DISPLAY[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //codigo para bcd
int Numero[2];
int Cifra;
int1 Pulso;
int1 anPulso;
int1 Flag;
int Tiempo;
#define Cat_U PIN_A0
#define Cat_D PIN_A1
#define Tecla PIN_A4
#int_rtcc
void isr(){ // cada 1024 ciclos salta esta interrupcion
if(--Tiempo>200){ // Decrementa Tiempo y se pasa de 0
Tiempo=60; // Pone Tiempo a 60
Disable_interrupts(int_rtcc); // y detiene la cuenta
Flag=False; // desactiva el flag
}
}
void main(void){
int tmp;
set_tris_b(0x00);
set_tris_a(0x10);
setup_timer_0(rtcc_internal|rtcc_div_4);
disable_interrupts(int_rtcc);
enable_interrupts(GLOBAL);
Flag=false;
WHILE(true){
tmp=tiempo/10;
Numero[1]=tmp;
Numero[0]=Tiempo-(tmp*10);
if (++Cifra>1)Cifra=0; //En cada iteracion muestra la decena o la unidad
output_high(Cat_U);
output_high(Cat_D);
OUTPUT_B(DISPLAY[Numero[Cifra]]);
if (Cifra==1)output_low(Cat_D); else output_low(Cat_U); // Activando los respectivos
// cátodos
if (Input(Tecla)) Pulso=true; else Pulso=false; // Si se pulso B4 carga pulso con true
// sino con false
if (Pulso&&!anPulso){ // Si Pulso es true y anPulso es false
// (La primera vez que detecta la pulsacion)
if (Flag){ // Si el Flag está activado
Disable_interrupts(int_rtcc); // detiene la cuenta
}else{ // Si el flag no está activado
Tiempo=60; // Pone el tiempo a 60
Enable_interrupts(int_rtcc); // y activa la cuenta
}
Flag=!Flag; // invierte el estado del flag
}
AnPulso=Pulso; // Para que detecte la pulsacion 1 sola vez.
delay_ms(10); // pausa entre iteracion e iteracion
}
}
Si hay algo que no se entienda me lo dices.
saludos.