Я недавно делал клавиатуру и светодиодную индикацию к прибору. Там все просто и сделано на сдвиговых регистрах. В прерывании переполнения таймера (которое возникает с определенным периодом) вызываю функцию, которая выдвигает (и одновременно задвигает) несколько байт по SPI. В результате в определенной области памяти имею своего рода видео память для светодиодов и образ/сканкоды нажатых клавиш. Все получается аппаратно.