Routinensammlung und Gewusst-wie für Mikrocontroller

Tastenmatrix an Mikrocontrollern

Es geht um den Anschluss vieler Tasten an einen Mikrocontroller. Grundsätzlich werden diese im Zeitmultiplexverfahren (zyklisch) abgefragt.

0. Grundsätzliches Schema

Die Tasten werden in einem mxn-Matrix angeordnet. Um möglichst wenig Anschlüsse für möglichst viele Tasten zu verwenden, wird eine quadratische Matrix angestrebt.

Download: Vektorformat
Bild 1: 4x4-Tastenmatrix im Schlafzustand (rot=LOW)

Der Spaltentreiber ist ein Ausgabeport, der Zeilenleser ein Eingabeport des Mikrocontrollers. Die stets erforderlichen Widerstände sind oft bereits im Eingabeport des Mikrocontrollers integriert oder zuschaltbar. Deshalb können sie in der Schaltung entfallen!

Daraus ergibt sich allerdings auch die Notwendigkeit, mit Low-aktiven Signalen zu arbeiten, da alle Mikrocontroller Hochzieh-Widerstände (Pull-Up) und nie Tiefzieh-Widerstände (Pull-Down) haben. Gelegentlich zu sehende Tastenmatrizen mit externen Pull-Up- oder gar Pull-Down-Widerständen zeugen von der Stümperhaftigkeit des Entwicklers.

Wichtig: Ohne Entkopplungsdioden ist nur die Erkennung einer oder zweier Tasten sicher möglich, nicht mehr! Für ein klavierartiges Musikinstrument siehe unten.

Die Trivialmatrix erfordert 2n Leitungen für n2 Tasten. Bei rechteckicken Matrizen ist das Verhältnis etwas ungünstiger, m+n Leitungen für m*n Tasten.

1. Ruhestromfreie Abfrage

Dazu wird in oben gezeigter Schaltung ein Eingabeport benötigt, welches auf allen Leitungen interruptfähig ist, und das im Tiefschlafmodus mit abgeschaltetem Oszillator. Diese Eigenschaft hat das Port B (Bits 4..7) des PIC-Mikrocontrollers. (ATmegaX8 sind ebenfalls geeignet.)

In Fernbedienungen wird ausschließlich diese Abfrageart verwendet.

Download: Vektorformat
Bild 2: µC aufgeweckt, weil Taste gedrückt

Wird irgendeine Taste gedrückt, wird ein Eingabe-Portpin nach LOW gezogen, der Microcontroller erwacht aus seinem Tiefschlaf, der Oszillator läuft an, und der Befehl nach SLEEP bzw. die Interruptroutine wird angesprungen.
Diese beginnt nun mit der spaltenweisen Abfrage.

Download: Vektorformat
Bild 3: Linke Spalte wird abgefragt: Pech!

Die nicht abgefragten Spalten bekommen ein schwaches HIGH oder werden hochohmig geschaltet, damit weitere gedrückte Tasten keine Kurzschlüsse zwischen Treiberausgängen bewirken!

Dabei wird so lange vorgegangen, bis eine gedrückte Taste erkannt wird.

Download: Vektorformat
Bild 4: Zweite Spalte wird abgefragt: Glück!

Eventuell ist gar keine Taste (mehr) gedrückt, dann ist nichts mehr zu tun.

Im Regelfall wird der Tastenkode verarbeitet und der entsprechende Befehl ausgeführt.

Das Erkennen des Loslassens aller Tasten erfolgt, indem der Ursprungszustand (alles LOW) des Spaltentreibers hergestellt wird. Dann müssen alle Zeilenleitungen HIGH werden.

2. Zwei gedrückte Tasten erkennen

Zwei Tasten lassen sich durch fortwährendes Spalten-Abfragen ermitteln. Sind die beiden Tasten in einer Spalte, ist auch mal mehr als eine Zeilenleitung aktiv.

Download: Vektorformat
Bild 5: Zwei Tasten sind problemlos

Mehr als 2 Tasten?

Mehr als 2 Tasten lassen sich nicht sicher auswerten!

Wenn im Bild 5 die Taste (2;2) gedrückt wird, ist es auf Grund des Kurzschlusses zwischen Spalte 2 und 3 sowie Zeile 2 und 3 für den Mikrocontroller nicht möglich, zwischen (2;2) oder (3;3) als dritte Taste zu unterscheiden.

