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 >
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
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 >
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
Ich habe es mittlerweile hinbekommen
Bei Interesse kann ich den Code auch gerne Posten
Vielen Dank nochmal
Andreas
>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.
Sorry, ich sehe gerade unsere Posts haben sich überschnitten.
Wie hast du es nun gemacht ? Würde mich interessieren
So sieht der Code dafür jetzt aus
Immer wenn ich dann eine Taste drücke, steht im Display welche.Code: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
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
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.
Code: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
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
Ich denke mal schon das man das noch ein wenig optimieren kann, aber kommt Zeit kommt Rat.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 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
Lesezeichen