www.mikrocontroller.net

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


Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: AVR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: AVR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nee das ist neu

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du meinst den code im grauen kasten?

Autor: AVR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jaaaaaaaaaaaaaaaaaaaaaaaa

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht 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...?

Autor: AVR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nee die funktion geht ohne getkey und ist viel besser

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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") :-)

Autor: AVR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja diese funktion braucht keine widerstände

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR wrote:
> nee die funktion geht ohne getkey und ist viel besser


jetzt bin ich durcheinander. meinst du die getkbd oder die da?
$regfile = "m8def.dat"                                      ' ATmega8
$crystal = 3690000                                          ' für STK500
$baud = 19200

Config Portb = Input                                        ' PB3-PB0 Eingang
Portb = &HFF                                                ' PullUp aktiv

Ddrd = &HE0                                                 ' PBD7-PB5 Ausgang

Dim S As String * 12
S = "123456789*0#"
Dim Ss As String * 1

Dim Column As Byte
Dim Row As Byte
Dim Key As Byte                                             ' Variable enthält Tastennummer

Declare Function Query_matrix() As Byte

Do
  Key = Query_matrix()                                      ' Abfrage der Tastaturmatrix
  If Key <> 0 Then
    Ss = Mid(s , Key , 1)
    Print "Taste " ; Key ; " = " ; Ss                       ' Anzeige der gelesenen Taste
  End If
  Waitms 500
Loop

End

Function Query_matrix() As Byte
  Key = 0
  For Column = 0 To 2
    Portd = &HE0
    If Column = 0 Then Reset Portd.5
    If Column = 1 Then Reset Portd.6
    If Column = 2 Then Reset Portd.7
    For Row = 4 To 7
      Select Case Row
        Case 4 : Debounce Pinb.3 , 0 , Calc_key , Sub
        Case 5 : Debounce Pinb.2 , 0 , Calc_key , Sub
        Case 6 : Debounce Pinb.1 , 0 , Calc_key , Sub
        Case 7 : Debounce Pinb.0 , 0 , Calc_key , Sub
      End Select
    Next
  Next
  Query_matrix = Key
End Function Query_matrix()

Calc_key:
  Select Case Row
    Case 4 : Key = Column + 1
    Case 5 : Key = Column + 4
    Case 6 : Key = Column + 7
    Case 7 : Key = Column + 10
  End Select
Return

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AVR (Gast)
Datum:

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

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: S. H. (fat32)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AVR (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: S. H. (fat32)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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???

...

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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

...

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich versuchs jetzt mit der 7Segm.Anzeige

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht 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?
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000

Config Portb = Input
Config Portc.0 = Output                                     ' PB3-PB0 Eingang
Portb = &HFF                                                ' PullUp aktiv

Ddrd = &HE0                                                 ' PBD7-PB5 Ausgang

Dim S As String * 16
S = "1234567890*/+-=C"
Dim Ss As String * 1

Dim Column As Byte
Dim Row As Byte
Dim Key As Byte                                             ' Variable enthält Tastennummer

Declare Function Query_matrix() As Byte

Do
  Key = Query_matrix()                                      ' Abfrage der Tastaturmatrix
  If Key <> 0 Then
  Portc.0 = 1
  Waitms 1000
  Portc.0 = 0
  Waitms 1000
  Elseif Key = 5 Then
  Portc.0 = 1
  Waitms 100
  Portc.0 = 0
  Waitms 100
           'Ss = Mid(s , Key , 1)
           'Print "Taste " ; Key ; " = " ; Ss                       ' Anzeige der gelesenen Taste
  End If

Loop

End

Function Query_matrix() As Byte
  Key = 0
  For Column = 0 To 3
    Portd = &HE0
    If Column = 0 Then Reset Portd.5
    If Column = 1 Then Reset Portd.6
    If Column = 2 Then Reset Portd.7
    If Column = 3 Then Reset Portd.0
    For Row = 4 To 7
      Select Case Row
        Case 4 : Debounce Pinb.3 , 0 , Calc_key , Sub
        Case 5 : Debounce Pinb.2 , 0 , Calc_key , Sub
        Case 6 : Debounce Pinb.1 , 0 , Calc_key , Sub
        Case 7 : Debounce Pinb.0 , 0 , Calc_key , Sub
      End Select
    Next
  Next
  Query_matrix = Key
End Function Query_matrix()

Calc_key:
  Select Case Row
    Case 4 : Key = Column + 1
    Case 5 : Key = Column + 4
    Case 6 : Key = Column + 7
    Case 7 : Key = Column + 10
  End Select
Return

habe ich es richtig verstanden, dass das

Dim S As String * 16
S = "1234567890*/+-=C"

eigentlich nur zur Ausgabe der Taste dient?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: pusher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.