#define Tuni PORTEbits.RE1 // Se define como "Tuni" al pin RE0.
#define Tdec PORTEbits.RE0 // Se define como "Tdec" al pin RE1.
#define Pulsador PORTBbits.RB0 // Se define como "Pulsador" al pin RB0.
void visualizar (); // Se declara la funcion visualizar.
const char numeros[] = {63,6,91,79,102,109,125,7,127,103};
char EsUnidad = 0; // Variable que guarda el numero de la decena.
int interrupciones = 0; // Variable para visualizar los numeros cada 1 segundo.
int pausa = 1; // Variable para pausa/despausa.
int cuenta = 30; // Variable que lleva el numero que se muestra en los displays.
void main ()
{
TRISD = 0x00; // Se configuran los pines, donde estan conectados los displays, como salida.
TRISBbits.RB0 = 1; // Se configura el pin "RB0", el cual se conecta al pulsador, como entrada.
ADCON1bits.PCFG0 = 0;
ADCON1bits.PCFG1 = 1;
ADCON1bits.PCFG2 = 1;
ADCON1bits.PCFG3 = 0;
T0CON = 0x04; // Configuracion del registro del timer0 Preescaler 1:32.
TMR0H = 0xFE; // Valores de ""10ms"" para distintos valores de oscilador:
TMR0L = 0xC8; // 4Mhz: 0xFEC8 8Mhz: 0xFD8F 10Mhz: 0xFCF3 20Mhz: F9E6
T0CONbits.TMR0ON = 1; //Activo el TMR0
INTCON = 0xB0; // Configuracion del registro de interrupciones.
while(1)
{
}
}
void visualizar()
{
if(EsUnidad)
{
Tdec = 0;
PORTD = numeros[cuenta%10];
Tuni = 1;
}
else
{
Tuni = 0;
PORTD = numeros[cuenta/10];
Tdec = 1;
}
}
void interrupt isr ()
{
/*
* Seccion de interrupcion del Timer0
*/
if (INTCONbits.TMR0IF == 1) // Si se activa la interrupcion por timer.
{
INTCONbits.TMR0IF = 0; // Se Limpia la bandera
TMR0H = 0xFE; // Recargo el Timer, para que vuelvan a ser 10ms
TMR0L = 0xC8;
visualizar(); // Se muestra el numero de la cuenta en los displays.
if(pausa == 0) // Esta corriendo?, si es asi sigo contando hasta que pase el segundo
{
interrupciones++;
if(interrupciones >= 100) // 100 * 10ms = 1s , si paso el segundo procedo a decrementar.
{
interrupciones = 0;
cuenta--; // La cuenta disminuye un numero.
if(cuenta == 0)
{
pausa = 1; // Si llego al final lo pauso por las dudas
}
}
}
}
/*
* Seccion de interrupcion de RB0
*/
if (INTCONbits.INT0IF == 1) // Si se activa la interrupcion externa.
{
if( cuenta == 0) // Si la cuenta es igual a 0.
{
cuenta = 30; // Reinicia la cuenta, volviendo a 30.
}
else
{
pausa ^= 1; // Si es 0 lo deja en 1, si es 1 lo deja en 0. es decir es pausa XOR 0b0000 0001
}
INTCONbits.INT0IF = 0; // Se baja la bandera de interrupcion por timer.
}
}