Hast du schon einen Timer-Interrupt laufen, der auch noch während der Zeitdauer minimal kurzer Tastendrücke mehrfach aufgerufen wird? Z.B. alle 1..10 Millisekunden? Wenn ja, prima; wenn nein, müsstest du eine soche Zeitbasis in deinem Programm einrichten.
In der Interruptroutine (ISR) wird dann die Portleitung der Taste bei jedem Durchlauf einmal gelesen. Ist sie gerade aktiv, wird eine Variable key_count um eins erhöht, weiter nichts.
Wenn die Portleitung bei einem späteren ISR-Durchlauf nicht mehr aktiv ist, wird der Tastvorgang als abgeschlossen betrachtet und es wird ausgewertet:
- ON-Zeit kleiner z.B. 20ms ist nur Kontaktprellen und wird ignoriert, key_count wird gelöscht.
- ON-Zeit 20..250ms wird als gültiger Tastendruck interpretiert, es wird eine Variable à la key_event mit einem Wert ungleich Null beschrieben und der Zähler key_count wieder gelöscht.
key_event ist ein Signal an das pollende (Haupt-)Programm, daß ein gültiger Tastendruck erfolgte.
Das Hauptprogramm prüft key_event <> 0, inkrementiert ggf. einen eigenen Ereigniszähler und löscht seinerseits das von der ISR gelieferte und nun verwertete Tastenevent key_event.