Diese Tastatur gibts für ca. 8 € bei Conrad oder ELV oder beim Händler um die Ecke...
Eine Folientastatur mit 3x4 Matrix soll abgefragt werden. Wird eine Taste gedrückt, werden die Leitungen an den Kreuzungspunkten verbunden. Beispiel: Wird Taste 5 gedrückt, besteht zwischen Pin 2 und Pin 6 eine Verbindung. Um die gedrückte Taste zu ermitteln, können nacheinander die Spalten bzw. Zeilen mit einem Prüfsignal (z.B. log. 1) beschaltet werden. Das Signal liegt bei einer gedrückten Taste dann in einer der Zeilen bzw. Spalten an. Folgende Anschlussbelegung für den µController wurde festgelegt:
Tastatur-Pin | NC | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Port-Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Ein-/Ausgang | E | A | A | A | E | E | E | E |
Es werden nun zyklisch nacheinander die Ausgangs-Port-Bits 4,5,6 mit log. 1 beschaltet, je nach gedrückter Taste ergeben sich daraus die Zustände der Eingangs-Port-Bits 3,2,1,0. Welchen Zustand hat ein unbeschalteter Eingang (PullUp, PullDown)... Wenn wir die eingebauten PullUp-Widerstände verwenden, dann führt eine Zeile ohne gedrückte Taste den Logikpegel 1.
Mögliche Problemfälle:
Es werden mehrere Tasten in einer Spalte gedrückt (z.B. 1 und 4) dann ist zwar nicht klar, welche Taste gemeint ist, aber es wird richtig erkannt.
Es werden mehrere Tasten in einer Zeile gedrückt (z.B. 1 und 2). Kann zum "Kurzschluss" führen! Sei Pin 1 log. 1 und Pin 2 log. 0 welcher Zustand ist dann an Pin 7 zu erkennen? Kann verhindert werden in dem man immer nur eine Spalte als Ausgang schaltet und das Signal 0 ausgibt. Alle anderen sind mit PullUp-Widerstand als Eingänge programmiert...
Tastatur-Code
Es zeigen sich nun am Port spezifische Muster, eine gedrückte Taste erzeugt einen Code (z.B. für Taste 1 -> 0b10111110). Will man nur auf genau eine gedrückte Taste reagieren so ergeben sich folgende gültige Codes:
Taste | 1 | 2 | 3 |
---|---|---|---|
Code | 0b1011 1110 | 0b1101 1110 | 0b1110 1110 |
Taste | 4 | 5 | 6 |
Code | 0b1011 1101 | 0b1101 1101 | 0b1110 1101 |
Taste | 7 | 8 | 9 |
Code | 0b1011 1011 | 0b1101 1011 | 0b1110 1011 |
Taste | * | 0 | # |
Code | 0b1011 0111 | 0b1101 0111 | 0b1110 0111 |
Zum leichteren Verarbeiten könnte man * als 10 und # als 11 kodieren.
Nacheinander die Spalten abfragen
Waum nicht die Zeilen? Weil es nur drei Spalten sind...
Eigentlich ein Problem für ein Schaltwerk..
Dekodieren der Tastatur-Codes
Eigentlich ein Problem für ein Schaltnetz..
Wir programmieren eine Mehrfach-Verzweigung oder Switch-Anweisung..
Oder betreibe binäre Suche, ist hier aber weniger sinnvoll da die Codes sehr gestreut sind..
Oder das Prinzip der inversen Matrix (Tabelle): Baue Tabelle (Array) mit 12 Einträgen, die Codes der Tasten, wir können das sinnvoll nur im SRAM tun, hätten wir die LPM z+ Befehle könnten wir direkt Datenfelder aus dem Programmspeicher nehmen.. Gehe nun Tabelle durch und vergleiche Eintrag[i] mit Code, stimmen beide überein dann ist Ausgabe der Index i des Eintrags.
Oder sei genial und finde Weisheit für bessere Lösung..
Tasten-Prellen
Warteschleifen als Unterprogramm
Ausgeben auf 7-Segment-Anzeige mit einer Stelle
Mit Tabelle (Array) im SRAM
Oder mit IJMP oder ICALL.
Ausgeben auf 7-Segment-Anzeige mit mehreren Stellen
Ausgeben auf Matrix-Anzeige