3x4 Matrix-Tastatur - wichtige Fragen

OP #3706305
Lesenswert?

Hallo,

bin froh dass ich so ein Forum gefunden habe!

Ich möchte an meinem mikrocontroller eine Tastatur einlesen lassen (3x4 
Matrix), dies klappt auch soweit ganz gut.

Ich habe nur ein einziges Problem:

ich rufe meine Methode "getkey" auf und es wird ausgeführt, aber leider 
mehrmals :D

Wie kann ich es schaffen damit sie 1x aufgerufen wird und nur eine Taste 
abgefragt wird?


Meine Überlegung: Register einbauen, dass sobald eine Zahl eingegeben 
wurde das vorhandene Register zB (R5) inkrementiert und in der Abfrage 
wo ich dann meine Zahl haben will steht, dass es nur in "getkey" 
reinspringen darf wenn R5 < 2?
Jedes mal nachdem erfolgreich abgefragt wurde setzt es R5 wieder auf 0.

Greets
Gast #3706310
Lesenswert?

Sebastian Hauser schrieb:
> ich rufe meine Methode "getkey" auf und es wird ausgeführt, aber leider
> mehrmals :D

Wenn das so ist, wird es daran liegen, dass sie mehrmals aufgerufen 
wird.

> Wie kann ich es schaffen damit sie 1x aufgerufen wird und nur eine Taste
> abgefragt wird?

Kannst du den Satz noch mal auf deutsch formulieren, so mit Satzzeichen 
und so?

Und was ist dein "getkey" für eine Methode? Vielleicht macht sie etwas 
anderes, als du möchtest.
OP #3706350
Lesenswert?

Meine Methode "getkey" setzt jede Spalte nacheinander auf low, (alle 
anderen sind high), in dieser Spalte werden dann die Reihen 
durchgeprüft, es wird jeder Port gesetzt und sobald einer low geht 
(JNB), wird die jeweilige Taste in den Akku gespeichert.

Ist dies geschehen wird die Methode getkey durch "ret" wieder verlassen 
und im anderen Label von Zeile zu Zeile weiterabgearbeitet.
Gast #3706352
Lesenswert?

Peter.N schrieb:
> Darf ich diesen Satz, ohne Hinweis auf Copyright Verletzung und ohne
> Angabe des Authors, ungestraft woanders verwenden?

Keine Ahnung, von wem der Satz stammt. Von mir aus darfst du ihn gerne 
weiter verbreiten. Er beschreibt doch nur einen oft zu beobachten 
Sachverhalt ;-)
Gast #3706373
Lesenswert?

Sebastian Hauser schrieb:
> Wie kann ich es schaffen damit sie 1x aufgerufen wird und nur eine Taste
> abgefragt wird?

Nach deiner Beschreibung macht dein Programm genau das was Du möchtest:

Sebastian Hauser schrieb:
> Meine Methode "getkey" setzt jede Spalte nacheinander auf low, (alle
> anderen sind high), in dieser Spalte werden dann die Reihen
> durchgeprüft, es wird jeder Port gesetzt und sobald einer low geht
> (JNB), wird die jeweilige Taste in den Akku gespeichert.
>
> Ist dies geschehen wird die Methode getkey durch "ret" wieder verlassen
> und im anderen Label von Zeile zu Zeile weiterabgearbeitet.
OP #3706386
Lesenswert?

spess53 schrieb:
> Hi
>
>>Nimm das hier:
>>http://www.fritzler-avr.de/HP/Librarys/tastenplex_his.php
>
> Die mageren Informationen des TOs lassen auf Assembler schließen.
>
> @ Sebastian Hauser (seppl87)
>
> Zeig mal dene getkey-Routine. Wie sieht deine Entprellung aus.
>
> MfG Spess

Habe keine Entprellung drin, habe mir darüber schon Gedanken gemacht 
aber glaube nicht dass es zwingend notwendig ist oder?
Gast #3706394
Lesenswert?

Hi

>Habe keine Entprellung drin, habe mir darüber schon Gedanken gemacht
>aber glaube nicht dass es zwingend notwendig ist oder?

Und was meinst du, woher das

>ich rufe meine Methode "getkey" auf und es wird ausgeführt, aber leider
>mehrmals :D

kommt?

MfG Spess
Gast #3706401
Lesenswert?

> ich rufe meine Methode "getkey" auf und es wird ausgeführt, aber leider
> mehrmals :D

Du rufst 'getkey' einmal auf, aber sie wird mehrmals ausgeführt?
D.h. in 'getkey' ist eine Schleife? Oder ist es eher so, dass 'getkey' 
mehrfach aufgerufen wird?

