PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tastaturmatrix abfragen



andysafe
07.11.2004, 10:54
Hallo

Ich habe von Pollin das Display mit den 8 Tasten und möchte diese Tasten auch gerne nutzen.
Lt. Anleitung sind sie folgendermaßen angeschloseen.

SW1=K1+K2
SW2=K1+K3
SW3=K1+K4
SW4=K1+K5

SW5=K6+K2
SW6=K6+K3
SW7=K6+K4
SW8=K6+K5

Die Frage ist nun wie fragt man am besten und effektivsten ab , welche Taste gedrückt wurde.

Irgendwo habe ich mal gelesen das man das wie folgt macht.

Alles auf high
dann die erste Zeile auf low und die Spalten abfragen ob einer auf high gegangen ist
wenn nicht dann zeile wieder auf high und die nächste auf low
so geht man alle zeilen durch bis irgenwann eine Spalte auf high geht, damit hat man dann die Spalte raus.
danach folgt dann das spiel mit den Spalten und so bekommt man dann auch die entsprechende Zeile raus.

Aber wie programmiert man das am besten.
Ich habe einen ATMega 16 und die Tastenleitungen an port d angeschlossen
pd2= K1
pd3= K2
pd4= K3
pd5= K4
pd6= K5
pd7= K6

Besten Dank erstmal

Andreas

albundy
07.11.2004, 14:29
In der Bascom Hilfe ist ein gutes Beispiel für eine 4x4 Matrix.
Ist eigendlich recht einfach ...
CONFIG KBD = PORTx , DEBOUNCE = value , rows=6, row5=pinD.6, row6=pind.7
< Spalten und Zeilen einstellen >
VAR = GETKBD()
< Tastatur abfragen >

andysafe
07.11.2004, 14:58
Ja, das hab ich auch schon gelesen
Aber ich habe doch 4x2
desweiteren will ich am mega16 portd nehmen und muß pd0 und pd1 auf ausgang lassen wegen Rx,Tx
der letzte teil von config kdb dient ja nur dazu um es auf 6 reihen zu erweitern

Gruß Andreas

andysafe
07.11.2004, 17:21
Ich habe es mittlerweile hinbekommen

Bei Interesse kann ich den Code auch gerne Posten

Vielen Dank nochmal

Andreas

albundy
07.11.2004, 17:22
>Aber ich habe doch 4x2
Ist doch egal, es sind eh alle Kontakte offen, lass doch einfach 2 Reihen weg.

>desweiteren will ich am mega16 portd nehmen und muß pd0 und pd1 auf ausgang lassen wegen Rx,Tx
Ist doch auch egal, nimm mit Config einen anderen Port.

albundy
07.11.2004, 17:29
Sorry, ich sehe gerade unsere Posts haben sich überschnitten.
Wie hast du es nun gemacht ? Würde mich interessieren

andysafe
08.11.2004, 17:22
So sieht der Code dafür jetzt aus


Do
Goto Taste
Loop

Taste:
Dim Z As Integer
Dim S As Integer

Ddrd = &B10000110
Portd = 255
Do
For S = 0 To 1
If S = 0 Then Portd.2 = 0
If S = 1 Then Portd.7 = 0
If Pind.3 = 0 Then
If S = 0 Then
Lcd "Taste 1 gedrueckt"
Else
Lcd "Taste 5 gedrueckt"
End If
End If
If Pind.4 = 0 Then
If S = 0 Then
Lcd "Taste 2 gedrueckt"
Else
Lcd "Taste 6 gedrueckt"
End If
End If
If Pind.5 = 0 Then
If S = 0 Then
Lcd "Taste 3 gedrueckt"
Else
Lcd "Taste 7 gedrueckt"
End If
End If
If Pind.6 = 0 Then
If S = 0 Then
Lcd "Taste 4 gedrueckt"
Else
Lcd "Taste 8 gedrueckt"
End If
End If
If S = 0 Then
Portd.2 = 1
Else
Portd.7 = 1
End If
Next
Locate 1 , 7
Loop
End

