Ansteuerung eines Tastenfeldes

Allgemeines und Aufbau   Programmbeispiel  
Die Ausgabe von Daten über ein LCD-Display haben wir behandelt. Somit steht ein universelles und flexibles Ausgabemedium zur Verfügung - was fehlt ist ein ebenso universelles Eingabemedium. Die Eingabe von einzelnen Tastendrücken über einzelne IO-Lines ist so unkomfortabel wie verschwenderisch. Praktischer ist es, eine Tastatur mit Matrixverschaltung zu verwenden, um zum Beispiel Zahleneingaben oder Menüsteuerungen zu implementieren. Die Ansteuerung einer solchen Tastatur beschreibt diese Seite.

Allgemeines und Aufbau

Tastenfelder in Matrixverschaltung sind fogendermaßen aufgebaut: Jede Taste ist ein einfacher Schalter, jeder dieser Schalter schließt eine Spalte mit einer Zeile der Matrix zusammen. Die Abfrage geschieht also dadurch, daß zunächst alle Zeilen bis auf eine auf high geschaltet werden - da die IOs des 2051ers über interne Pullups verfügen, ist eine nicht beschaltete IO-Line also ebenfalls high. Dies stellt man im nächsten Schritt fest: alle Spalten werden darauf hin überprüft, ob eine low ist, dann ist die Tastste diejenige, die sich im Schnittpunkt der auf low geschalteten Zeile und der ermittelten Spalte ergibt. Dann setzt man die nächste Zeile auf low und testet so die gesamte Matrix nacheinander durch.
Ein Problem der Matrix sei auch nicht verschwiegen: wenn der Anwender mehrere Tasten gleichzeitig drückt, so verbindet man mehrere Spalten und Zeilen und erhält unter Umständen die falsche Taste zurückgeliefert. Vermeiden läßt sich dieses Verhalten, wenn man jeden Anschluß des Tastenfeldes an den Microcontroller mit jeweils einer Diode durchführt. Dadurch erhöht sich aber der Bauteilaufwand um eine Diode für jede Zeile und Spalte.
zurück zum Anfang

Beispiel

Dieses Beispiel ist nur ein aus einem größeren Programm entlehnt - funtioniert daher nicht selbständig. Die Tastatur ist in diesem Beispiel ist in 3 Spalten und 4 Zeilen organisiert. Die Zeilen sind an P1.7 bis P1.4 angeschlossen, die Spalten mit P1.2 bis P1.0 verbunden. Wenn keine Taste gedrückt ist, gibt diese Funktion 0 im ACC und 1 im Carry-Flag zurück, ansonsten das ASCII-Zeichen der gedrückten Taste und 0 im Carry.
Prinzipiell läuft diese Funktion nach dem folgenden Schema ab: zunächst wird der Datenpointer mit dem Anfang des Datenfeldes und ein Zähler mit 1 initialisiert. Dieser wird dann negiert ausgegeben. Dann werden alle 3 Spalten überprüft, wobei nach jeder
erfolglosen Abfrage der DPTR incrementiert wird. Wurden alle Spalten abgefragt, wird der Zähler um ein Bit nach links rotiert, so dass das eine gesetzte Bit um eine Stelle weiterwandert. Ist die so erhaltene Zahl 16, so wurden alle Zeilen abgefragt und die Funktion kehrt erfolglos zurück, ansonsten wird die Abfrageschleife von neuem durchlaufen. Wenn einmal ein Spaltenwert 0 ist, also eine Taste gedrückt wurde, so kehrt die Funktion mit dem Wert des Datenfeldes, auf dem der immer mitgeführte DPTR steht, zurück.
getkey:
; eingänge auf input
        mov P1,#11110111b
; alte registerwerte sichern
        push 0
        push DPL
        push DPH
; zähler setzen
        mov R0,#1
        mov DPTR,#Tastaturdaten

; zähler ausgeben
key_put_couter:
        mov a,R0
        swap a
        cpl a
        clr ACC.3
        mov P1,a
Bild der Tastatur

; ergebnis abfragen
        jnb P1.0, key_erg        
        inc DPTR
        jnb P1.1, key_erg        
        inc DPTR
        jnb P1.2, key_erg        
        inc DPTR

; zähler um eine stelle weitersetzen
        mov a,R0
        rl a
        cjne a,#16,key_not_ready
        ajmp key_fertig

key_not_ready:
        mov R0,a
        ajmp key_put_couter

key_erg:
        clr c
        mov a,#0
        movc a,@a+DPTR
        pop DPH
        pop DPL
        pop 0
        ret

key_fertig:
        setb c
        clr a
        pop DPH
        pop DPL
        pop 0
        ret

Tastaturdaten:
        db '*0#'
        db '789'     
        db '456'
        db '123'
zurück zum Anfang

Seite zurück Startseite Seite vor
Erik Buchmann
EMail an: Owner@ErikBuchmann.de