Forum: Mikrocontroller und Digitale Elektronik Rückgabe von Getkbd() - BASIC


von S. H. (fat32)


Lesenswert?

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!

von AVR (Gast)


Lesenswert?


von S. H. (fat32)


Lesenswert?

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..

von AVR (Gast)


Lesenswert?

nee das ist neu

von S. H. (fat32)


Lesenswert?

du meinst den code im grauen kasten?

von AVR (Gast)


Lesenswert?

jaaaaaaaaaaaaaaaaaaaaaaaa

von S. H. (fat32)


Lesenswert?

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...?

von AVR (Gast)


Lesenswert?

nee die funktion geht ohne getkey und ist viel besser

von Simon K. (simon) Benutzerseite


Lesenswert?

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") :-)

von AVR (Gast)


Lesenswert?

ja diese funktion braucht keine widerstände

von S. H. (fat32)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von AVR (Gast)


Lesenswert?

ja die ist super -die funktion rechnet die tasten gleich richtig aus das 
ergebnis ist in der Key stelle

von S. H. (fat32)


Lesenswert?

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?

von S. H. (fat32)


Lesenswert?

besser gesagt: hast du ein code-beispiel, mit dem alle 16 tasten per 
switch case oder if-else-konstrukte verarbeitet werden?

von Karl H. (kbuchegg)


Lesenswert?

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

von AVR (Gast)


Lesenswert?

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.

von S. H. (fat32)


Lesenswert?

LEDs schalten geht schon lange, genau wie einzelne Tasten abfragen (ohne 
matrix).
Ich will doch nur wissen, welche Taste gedrückt wurde.

von Karl H. (kbuchegg)


Lesenswert?

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.


von Hannes L. (hannes)


Lesenswert?

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???

...

von S. H. (fat32)


Lesenswert?

>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?

von Hannes L. (hannes)


Lesenswert?

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

...

von S. H. (fat32)


Lesenswert?

>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

von S. H. (fat32)


Lesenswert?

ich versuchs jetzt mit der 7Segm.Anzeige

von S. H. (fat32)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von pusher (Gast)


Lesenswert?

.

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
Noch kein Account? Hier anmelden.