#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);
}