// clock = 4000000 Hz
// Tosc = (1 / clock)
//
// Tiempo = 4 x Tosc x Valor a contar en Timer0 + 1 x Rango del Divisor
// Tiempo = 4 x 0.00000025 x 256 x 16 = 4.096mS // Timer 8 bits a 4MHz
// Valor de inicio para Timer0 = 256 - 256 = 0
#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES MCLR //Master Clear pin enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#use fast_io(b)
#define MedioSeg 125 // 125 x 4mS = 0,5 Seg
#define T1 10
#define T2 8
#define T3 6
int1 Boton1 = false, Boton2 = false, Boton3 = false, MedSegs = false, Nuevo = false;
int Contador = 0, Segs = 0;
#int_RB
void RB_isr(void)
{
Nuevo = true;
int actual;
actual = input_b();
if ((!bit_test(actual,4))&&(bit_test(actual,5))&&(bit_test(actual,6))&&(bit_test(actual,7)))
{
Boton1 = true;
Boton2 = false;
Boton3 = false;
}
if ((bit_test(actual,4))&&(!bit_test(actual,5))&&(bit_test(actual,6))&&(bit_test(actual,7)))
{
Boton1 = false;
Boton2 = true;
Boton3 = false;
}
if ((bit_test(actual,4))&&(bit_test(actual,5))&&(!bit_test(actual,6))&&(bit_test(actual,7)))
{
Boton1 = false;
Boton2 = false;
Boton3 = true;
}
}
#int_TIMER0
void TIMER0_isr(void)
{
if(Nuevo)
{
Contador = 0;
MedSegs = false;
Segs = 0;
Nuevo = false;
set_timer0(0);
}
Contador++;
if(Contador == MedioSeg)
{
MedSegs++;
if(MedSegs)
Segs++;
Contador = 0;
}
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16); // 4mSeg. aprox.
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
enable_interrupts(INT_RB);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
set_tris_b(0xF0);
while(true)
{
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
while(Boton1)
{
output_low(PIN_B1);
output_low(PIN_B2);
if(!MedSegs)
output_high(PIN_B0);
else
output_low(PIN_B0);
if(T1 == Segs)
{
MedSegs = false;
Boton1 = false;
}
}
while(Boton2)
{
output_low(PIN_B0);
output_low(PIN_B2);
if(!MedSegs)
output_high(PIN_B1);
else
output_low(PIN_B1);
if(T2 == Segs)
{
MedSegs = false;
Boton2 = false;
}
}
while (Boton3)
{
output_low(PIN_B0);
output_low(PIN_B1);
if(!MedSegs)
output_high(PIN_B2);
else
output_low(PIN_B2);
if(T3 == Segs)
{
MedSegs = false;
Boton3 = false;
}
}
}
}