Paso 4: El código
Adjunto está el código.
El verdadero quid de la escritura ocurre en una función que debe llamarse cada bucle. Esta función comprueba exactamente un botón. Envía un patrón de bits para el registro de desplazamiento que desactiva todos los botones excepto el botón de un objetivo de este lazo. A continuación se comprueba el estado de la clavija de entrada en este momento: si es alta, se presiona este botón, si no es bajo el botón. Luego compara este estado contra el estado anterior de este botón para decidir si el usuario acabo de hacer algo nuevo o no. Almacena el estado de este botón y avanza un índice para que el botón siguiente en orden será comprobado en el siguiente bucle. También incluí un temporizador por lo que puede ajustar la secuencia de comandos para uso de la CPU vs sensibilidad de botón.
Me avisas si encuentras algún error.
Espero que esto ayuda a cualquier persona que se enfrenta con el problema de la necesidad de manejar la entrada de un gran número de botones utilizando el menor número de pines de Arduino. Estoy muy interesado en oír de alguien que ha resuelto este problema de otras maneras.