Essendo un ingegnere di software embedded di lunga data, devo dire che la tua supposizione che il debounc toglierà un po 'di potenza di elaborazione dalla mia applicazione è semplicemente errata. Questo non sarà mai vero per nessun firmware scritto in modo competente.
Naturalmente, il debouncing richiederà una certa elaborazione. Tuttavia l'elaborazione è banale e per l'input dell'utente avverrà a un tasso di aggiornamento così basso da essere del tutto trascurabile. Se fosse necessario eseguire l'antirimbalzo degli input con velocità di aggiornamento in decine di kHz, forse l'elaborazione per l'antirimbalzo sarebbe significativa, ma un essere umano che preme i pulsanti non ha bisogno di nulla di simile a quel tipo di risoluzione. Nel tuo caso, il campionamento a 100 Hz sarebbe abbastanza veloce e potresti quasi certamente ridurre il campionamento a 10 Hz senza compromettere seriamente la tua interazione con l'utente.
Se stai cercando di eseguire l'elaborazione degli input in un ciclo di controllo principale che funziona a decine di kHz, ovviamente risuccherai potenza di elaborazione. La soluzione corretta è scrivere un firmware che non lo faccia in questo modo, non utilizzare una soluzione hardware per correggere un anti-pattern software. Un uso appropriato dei timer e delle priorità di interrupt ti darà ciò di cui hai bisogno.
Puoi ottimizzare l'elaborazione assicurandoti che la rilettura sia tutta su una porta I / O. Supponendo che tu stia impostando i livelli sulle colonne e rileggendo le righe, quindi bit-AND, bit-shift e bit-OR per creare un valore a 16 bit per i 16 pin. XOR questo con il precedente valore a 16 bit, e se questo è diverso da zero, qualcosa è cambiato. Un semplice algoritmo antirimbalzo è solo quello di impostare un contatore su un valore se i pin cambiano stato, scegliere uno stato se i pin hanno mantenuto il loro stato e il contatore è zero e decrementare se non è zero.
Devi controllare che sia premuto un solo pulsante, ovviamente. Se hai un processore ARM, l'ARM ha un'istruzione per segnalare quanti bit sono impostati, il che è l'ideale per questo. Parlo solo per un'ulteriore ottimizzazione.