Rückgabe von Getkbd() - BASIC

OP #592427
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!
Persönliche Seite #592445
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") :-)
OP #592449
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
#592453
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.
OP #592457
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?
#592468
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.

OP #592474
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?
#592487
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

...
OP #592488
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
OP #592534
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?
#592738
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren