#include <16F628.h>
#fuses INTRC_IO, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#byte port_a=0x05
#byte port_b=0x06
#use fast_io(a)
#use fast_io(b)
#byte OSCCON = 0x8F
#byte OSCTUNE = 0x90
int8 num[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};
int8 display[4]={~0x01,~0x02,~0x04,~0x08};
int8 matriz[4], uni, dec, cen, umil;
int16 ms=0,seg=0,min=0;
int8 bocina=1;
#int_timer0
void isr()
{
ms++;
SET_TIMER0(7); //valor teorico 7
}
void bin2bcd(int16 valor)
{
uni=0;
dec=0;
cen=0;
umil=0;
while(valor>=1000)
{
valor-=1000;
umil++;
}
while(valor>=100)
{
valor-=100;
cen++;
}
while(valor>=10)
{
valor-=10;
dec++;
}
while(valor>=1)
{
valor-=1;
uni++;
}
}
void mostrar(int16 valor)
{
int i;
bin2bcd(valor);
matriz[0]=num[uni];
matriz[1]=num[dec];
matriz[2]=num[cen];
matriz[3]=num[umil];
for(i=0;i<=3;i++)
{
port_b = matriz[i] & ~(bocina << 7);
port_a = display[i];
delay_us(500);
}
}
void main()
{
int pausa=1;
OSCCON = 0x60; // Para fijar el oscilador a 4 MHz
OSCTUNE = 0x00; // Para calibrar la frecuencia a 4MHz "exactos"
set_tris_b(0x00); // todo puerto B como salida
set_tris_a(0x10); // RA4 como entrada
enable_interrupts(INT_RTCC);
disable_interrupts(GLOBAL);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4);
set_timer0(7);
while(TRUE)
{
mostrar(min*100+seg);
if(!input(PIN_A4))
{
delay_ms(10);
if(pausa)
enable_interrupts(GLOBAL);
else
disable_interrupts(GLOBAL);
pausa = !pausa;
while(!input(PIN_A4))
mostrar(min*100+seg);
}
//rutina acumuladora de min
if(ms >= 999)
{
ms=0;
if(seg++ >= 59)
{
seg=0;
min++;
}
}
//rutina de bocina
if( !pausa && (min==0 || min==7 || min==9 || min==14) && (seg >= 0 && seg < 5) )
bocina=0;
else
bocina=1;
}
}