1.4 KiB
1.4 KiB
Tasten-Matrix
Dateien: hal/matrix.h, hal/matrix.cpp, config/pins.h
Hardware
5×5-Matrix mit externer 10-kΩ-Pullup-Beschaltung auf den COL-Leitungen (immer HIGH im Ruhezustand). Dioden zwischen Schalter-DO und ROW-Leitung (Anode = Schalter, Kathode = ROW) verhindern Geistertasten bei Mehrfachdrücken.
Scan-Prinzip: ROW LOW treiben → gedrückter Schalter zieht zugehörige COL durch Diode auf LOW.
Scan-Logik
für jede ROW r:
ROW r → OUTPUT LOW
warte 10 µs (Einschwingen)
für jede COL c:
raw = (digitalRead(COL[c]) == LOW)
Debounce prüfen
ROW r → INPUT (hochohmig, Pullup-Freigabe)
ROW-Pins wechseln zwischen OUTPUT-LOW (während Scan) und INPUT (hochohmig) – kein dauerhaftes LOW.
Debounce
- 10 ms, Software-seitig pro Taste
- Flanken-Erkennung: Zustandsänderung (raw) wird mit Timestamp notiert
- Erst nach 10 ms stabiler neuer Zustand wird
s_debouncedaktualisiert und der Callback aufgerufen - Callback:
matrix_cb(key_id, pressed)→CEventQueue::push(KEY_DOWN / KEY_UP)
Key-ID-Berechnung
key_id = col * MATRIX_ROWS + row
// col 0–4, row 0–4
// key_id 0–4: Encoder-SW (COL_0)
// key_id 5–24: MX-Buttons (COL_1–4)
Kontext
- Läuft im Loop-Kontext (kein ISR)
- Encoder-SW-Tasten gehen durch denselben Matrix-Pfad (COL_0)
matrix_scan()wird einmal proloop()aufgerufen