#include <TimerOne.h>
int boton = 10;
int latchPin = 8;             //Pin connected to ST_CP of 74HC595
int clockPin = 12;            //Pin connected to SH_CP of 74HC595
int dataPin = 11;             //Pin connected to DS of 74HC595
byte numberToDisplay = B00000000;
int estado_boton;
int contador_numero = 0;

void setup() {                //set pins to output so you can control the shift register
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(boton, INPUT);

Serial.begin(9600);
Timer1.initialize(1000);                  //inicializo el tmr 1 cada 1000 ms
Timer1.attachInterrupt(Systick_handler); 
}

void loop() {
estado_boton = GPIO_estado();
Serial.println(estado_boton);
if(estado_boton == 0){
  contador_numero ++;
  if(contador_numero == 10){
    contador_numero = 0;
    }
}
 while(estado_boton == 0)
{
estado_boton = GPIO_estado();
Serial.println(estado_boton);
  }

}
void Systick_handler()                      //atencion a la ineterrupcion por TMR 1
{
  antirrebote();                            //funcion que revisa el estado del sensor filtrando los rebotes
  saca_valor();
 
}


                                            //variables a utilizar en el antirebote
int estado_filtrado;                        //estado final del pin a revisar
int estado_anterior = 1;                    //variable para comparar con el estado actual del pin
int estado_actual;                          //varuable para guardar el estado actual del pin
int contador = 0;                           //contador para llevar la cuenta del tiempo que el pin se mantine
                                            //sin cambiar


void antirrebote()                          //funcion que filtra los rebotes  
{
estado_actual = digitalRead(boton);    //leo el estado actual del pin a revisar
if(estado_actual == estado_anterior)        //es distinto respecto al estado anterior??
{
  contador ++;                              //si=> incremento el contador
  if(contador == 10)                        //llego a 10 el contador??
  {
    estado_filtrado = estado_actual;        //si llego => la señal se considera estable => guardo el estado final
   
     }
  }
else{                                       //la señal cambio de valor antes de que pase el tiempo del antirebote
  contador = 0;                             //reseteo el contador
  estado_anterior = estado_actual;          //guardo el estado actual como estado anterior
}

}

int GPIO_estado(void){                      //funcion que devuelve el estado final del pin
  return estado_filtrado;
}



void saca_valor(){

digitalWrite(latchPin, LOW);
switch (contador_numero){
  case 0:
    numberToDisplay=B00111111;
    break;
  case 1:
    numberToDisplay=B00000110;
    break;  
  case 2:
    numberToDisplay=B01011011;
    break;
  case 3:
    numberToDisplay=B01001111;
    break;
  case 4:
    numberToDisplay=B01100110;
    break;
  case 5:
    numberToDisplay=B01101101;
    break;
  case 6:
    numberToDisplay=B01111100;
    break;
  case 7:
    numberToDisplay=B00000111;
    break;
  case 8:
    numberToDisplay=B01111111;
    break;
  case 9:
    numberToDisplay=B01100111;
    break;
}

shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);
digitalWrite(latchPin, HIGH);
}
74HC595