Forum: Mikrocontroller und Digitale Elektronik 3x4 Matrix-Tastatur - wichtige Fragen


von Sebastian H. (seppl87)


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

von MaWin (Gast)


Lesenswert?

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

Zeile 42 löschen.

von Mike (Gast)


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.

von Wolfgang (Gast)


Lesenswert?

Sebastian Hauser schrieb:
>... - wichtige Fragen
Das dürfe aus Sicht der TOs auf 90% der hier im Forum gestellten Fragen 
zutreffen und stellt hier kein Alleinstellungsmerkmal dar.

Das blöde an Computer ist, dass sie machen, was man ihnen sagt - und das 
ist oft nicht das, was man von ihnen will.

> Greets
再见

von Peter.N (Gast)


Lesenswert?

Wolfgang schrieb:
> Das blöde an Computer ist, dass sie machen, was man ihnen sagt - und das
> ist oft nicht das, was man von ihnen will.

Darf ich diesen Satz, ohne Hinweis auf Copyright Verletzung und ohne 
Angabe des Authors, ungestraft woanders verwenden?

von Sebastian H. (seppl87)


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.

von Wolfgang (Gast)


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 ;-)

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?


von Sebastian H. (seppl87)


Lesenswert?

Martin Wende schrieb:
> Nimm das hier:
> http://www.fritzler-avr.de/HP/Librarys/tastenplex_his.php

Vergessen zu sagen: Ich programmiere (leider) in assembler

von Peter.N (Gast)


Lesenswert?

Wolfgang schrieb:
> 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 ;-)

Das ist richtig, aber so klar und eindeutig hatte ich das noch nicht 
gelesen..., danke dir!

von spess53 (Gast)


Lesenswert?

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

von John (Gast)


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.

von Sebastian H. (seppl87)


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?

von spess53 (Gast)


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

von tastendrücker (Gast)


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.

von Sebastian H. (seppl87)


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ß

: Bearbeitet durch User
von Sebastian H. (seppl87)


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ß

: Bearbeitet durch User
von Uwe (de0508)


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

: Bearbeitet durch User
von Sebastian H. (seppl87)


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.

: Bearbeitet durch User
von Uwe (de0508)


Lesenswert?

Ja und ?

die Grundlagen kannst Du doch - dann interpretiere den Code und 
übersetze ihn wieder zurück zum 8051.
Von dort stammt er.

von Sebastian H. (seppl87)


Lesenswert?

Uwe S. schrieb:
> Ja und ?
>
> die Grundlagen kannst Du doch - dann interpretiere den Code und
> übersetze ihn wieder zurück zum 8051.
> Von dort stammt er.

Nein, ich bin auch wirklich kein Profi, wäre echt hammer nett wenn mir 
das jemand in a51 umschreiben könnte, verstehe es nämlich nicht :(

Gruß

von Sebastian H. (seppl87)


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.

: Bearbeitet durch User
von Sebastian H. (seppl87)


Lesenswert?

push

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.