Como ingeniero de software integrado desde hace mucho tiempo, tengo que decir que su suposición de que el hecho de realizar un rebote tomará algo de poder de procesamiento de mi aplicación es simplemente incorrecta. Esto nunca será cierto para cualquier firmware escrito de forma competente.
Naturalmente, el rebote requerirá algún procesamiento. Sin embargo, el procesamiento es trivial, y para la entrada del usuario se llevará a cabo a una tasa de actualización tan baja que es absolutamente insignificante. Si necesita rebotar las entradas con velocidades de actualización en decenas de kHz, tal vez el procesamiento para el rebote sea significativo, pero un botón de pulsación humana no necesita nada como ese tipo de resolución. En su caso, el muestreo de 100Hz sería lo suficientemente rápido, y es casi seguro que podría dejarlo tan bajo como el muestreo de 10Hz sin afectar seriamente la interacción del usuario.
Si está tratando de hacer un procesamiento de entrada en un bucle de control principal que se ejecuta a decenas de kHz, por supuesto que absorberá la potencia de procesamiento. La solución correcta es escribir un firmware que no lo haga de esa manera, sin usar una solución de hardware para arreglar un anti-patrón de software. El uso adecuado de los temporizadores y las prioridades de interrupción le dará lo que necesita.
Puede optimizar el procesamiento asegurándose de que la lectura esté todo en un puerto de E / S. Suponiendo que está configurando niveles en columnas y leyendo las filas, entonces bit-AND, bit-shift y bit-OR para acumular un valor de 16 bits para los 16 pines. XOR esto con el valor de 16 bits anterior, y si no es cero, entonces algo cambió. Un simple algoritmo de rebote es simplemente establecer un contador en un valor si los pines cambian de estado, elegir un estado si los pines mantuvieron su estado y el contador es cero, y disminuir si no es cero.
Es necesario comprobar que solo se presiona un botón, por supuesto. Si tiene un procesador ARM, el ARM tiene una instrucción para informar cuántos bits están configurados, lo cual es ideal para esto. Solo mencionando para una optimización adicional.