Aparte de los "errores tipográficos" y el desorden en el código, el problema principal parece ser que usted asume que la entrada es una forma de onda de encendido / apagado perfecta. Si los bordes de entrada ascendentes o descendentes tienen "rebote", su código verá múltiples entradas para períodos de rebote que son largos en comparación con el tiempo de bucle. Como su tiempo de bucle se encuentra a lo sumo en el rango de microsegundos, y el rebote puede ocurrir durante muchos milisegundos, tiene la "suerte" de ver un máximo de solo 3 conteos por cierre de interruptor.
Cuando los interruptores mecánicos se abren o se cierran, es muy común que no realicen una transición de encendido / apagado / apagado / encendido limpio, sino que los contactos literalmente "reboten" mecánicamente, de modo que un apagado / encendido / apagado múltiple. .. se genera la forma de onda. El número de rebotes suele ser 'varios', es decir, 2 o 3 o 4 o ... pero si un conmutador en particular gestionara 10 de rebotes no sería inesperado.
La forma habitual de lidiar con el 'cambio de conmutador' es utilizar un sistema de rebote (sin sorpresa). Esto puede ser en hardware de software. En muchos casos, tiene sentido hacerlo en software, ya que es esencialmente "gratuito" una vez implementado y se puede ajustar si es necesario por cualquier motivo.
El rebote del hardware se puede hacer asegurando que una línea de señal unida lenta / de baja frecuencia alimente una compuerta activada por Schmitt. El aumento lento de la caída asegura que las transiciones de rebote de Amy se reduzcan en amplitud y que la entrada activada de Schmitt solo acepte cambios que sean mayores que las amplitudes de la señal de rebote. Una entrada de disparador Schmitt sin filtro de entrada puede tener el efecto de asegurar que algunos rebotes alcancen al menos amplitudes de riel a riel cuando originalmente eran más pequeñas.
La función de rebote de software, que puede lograr fácilmente aquí, funciona retrasando la aceptación de un cambio de entrada hasta que los efectos causados por rebote hayan terminado.
Usaré cambios de bajo a alto a continuación, pero el método es esencialmente el mismo para cambios de alto a bajo. Tenga en cuenta que las características de los cambios bajo-alto y alto-bajo pueden diferir debido a los circuitos utilizados. En su ejemplo, un cambio alto = bajo es causado por un cierre de interruptor duro a Vdd, por lo que será rápido ya que la capacitancia del nodo se cargará rápidamente por la ruta de contacto del interruptor de baja resistencia. Sin embargo, las transiciones de alta a baja, ya sea desde la liberación del interruptor O desde los rebotes mientras se opera el interruptor por primera vez, serán más lentas, ya que la resistencia desplegable necesita descargar la capacitancia del pin. Esta diferencia puede afectar la forma en que los cierres de interruptores y las liberaciones de interruptores actuales rebotan.
Un método simple para el debouncing bajo-alto es no aceptar una entrada que PUEDE estar siendo debouncing. Por observación u hoja de datos, se puede saber que los rebotes no se producen en el peor de los casos después de 5 ms después de presionar el interruptor. Si se ve un "1" después de un período de inactividad, entonces el interruptor DEBE haber sido presionado. Si espera 10 ms (el doble de tiempo que en el peor caso de rebote aquí) y luego procesa el "1", no se contabilizarán los rebotes. Esto tiene el efecto de retrasar la acción del interruptor, que puede no ser un problema, y de "volar a ciegas", que también puede no ser un problema.
Se puede saber que los rebotes ocurren con no más de 1 ms entre ellos como máximo, PERO pueden continuar durante 2 o 3 o ... quizás a veces 20 rebotes. Esto se puede superar probando el rebote cada 2 ms y en bucle hasta que no se vea ningún rebote. Esto conlleva pruebas entre rebotes y ser engañado. Mejor es probar continuamente por, digamos, 2 ms y comenzar de nuevo si se ve un rebote.
Se pueden idear esquemas más complejos, y la búsqueda de "rebotar" encontrará muchos ejemplos, pero los métodos anteriores funcionarán bien en muchos casos.