Immer wenn ich dann eine Taste drücke, steht im Display welche.

Allerdings, was ich nicht so recht nachvollziehen kann ist, das es erst funktioniert wenn ich die Spalte auf 0 lege anstatt auf 1.
Irgendwie hatte ich das andersrum gedacht, nähmlich mit portd.2=1 5V auf die Leitung geben(also High machen).

Vielleicht habe ich die Systematik eines MicroCs doch noch nicht so richtig verstanden.

Gruß Andreas

albundy
09.11.2004, 10:52
Hallo Andreas,
Ich habe mir das mal angesehen und etwas vereinfacht.
Ich hoffe durch die Kommentare, verstehst du jetzt, warum die Spalten auf "0" gesetzt werden müssen.


Ddrd = &B10000100
Portd = &HFF
'bei den Eingängen Pullup's ein und Ausgänge auf high

Dim Spalte As Byte
Dim Zeile As Byte
Dim Taste As Byte
'Jetzt sind alle Portpins "1". Wenn eine Taste gedrückt wird passiert nichts!

Do
For Spalte = 0 To 1

'Deshalb wird jetzt jeweils 1 Spalte "0" gesetzt
If Spalte = 0 Then Reset Portd.2
If Spalte = 1 Then Reset Portd.7
For Zeile = 3 To 6
Select Case Zeile
'ist jetzt eine Taste gedrückt,wird der entsprechende Eingang auch "0"

Case 3 : If Pind.3 = 0 Then Taste = Spalte + 1
'Portd.2=0 und Pind.3=0 => Taste1 / Portd.7=0 und Pind.3=0 => Taste2

Case 4 : If Pind.4 = 0 Then Taste = Spalte + 3
'Portd.2=0 und Pind.4=0 => Taste3 / Portd.7=0 und Pind.4=0 => Taste4

Case 5 : If Pind.5 = 0 Then Taste = Spalte + 5
Case 6 : If Pind.6 = 0 Then Taste = Spalte + 7
End Select
Next
Portd = &HFF
Next
Locate 1 , 1
Lcd "Taste " ; Taste ; " gedrueckt"
Loop

End

andysafe
09.11.2004, 17:38
Diese For Schleife hatte ich am Anfang auch drin.Aber was mich daran stört ist, das das Programm 4x alle 4 Zeilen bei der selben Spalte abfragt. Und das ist doch eigentlich Zeitverschwendung,oder?

Ich habe meine Code jetzt auch noch ein bißchen verändert, uzw in der Form das sobald eine Taste erkannt wurde die Schleifen ,also die For Schleife für die Spalten , und dann die Do-Loop Schleife verlassen werden.
Das warten dient der entprellung

Hier der Code


Taste:
Dim Z As Integer
Dim S As Integer

Ddrd = &B10000110
Portd = 255
Taste = 0
Do
For S = 0 To 1
If S = 0 Then Portd.2 = 0
If S = 1 Then Portd.7 = 0
If Pind.3 = 0 Then
If S = 0 Then
Taste = 1
Else
Taste = 5
End If
End If
If Pind.4 = 0 Then
If S = 0 Then
Taste = 2
Else
Taste = 6
End If
End If
If Pind.5 = 0 Then
If S = 0 Then
Taste = 3
Else
Taste = 7
End If
End If
If Pind.6 = 0 Then
If S = 0 Then
Taste = 4
Else
Taste = 8
End If
End If
If S = 0 Then
Portd.2 = 1
Else
Portd.7 = 1
End If
If Taste > 0 Then Exit For
Next
Loop Until Taste > 0
Waitms 100
Return

Ich denke mal schon das man das noch ein wenig optimieren kann, aber kommt Zeit kommt Rat.
Ich habe ja auch erst damit angefangen mich mit MicroCs zu beschäftigen.
Programmieren tue ich ja schon ein paar Jahre.
Und mein Konzept ist eigentlich immer , erstmal das Grobschema so das es funktioniert und dann der Feinschliff ,Schritt für Schritt.

Aber ich bin auf alle Fälle für jede Form der Hilfe dankbar.

Gruß Andreas