//los 4 digitos del display se veran en las entradas:
int d1 =2;
int d2 =3;
int d3 =4;
int d4 =5;
//las partes del display:
int a=6;
int b=7;
int c=8;
int d=9;
int e=10;
int f=11;
int g=12;
int punto=13;
//luego tenemos los botones con los que interactua el usuario
int boton1=A0;
int boton2=A1;
volatile boolean ultimo_boton1=LOW;
volatile boolean pulso_boton1=LOW;
volatile boolean cambionEn_boton1=false;
volatile boolean ultimo_boton2=LOW;
volatile boolean pulso_boton2=LOW;
volatile boolean cambionEn_boton2=false;
//establecemos un contador y otras variables
long cont1=0;
int x=100;
int reset;
int reversa;
int cont2=0;
void setup()
{
//establecemos los pines como salidas
pinMode(boton1, INPUT_PULLUP);
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(punto, OUTPUT);
//escribimos en los 4 digitos del display
digitalWrite(d1, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
}
//vemos si el usuario presiona el boton1
boolean rebote1(boolean ultimo1){
boolean corriente1 = digitalRead(boton1);
if(ultimo1 !=corriente1){
delay(5);
corriente1=digitalRead(boton1);
}
return corriente1;
}
//vemos si el usuario presiona el boton1
boolean rebote2(boolean ultimo2){
boolean corriente2 = digitalRead(boton2);
if(ultimo2 !=corriente2){
corriente2=digitalRead(boton2);
}
return corriente2;
}
void loop()
{
//revisamos el boton1
pulso_boton1=rebote1(ultimo_boton1);
if (ultimo_boton1==LOW && pulso_boton1==HIGH){
cambionEn_boton1=!cambionEn_boton1;
}
ultimo_boton1=pulso_boton1;
//revisamos el boton2
pulso_boton1=rebote2(ultimo_boton2);
if (ultimo_boton2==LOW && pulso_boton2==HIGH){
cambionEn_boton2=!cambionEn_boton2;
}
ultimo_boton2=pulso_boton2;
//comenzamos a contabilizar el tiempo con el boton 1
if(cambionEn_boton1==false){
clearleds();
pickDigit(1);
//le decimos al contador de los minutos que sume 1 cada 600 digitos
pickNumber((cont1/x/600)%10);
delayMicroseconds(65);
clearleds();
pickDigit(2);
// le especificamos a los segundos que llegue hasta 60
pickNumber((cont1/x/100)%6);
delayMicroseconds(65);
clearleds();
pickDigit(3);
//contamos 10 milisegundos
pickNumber((cont1/x/10)%10);
delayMicroseconds(65);
clearleds();
pickDigit(4);
pickNumber(cont1/x%10);
delayMicroseconds(65);
cont1++;
}
//si el usuario presiona el boton detenemos el conteo para mostrar
//los valores actuales
if (cambionEn_boton1==true){
clearleds();
pickDigit(1);
pickNumber((cont1/x/600)%10);
delayMicroseconds(65);
clearleds();
pickDigit(2);
pickNumber((cont1/x/100)%6);
delayMicroseconds(65);
clearleds();
pickDigit(3);
pickNumber((cont1/x/10)%10);
delayMicroseconds(65);
clearleds();
pickDigit(4);
pickNumber(cont1/x%10);
delayMicroseconds(65);
}
//condicion para resetear el cronometro
reset=digitalRead(boton1);
if (reset==LOW){
cont2=cont2+1;
}
else{
reset= HIGH;
cont2=0;
}
//dejamos encendidos los 4 displays y borramos los contadores
if(cont2==1000){
digitalWrite(d1, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
eight();
delay(100);
clearleds();
delay(100);
eight();
delay(100);
clearleds();
delay(800);
cont2=0;
cont1=0;
cambionEn_boton1=!cambionEn_boton1;
}
//revisamos el boton2
pulso_boton2=rebote2(ultimo_boton2);
if (ultimo_boton2==LOW && pulso_boton2==HIGH){
cambionEn_boton2=!cambionEn_boton2;
}
ultimo_boton2=pulso_boton2;
//comenzamos a restar el tiempo actual con el boton 2
if(cambionEn_boton2==true){
clearleds();
pickDigit(1);
pickNumber((cont1/x/600)%10);
delayMicroseconds(65);
clearleds();
pickDigit(2);
pickNumber((cont1/x/100)%6);
delayMicroseconds(65);
clearleds();
pickDigit(3);
pickNumber((cont1/x/10)%10);
delayMicroseconds(65);
clearleds();
pickDigit(4);
pickNumber(cont1/x%10);
delayMicroseconds(65);
cont1--;
}
//si el usuario presiona el boton detenemos el conteo para mostrar
//los valores actuales
if (cambionEn_boton2==false){
clearleds();
pickDigit(1);
pickNumber((cont1/x/600)%10);
delayMicroseconds(65);
clearleds();
pickDigit(2);
pickNumber((cont1/x/100)%6);
delayMicroseconds(65);
clearleds();
pickDigit(3);
pickNumber((cont1/x/10)%10);
delayMicroseconds(65);
clearleds();
pickDigit(4);
pickNumber(cont1/x%10);
delayMicroseconds(65);
}
if(cont2==1000){
digitalWrite(d1, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
eight();
delay(100);
clearleds();
delay(100);
eight();
delay(100);
clearleds();
delay(600);
cont2=0;
cont1=0;
cambionEn_boton2=!cambionEn_boton2;
}
}
//creamos una funcion para cada uno de los casos
//del display (4)
void pickDigit(int pick1)
{
digitalWrite(d1, LOW);
digitalWrite(d2, LOW);
digitalWrite(d3, LOW);
digitalWrite(d4, LOW);
switch(pick1)
{
case 1:
digitalWrite(d1, HIGH);
break;
case 2:
digitalWrite(d2, HIGH);
break;
case 3:
digitalWrite(d3, HIGH);
digitalWrite(punto,LOW);
break;
default:
digitalWrite(d4,HIGH);
break;
}
}
void pickNumber(int pick2)
{
switch(pick2)
{
default:
zero();
break;
case 1:
one();
break;
case 2:
two();
break;
case 3:
three();
break;
case 4:
four();
break;
case 5:
five();
break;
case 6:
six();
break;
case 7:
seven();
break;
case 8:
eight();
break;
case 9:
nine();
break;
}
}
//creamos una funcion para cada numero del 0 al 9
//(esta ultima sacada de un ejemplo de la web...)
void clearleds()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(punto, HIGH);
}
void zero()
{
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
void one(){
digitalWrite(a,HIGH);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
}
void two(){
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,LOW);
}
void three(){
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,LOW);
}
void four(){
digitalWrite(a,HIGH);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
}
void five(){
digitalWrite(a,LOW);
digitalWrite(b,HIGH);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,HIGH);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
}
void six(){
digitalWrite(a,LOW);
digitalWrite(b,HIGH);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
}
void seven(){
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
}
void eight(){
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
}
void nine(){
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,HIGH);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
}
//Codigo por Jhon Castiblanco...