Hallo!
Es ist die Frage aufgetaucht, wie man ein typisches 3x4 Tastenfeld (eine Nummerntastatur) mit Bascom einlesen kann.
Bascom hat dafür bereits einen HighLevel-Befehl eingebaut. So etwas wie DEBOUNCE, nur für eine Tastenmatrix bis zu 4x4 Tasten (oder sogar bis 6x4 Tasten) --> GETKBD. Ich habe mir vor kurzem so ein Tastenfeld bei Conrad besorgt, welches ich zum Testen verwende. Wenn jemand einen Händler weiß, der diese Dinger günstiger verkauft (auch nach Österreich), dann bitte her mit der Information. :-) Denn über 6 Euro für so etwas ist doch etwas viel. Erst recht, wenn man es nur zum Testen braucht.
Das Datenblatt dieses 3x4-Tastenfeldes kann man sich bei Conrad herunterladen.
Die Spalte mit der "1" ist die erste Spalte. Die Spalte mit der "2" ist die zweite Spalte und die Spalte mit der "3" ist die dritte Spalte. Die Zeile mit der "1" ist die erste Zeile. Die Zeile mit der "4" ist die zweite Zeile. Die Zeile mit der "7" ist die dritte Zeile und die Zeile mit dem Stern ("*") ist die vierte Zeile. Mit dieser Erklärung möchte ich Verwechslungen vorzeitig ausschließen. -- Bitte nicht lachen, das ist alles schon passiert.
Für so eine Tastaturmatrix wird ein ganzer Port (8 Pins) benötigt. Auch wenn man für diese 3x4 Tastaturmatrix nur sieben Pins braucht. Aber der achte Pin wird bei jedem Durchlauf ebenfalls abgefragt. Da wir für die UART-Verbindung die beiden Pins PD0 und PD1 brauchen, bleibt nur mehr der PORT B übrig. Da beim ATmega8 ein externer Quarz an PB6 und PB7 angeschlossen wird, bleibt uns nichts anderes übrig, als auf den externen Quarz zu verzichten. Wer einen ATmega16 oder ATmega32 hat, kann dort natürlich auch andere, noch freie PORTs verwenden.
Der Bascom-Befehl GETKBD ist für die Abfrage so einer Tastaturmatrix zuständig. Und mit CONFIG KBD stellt man den Port ein, an dem die Tastaturmatrix angeschlossen wurde. Wer keinen ganzen Port übrig hat, muss auf diese HighLevel-Befehle verzichten und die Tastenabfrage händisch programmieren. Wie so etwas geht, wird im Buch "Programmieren der AVR RISC Mikrocontroller mit Bascom-AVR" von Claus Kühnel genau erklärt.
Wenn du GETKBD nachbilden möchtest, dann musst du eine Routine schreiben die in etwa so vorgeht: Zuerst werden die Pins der Zeilen als Eingang mit internem PullUp-Widerstand definiert. Die Pins der Spalten werden als Ausgänge definiert und auf HIGH gesetzt. Zum Testen wird zuerst der Ausgang für die Spalte 1 auf LOW gesetzt. Dann wird geprüft ob der Eingang für die erste Zeile LOW oder HIGH ist (nimmt man dafür DEBOUNCE, dann wird es einfacher). Dann der Eingang für die zweite Zeile, dann die dritte und zuletzt die vierte Zeile. Dann wird der Ausgang der Spalte 1 wieder auf HIGH gesetzt und das Spiel beginnt mit der zweiten Spalte wieder von vorne. Irgendwann ist man alle Zeilen-/Spalten-Kombinationen durch und weiß welche Taste gedrückt wurde.
Mit diesem Befehl stellt man den Port ein, an den die Tastaturmatrix angeschlossen wurde. Man kann damit die Matrix auch auf 6x4 Tasten erweitern, die DEBOUNCE-Zeit und ein Delay einstellen.
Beispiel:
Config Kbd = Portb , Debounce = 20 , Delay = 10
Diese Einstellung liefert bei meiner Conrad-3x4-Tastaturmatrix ein recht gutes Ergebnis. Man muss sich natürlich ein wenig spielen um die optimale Einstellung für das eigene Tastastenfeld heraus zu finden. Zuallererst würde ich es einfach mal ohne die Parameter Debounce
und Delay
probieren.
Bascom Hilfe zu diesem Befehl: http://avrhelp.mcselec.com/index.html?config_kbd.htm
Dieser Befehl ist dafür zuständig, die Tastaturmatrix abzufragen und gibt einen Keycode für die empfangene Taste zurück. Wird kein Tastendruck erkannt, dann wird als Keycode die Zahl 16 zurück gegeben. Es wird also nicht der Text zurück gegeben, der auf der Taste steht, sondern es wird eine Zahl zurück gegeben, die die gedrückte Taste identifiziert. Diese Taste muss später noch dem Text, der auf der Taste steht, zugeordnet werden.
Beispiel:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 2400
Dim Keycode As Byte
Config Kbd = Portb , Debounce = 20 , Delay = 10
Do
Keycode = Getkbd()
If Keycode <> 16 Then
Print Keycode
Waitms 200
End If
Loop
End
GETKBD scannt in der MainLoop den mit CONFIG KBD angegebenen Port nach einem Tastendruck. Immer wenn nichts gedrückt wurde, dann wird der Keycode 16 zurück geliefert.
Vorsicht!
Achtung! Der Bascom-Simulator liefert 15 zurück -- warum auch immer.
Der gescannte KeyCode wird mit Print verschickt. Wichtig in diesem Code ist die Zeile WAITMS 200
, die sich darum kümmert, dass bei einem kurzen Tastendruck nicht hunderte mal der Keycode abgefragt und über die UART übertragen wird.
Bascom Hilfe zu diesem Befehl: http://avrhelp.mcselec.com/index.html?getkbd.htm
Zur Erinnerung! GETKBD() liefert nicht das zurück, was auf der Tastatur steht, sondern die Position der Taste.
Die Einfachste Art, aus dem Keycode den Text der Taste zurück zu bekommen ist MID. Der Befehl MID kann aus einem Text einen Teil rausholen. Und das sieht als Beispiel so aus:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 2400
Dim Keycode As Byte
Dim Asciichars As String * 16
Config Kbd = Portb , Debounce = 20 , Delay = 10
Asciichars = "123 456 789 *0# "
Do
Keycode = Getkbd()
If Keycode <> 16 Then
Print Keycode
Keycode = Keycode + 1
Print Chr(34) ; Mid(asciichars , Keycode , 1) ; Chr(34)
Waitms 200
End If
Loop
End
MID beginnt mit der Zählung bei 1 und nicht bei 0. Deshalb muss man die Rückgabe des Befehls GETKBD zuerst um 1 erhöhen. Bascom Hilfe zu diesem Befehl: http://avrhelp.mcselec.com/index.html?mid.htm
CHR gibt ein Zeichen zurück wenn man es mit ASCII-Code füttert. 34 ist der ASCII-Code für das doppelte Anführungszeichen ("). Bascom Hilfe zu diesem Befehl: http://avrhelp.mcselec.com/index.html?chr.htm
Das ist mein Versuchsaufbau:
mfg Gerold :-)
Den zugehörigen Original-Beitrag findest du im Loetstelle-Forum.
Ich programmiere Progressive Web Applications, Mobile Apps, Desktop-Programme und noch vieles mehr. Falls es dich interessiert, findest du mehr Informationen darüber auf meiner Business-Website.