#include <16f628A.H>
// Fuses
#fuses NOMCLR
#fuses INTRC_IO
#FUSES NOWDT //No Watch Dog Timer
//#FUSES XT //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES RESERVED //Used to set the reserved FUSE bits
// Set de clock para que el compilador calcule correctamente los delays
// OJO no es que el valor que pongamos aca es la frecuencia que va a tener el PIC
// Solo se usa para calcular los delays
#use delay (clock=4000000)
// Define para simplificar la lectura
#define display_1 PIN_B6
#define display_2 PIN_B5 // ok
#define display_3 PIN_B4
#define display_4 PIN_B7
// Prototipos de funcion
void visualiza(void);
void Teclado(void);
//Variables de conteo
unsigned int UnidadesDisp1= 0;
unsigned int DecenasDisp1 = 0;
unsigned int UnidadesDisp2 = 0;
unsigned int DecenasDisp2 = 0;
unsigned int tiempo = 1;
unsigned int botones_ahora;
unsigned int botones_previo = 0;
// Programa Principal
void main(void)
{
//Aca el setup poner todos los pines como digitales
while (true)
{
Teclado(); // Un solo lugar de desde donde se toma los datos
visualiza(); //Un solo lugar de desde dond ese visualiza
}
}
// Rutina para mostrar los datos en los displays
void visualiza(void)
{
output_low(display_4);
output_a(DecenasDisp1);
output_high(display_1);
delay_ms(tiempo);
output_low(display_1);
output_a(UnidadesDisp1);
output_high(display_2);
delay_ms(tiempo);
output_low(display_2);
output_a(DecenasDisp2);
output_high(display_3);
delay_ms(tiempo);
output_low(display_3);
output_a(UnidadesDisp2);
output_high(display_4);
delay_ms(tiempo);
}
// Rutina que lee los botones y incrementa los valores
void Teclado(void){
botones_ahora = input_b() & 0x03;
// Pregunto por si cambio , y si estan presionado ambos. de esa forma si ambos estan presionados no le doy importancia.
if((botones_ahora != botones_previo) && (botones_ahora != 0x03) )
{
switch(botones_ahora){
case 0x00: // Se soltaron todos no hago nada
break;
case 0x01: // Presionado RB0
UnidadesDisp1++;
break;
case 0x02: // Presionado RB1
UnidadesDisp2++;
break;
default: // Por si las dudas
break;
}
botones_previo = botones_ahora; // Guardo como estaban los botones ahora
if(UnidadesDisp1>9) DecenasDisp1++; // Corrijo unidades si se necesita
if(UnidadesDisp2>9) DecenasDisp2++;
if(DecenasDisp1>9) DecenasDisp1=0; // Corrijo decenas
if(DecenasDisp2>9) DecenasDisp2=0;
}
}