Sers, ich habe eine 4x4 Matrix aufgebaut. Diese ist am Port B von meinem Mega32 angeschlossen! Nun möchte ich mit dem Bascom-Befehl Getkbd() die gedrückte Taste auslesen. Ich weiß, dass der RÜckgabewert 16 ist, wenn keine Taste gedrückt ist. Aber wie errechnet die Funktion den Rückgabewert, wenn doch eine Taste gedrückt ist? (ich muss das ja dann mit if else usw. verarbeiten können) abe in der Bascom Hilfe und bei Google nichts gefunden. Danke schonmal!
AVR wrote: > > Matrix Tastatur > > http://bascom-forum.de/index.php/topic,10.msg150.html#msg150 da war ich jetzt schon oft genug drauf. allerdings hilft mir das auch nicht weiter..
den hab ich mir auch schon angeschaut da steth nix von getkbd(). ist es so, dass ich 1 erhalte, wenn ich die erste taste drücke, 2 bei der zweiten usw...?
Zu den Widerständen, die auf einem Matrix-bild zu sehen sind: (Zitat aus dem Bascom-Forum da) >> braucht man die widerstände da alle? > besser ist das -du must dir mal vorstellen die ports besser gesagt pins > werden fortwährend umgeschaltet mal sind die ausgang um High auf die Matrix > zu legen dann wieder eingang um auf einen tastendruck zu horchen -beim > umschalten kann es kurzzeitig zu kurzschlüssen kommen, > deswegen auch die wiederstände. Ähem, also Entschuldigt mal, aber.... Wenn man geschickt ist (was ich dem BASCOM-Ersteller jetzt mal zutraue), dann macht man keine Kurzschlüsse bei dieser Variante. Die Widerstände sind doch quark. @Simon: Warum willst du unbedingt die eingebaute Funktion benutzen? Du scheinst damit ja nicht klar zu kommen (Zum Glück muss ich nicht versuchen damit klarzukommen). Bau das ganze doch händisch auf. (Ich glaube das versucht dir AVR klarzumachen mit dem "Text in dem grauen Kasten da") :-)
AVR wrote: > nee die funktion geht ohne getkey und ist viel besser jetzt bin ich durcheinander. meinst du die getkbd oder die da?
1 | $regfile = "m8def.dat" ' ATmega8 |
2 | $crystal = 3690000 ' für STK500 |
3 | $baud = 19200 |
4 | |
5 | Config Portb = Input ' PB3-PB0 Eingang |
6 | Portb = &HFF ' PullUp aktiv |
7 | |
8 | Ddrd = &HE0 ' PBD7-PB5 Ausgang |
9 | |
10 | Dim S As String * 12 |
11 | S = "123456789*0#" |
12 | Dim Ss As String * 1 |
13 | |
14 | Dim Column As Byte |
15 | Dim Row As Byte |
16 | Dim Key As Byte ' Variable enthält Tastennummer |
17 | |
18 | Declare Function Query_matrix() As Byte |
19 | |
20 | Do |
21 | Key = Query_matrix() ' Abfrage der Tastaturmatrix |
22 | If Key <> 0 Then |
23 | Ss = Mid(s , Key , 1) |
24 | Print "Taste " ; Key ; " = " ; Ss ' Anzeige der gelesenen Taste |
25 | End If |
26 | Waitms 500 |
27 | Loop |
28 | |
29 | End |
30 | |
31 | Function Query_matrix() As Byte |
32 | Key = 0 |
33 | For Column = 0 To 2 |
34 | Portd = &HE0 |
35 | If Column = 0 Then Reset Portd.5 |
36 | If Column = 1 Then Reset Portd.6 |
37 | If Column = 2 Then Reset Portd.7 |
38 | For Row = 4 To 7 |
39 | Select Case Row |
40 | Case 4 : Debounce Pinb.3 , 0 , Calc_key , Sub |
41 | Case 5 : Debounce Pinb.2 , 0 , Calc_key , Sub |
42 | Case 6 : Debounce Pinb.1 , 0 , Calc_key , Sub |
43 | Case 7 : Debounce Pinb.0 , 0 , Calc_key , Sub |
44 | End Select |
45 | Next |
46 | Next |
47 | Query_matrix = Key |
48 | End Function Query_matrix() |
49 | |
50 | Calc_key: |
51 | Select Case Row |
52 | Case 4 : Key = Column + 1 |
53 | Case 5 : Key = Column + 4 |
54 | Case 6 : Key = Column + 7 |
55 | Case 7 : Key = Column + 10 |
56 | End Select |
57 | Return |
Simon Hat einen nick wrote: > den hab ich mir auch schon angeschaut > da steth nix von getkbd(). > > ist es so, dass ich 1 erhalte, wenn ich die erste taste drücke, 2 bei > der zweiten usw...? Wenns schon nicht in der Doku steht, .... wie wäre es mit ausprobieren? Programmier noch eine Uart dazu und lass dir den Tastendruck ausgeben.
ja die ist super -die funktion rechnet die tasten gleich richtig aus das ergebnis ist in der Key stelle
Uart geht nicht, da ich keineTeile dafür da habe. >ja die ist super -die funktion rechnet die tasten gleich richtig aus das >ergebnis ist in der Key stelle Danke. Wenn ich jetzt also die erste Taste drücke (Position 1/1), was erhalte ich dann für ein Ergebnis?
besser gesagt: hast du ein code-beispiel, mit dem alle 16 tasten per switch case oder if-else-konstrukte verarbeitet werden?
Simon Hat einen nick wrote: > Uart geht nicht, da ich keineTeile dafür da habe. > Dann halt irgendeine andere Ausgabe. Irgendwas wirst du ja wohl haben. Sei doch nicht so unkreativ
du solltest echt erst mal anfangen LEDs zu schalten- mach bitte erst den grundlehrgang mit so hat das keinen zweck und dann in einem monat besser 2 mit der matrix tastatur wieder anfangen.
LEDs schalten geht schon lange, genau wie einzelne Tasten abfragen (ohne matrix). Ich will doch nur wissen, welche Taste gedrückt wurde.
Simon Hat einen nick wrote: > LEDs schalten geht schon lange, genau wie einzelne Tasten abfragen (ohne > matrix). > Ich will doch nur wissen, welche Taste gedrückt wurde. Und was hindert dich jetzt daran, da an einen Port ein paar Leds anzuhängen und das Ergebnis vom Getkeybs oder welche Funktion du auch immer benutzt einfach mal auszugeben? Mann. Selbsthilfe ist angesagt, nicht alles auf einem Silbertablett servieren lassen. In der Zeit, die du hier alleine für diese Frage rumgetrödelt hast, hättest du das mit ein paar Leds aber 20 mal feststellen können.
Simon Hat einen nick wrote: > Ich will doch nur wissen, welche Taste gedrückt wurde. Dan hänge eine Leiste LEDs (mit Widerständen) an einen der 4 Ports Deines Mega32, gib die Dich interessierende Variable an diesem Port aus und lies sie binär ab. Wo also ist das Problem??? ...
>Und was hindert dich jetzt daran, da an einen Port >ein paar Leds anzuhängen und das Ergebnis vom Getkeybs oder >welche Funktion du auch immer benutzt einfach mal auszugeben? da sind wir auch schon beim problem! Wie? Wie greif ich auf das Ergebnis zu? >Mann. Selbsthilfe ist angesagt, nicht alles auf einem >Silbertablett servieren lassen. In der Zeit, die du >hier alleine für diese Frage rumgetrödelt hast, hättest >du das mit ein paar Leds aber 20 mal feststellen können. Würde es so gehen, dass - wenn - ich den Wert irgendwie verarbeiten kann, dass ich dann mit einer schleife entsprechend viele Impulse auf meine Biärdekoder gebe und so an meiner 7-Segment-Anzeige habe?
Simon Hat einen nick wrote: >>Und was hindert dich jetzt daran, da an einen Port >>ein paar Leds anzuhängen und das Ergebnis vom Getkeybs oder >>welche Funktion du auch immer benutzt einfach mal auszugeben? > > da sind wir auch schon beim problem! > Wie? Wie greif ich auf das Ergebnis zu? Du liest es binär ab. Ist doch ganz einfach. Jede LED hat ihre Wertigkeit, abhängig davon, an welchem Bit des Ports sie angeschlossen ist. Diese Wertigkeiten sind von Bit0 bis Bit7: 1, 2, 4, 8, 16, 32, 64, 128. Das gewünschte Ergebnis ist die Summe der Werigkeiten der leuchtenden LEDs. Du wirst doch wohl in der Lage sein, diese paar Zahlen zu addieren, oder??? > > >>Mann. Selbsthilfe ist angesagt, nicht alles auf einem >>Silbertablett servieren lassen. In der Zeit, die du >>hier alleine für diese Frage rumgetrödelt hast, hättest >>du das mit ein paar Leds aber 20 mal feststellen können. > > Würde es so gehen, dass - wenn - ich den Wert irgendwie verarbeiten > kann, dass ich dann mit einer schleife entsprechend viele Impulse auf > meine Biärdekoder gebe und so an meiner 7-Segment-Anzeige habe? Ja, das geht, ist aber komplizierter. Ich mache sowas gelegentlich auf 8-Pin-AVRs: http://www.hanneslux.de/avr/mobau/uiwa/uiwa.html http://www.hanneslux.de/avr/mobau/7ksend/7ksend02.html ...
>Simon Hat einen nick wrote: >>>Und was hindert dich jetzt daran, da an einen Port >>>ein paar Leds anzuhängen und das Ergebnis vom Getkeybs oder >>>welche Funktion du auch immer benutzt einfach mal auszugeben? >> >> da sind wir auch schon beim problem! >> Wie? Wie greif ich auf das Ergebnis zu? > >Du liest es binär ab. Ist doch ganz einfach. Jede LED hat ihre >Wertigkeit, abhängig davon, an welchem Bit des Ports sie angeschlossen >ist. Diese Wertigkeiten sind von Bit0 bis Bit7: 1, 2, 4, 8, 16, 32, 64, >128. Das gewünschte Ergebnis ist die Summe der Werigkeiten der >leuchtenden LEDs. Du wirst doch wohl in der Lage sein, diese paar Zahlen >zu addieren, oder??? ja, wie das Binärsystem funktioniert, das weiß ich ja. Mein Problem liegt nicht in der Ausgabe! Sondern in der Erfassung der Werte, die mir die Funktion zurückliefert
So. Jetzt habe ich das alles umgeschrieben und wenn ich das Programm draufgespielt habe, dann leuchtet die LED an Portc.0 immer. (Blinkt nicht) Was ist da falsch?
1 | $regfile = "m32def.dat" |
2 | $framesize = 32 |
3 | $swstack = 32 |
4 | $hwstack = 32 |
5 | $crystal = 1000000 |
6 | |
7 | Config Portb = Input |
8 | Config Portc.0 = Output ' PB3-PB0 Eingang |
9 | Portb = &HFF ' PullUp aktiv |
10 | |
11 | Ddrd = &HE0 ' PBD7-PB5 Ausgang |
12 | |
13 | Dim S As String * 16 |
14 | S = "1234567890*/+-=C" |
15 | Dim Ss As String * 1 |
16 | |
17 | Dim Column As Byte |
18 | Dim Row As Byte |
19 | Dim Key As Byte ' Variable enthält Tastennummer |
20 | |
21 | Declare Function Query_matrix() As Byte |
22 | |
23 | Do |
24 | Key = Query_matrix() ' Abfrage der Tastaturmatrix |
25 | If Key <> 0 Then |
26 | Portc.0 = 1 |
27 | Waitms 1000 |
28 | Portc.0 = 0 |
29 | Waitms 1000 |
30 | Elseif Key = 5 Then |
31 | Portc.0 = 1 |
32 | Waitms 100 |
33 | Portc.0 = 0 |
34 | Waitms 100 |
35 | 'Ss = Mid(s , Key , 1) |
36 | 'Print "Taste " ; Key ; " = " ; Ss ' Anzeige der gelesenen Taste |
37 | End If |
38 | |
39 | Loop |
40 | |
41 | End |
42 | |
43 | Function Query_matrix() As Byte |
44 | Key = 0 |
45 | For Column = 0 To 3 |
46 | Portd = &HE0 |
47 | If Column = 0 Then Reset Portd.5 |
48 | If Column = 1 Then Reset Portd.6 |
49 | If Column = 2 Then Reset Portd.7 |
50 | If Column = 3 Then Reset Portd.0 |
51 | For Row = 4 To 7 |
52 | Select Case Row |
53 | Case 4 : Debounce Pinb.3 , 0 , Calc_key , Sub |
54 | Case 5 : Debounce Pinb.2 , 0 , Calc_key , Sub |
55 | Case 6 : Debounce Pinb.1 , 0 , Calc_key , Sub |
56 | Case 7 : Debounce Pinb.0 , 0 , Calc_key , Sub |
57 | End Select |
58 | Next |
59 | Next |
60 | Query_matrix = Key |
61 | End Function Query_matrix() |
62 | |
63 | Calc_key: |
64 | Select Case Row |
65 | Case 4 : Key = Column + 1 |
66 | Case 5 : Key = Column + 4 |
67 | Case 6 : Key = Column + 7 |
68 | Case 7 : Key = Column + 10 |
69 | End Select |
70 | Return |
habe ich es richtig verstanden, dass das Dim S As String * 16 S = "1234567890*/+-=C" eigentlich nur zur Ausgabe der Taste dient?
Simon Hat einen nick wrote: >>Und was hindert dich jetzt daran, da an einen Port >>ein paar Leds anzuhängen und das Ergebnis vom Getkeybs oder >>welche Funktion du auch immer benutzt einfach mal auszugeben? > > da sind wir auch schon beim problem! > Wie? Wie greif ich auf das Ergebnis zu? Ich denke du hast schon mal mit LEDs gespielt? Kann nicht sonderlich intensiv gewesen sein Config PortB = Output ... PortB = GetKeybd() > > Würde es so gehen, dass - wenn - ich den Wert irgendwie verarbeiten > kann, dass ich dann mit einer schleife entsprechend viele Impulse auf > meine Biärdekoder gebe und so an meiner 7-Segment-Anzeige habe? Oh Mann. Sieh doch erst mal zu, dass du die einfachen Dinge lösen kannst, bevor du dich an den komplizierteren Dingen versuchst.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.