# 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_debounced` aktualisiert und der Callback aufgerufen - Callback: `matrix_cb(key_id, pressed)` → `CEventQueue::push(KEY_DOWN / KEY_UP)` ## Key-ID-Berechnung ```cpp 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 pro `loop()` aufgerufen