Wird dagegen jede andere Taste gedrückt, ist deren Detektion nur eine Frage intelligenter Software.

3. Beliebige Tasten gleichzeitig

Dies erfordert Entkopplungsioden an jeder Taste. Es gibt Einzelkontakte, die diese Diode bereits integriert haben.

Download: Vektorformat
Bild 6: Alle Tasten sind hiermit kein Problem

Hierbei genügt ein reines Ausgabeport (bspw. eines Port-Expanders oder eines Schieberegisters) als Spaltentreiber, weil keine Kurzschlüsse durch mehrfache Tastendrücke möglich sind.

Ob die Software tatsächlich alle Tastenkombinationen auswertet ist Frage des Problems und des Geschmacks. Bei einem Klavier bspw. genügt es sicherlich, max. 10 gedrückte Tasten (für 10 Finger) zuzulassen.

4. Matrizen mit weniger Portpins

Bei Verzicht auf die Hauptdiagonale und Ersatz durch Dioden kann die Anzahl der Portpins halbiert werden.

Download: Vektorformat
Bild 7: Halbierte Portpin-Zahl, aber Dioden

Das Abfrageschema ist wie oben, nur dass die gerade aktivierte Spalte stets als aktive Zeile zurückkommt (muss ausmaskiert werden).
Zwei Tasten gleichzeitig gehen hier nicht!

Ein Schlafmodus ist mit dieser Schaltung nicht möglich! (Bestenfalls nur für einige bestimmte Tasten.)

Auf n Portpins kommen n2-n = n*(n-1) Tasten. Günstig für Kodeschlösser u. ä. ist die hier gezeigte Matrix mit 12 Tasten.
Eine Anreihung einer nach Masse gehenden Tastenreihe ist hier genauso möglich wie im folgenden Fall, das ergäbe n2, hier 16 Tasten.

5. Weniger Portpins ohne Dioden

Bei Verzicht auf eine halbe Matrix kann man, bei geschickter Software, auf die Dioden verzichten.

Download: Vektorformat
Bild 8: Keine Dioden

Hiermit ist keine Erkennung zweier Tasten möglich, Schlafmodus sowieso nicht. (Bestenfalls für die masseseitigen Tasten.) Es ist zwischen jeder Kombination zweier Portpins sowie nach Masse genau eine Taste.

Auf n Portpins kommen n*(n+1)/2 Tasten, hier sind es 10 Tasten.

6. Tasten, eingebettet in eine Zeitmultiplexsteuerung

Wird am Mikrocontroller eine LED-Anzeige im Zeitmultiplexbetrieb angeschlossen, empfiehlt sich die Tastenabfrage über einen oder mehrere Pseudo-Stellentreiber. Einmal pro Auffrischzyklus (nicht weniger, sonst flimmert's) werden die LED-Zeilentreiber auf Eingabe geschaltet und der Pseudo-Stellentreiber aktiviert. Alles andere ist dann wie in o. g. Grundschaltung, mit meist stark rechteckiger Auslegung.

7. Tasten mit gestuften Widerständen am A/D-Wandler

Diese Möglichkeit kommt bei kurzen Leitungsverbindungen in Betracht, weil sie enorm Verkabelungsaufwand im Gerät spart.
Um nicht lauter verschiedene Widerstände verwenden zu müssen, kann man eine Kette aus lauter gleichen Widerständen bilden und jede Anzapfung mit einem Taster nach Masse versehen. Am A/D-Wandler wird ein (etwa) Konstantstrom eingespeist.

Logisch, dass der Einschaltwiderstand der Taster wesentlich kleiner sein sollte als der Einzelwiderstand der Kette.

Diese Möglichkeit verlässt jedoch den Rahmen der Tasten-Matrix.

8. „Missbrauch“ einer Fernbedienung

Die Abfrage der Tastenmatrix und die zugehörigen Portpins kann man sich vereinfachen, indem ein externer Schaltkreis hierzu verwendet wird; entweder gleich eine (alte) Infrarot-Fernbedienung, oder dem entsprechenden Schaltkreis mit direkter Kopplung.
Entsprechendes gilt beim Einsatz von Port-Expandern und Schieberegistern.

Eine externe PC-Tastatur als gelegentliches Eingabemedium lässt bzgl. der Tastenanzahl keine Wünsche offen...


haftmann#software, 20.7.2004