Wenn du nicht jetzt deinen Code zeigst, werden alle nur rumraten.
OP #3706409
Lesenswert?

init:   lcall initLCD
        lcall loeschen
        keyfield data p1
        lcall menue

        Im menü wird dann ausgegeben "Code eingeben 1"
                                     "Code aendern  2"


Dann kommt meine main:

main:   lcall key            ;key springt immer wieder auf z4 durch 
"ret"
  z4:   cjne a,#01h,label1  ;wenn nicht 1 dann zu label2
        lcall loeschen    ;wenn 1 dann loesche LCD
        mov dptr,#S1            ;Gebe aus "Code: "
        lcall textzeile1  ;in Textzeile1
        lcall time2     ;rufe zeitverzögerung auf
        sjmp main

label1: lcall loeschen          ;loesche LCD
        lcall textzeile2
        mov dptr,#s5             ;"Admincode eingeben: "
        lcall time2
        ljmp main


Nur ein kleines Testprogramm dass es zwischen 1 und 2 unterscheidet.
Das mit der getkey funktioniert, wenn ich "1" drücke kommt auch eine 1 
im Display, bei der 2 eine 2 usw...

Jetzt das Problem: Es steht am anfang nach laden des hex codes gleich
Zeile1: "Code eingeben 1"
Zeiel2: "Admincode eingeben" anstatt "Code aendern  2"



Es zeigt mir halt sofort immer den Code "Admincode eingeben" in Zeile2 
an, habe hier wohl einen Denkfehler auf den ich momentan nicht komme.

Gruß
OP #3706549
Lesenswert?

So ich habe mein Problem entdeckt,

1,  2,  3
4,  5,  6
7,  8,  9
*,  0,  #

So wenn ich alles ohne das Programm in dezimalzahl ausgebe
kommt bei der 1 immer die 1

bei der 2 kurz die 2 und danach immer die 1,

bei der 3 kurz die 3 und danach immer die 1.

bei der 4 kurz die 4 dann immer die 2,

bei der 5 kurz die 5 dann immer die 2,

bei der 6 kurz die 6 dann immer die 2.

3.Reihe: kurz die richtige dann immer die 4,

4.Reihe: kurz richtige dann immer dei 8


also ist es iwas mit dem binärwert.

Also muss ich sie entprellen - ja?



Und wenn ja wie würde das gehen?

Gruß
#3706616
Lesenswert?

Hallo,

ich habe das Entprellen einer Tasten-Matrix mit dem Code von Peter 
Dannegger (PeDa)

Beitrag "Tasten entprellen - Bulletproof"

realisiert.

|KEY_PIN| wird dann gegen die Bit-Nummer des ScanCodes der Tasten-Matrix ersetzt 
und die Tastenergebnisse habe nun 16 verschiedene Werte (0-9,A,B,C,D,#,*).
Also sind einige Variable nicht mehr vom Typ |uint8_t| sondern 
|uint16_t|.

Weiterführende Links:

# http://www.mikrocontroller.net/articles/Entprellung
# 
http://www.mikrocontroller.net/articles/Entprellung#Timer-Verfahren_.28nach_Peter_Dannegger.29

# Beitrag "PeDa Entprellung"
# 
http://www.mikrocontroller.net/attachment/160430/Tasten_entprellen_v1.c
OP #3706673
Lesenswert?

Uwe S. schrieb:
> Hallo,
>
> ich habe das Entprellen einer Tasten-Matrix mit dem Code von Peter
> Dannegger (PeDa)
>
> Beitrag "Tasten entprellen - Bulletproof"
>
> realisiert.
>
> |KEY_PIN| wird dann gegen die Bit-Nummer des ScanCodes der Tasten-Matrix ersetzt
> und die Tastenergebnisse habe nun 16 verschiedene Werte
> (0-9,A,B,C,D,#,*).
> Also sind einige Variable nicht mehr vom Typ |uint8_t| sondern
> |uint16_t|.
>
> Weiterführende Links:
>
> # http://www.mikrocontroller.net/articles/Entprellung
> #
> http://www.mikrocontroller.net/articles/Entprellun...
>
> # Beitrag "PeDa Entprellung"
> #
> http://www.mikrocontroller.net/attachment/160430/T...



Schreibe leider in ".a51" da es der atmel at89c5131 ist.
OP #3707401
Lesenswert?

Leider habe ich es immer noch nicht geschafft, es funktioniert nur die 
linke Spalte!

Bei der Codeeingabe

1,  2,  3
4,  5,  6
7,  8,  9
*,  0,  #

kommt bei der 1 korrekt die 1
bei der 2 die 1
bei der 3 die 1

bei den anderen Reihen ebenso.

Immer nur die erste Spalte der Ziffern wird korrekt gewertet.

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