Tastendrücke erkennen?

Gast #472809
Lesenswert?

Moin!
Nehmen wir an ich habe eine Variable. Diese Variable erkennt 
Tastendrücke (entprellt) und enthält den anliegenden Zustand 1 oder 0.
Wie ist es in C am leichtesten zu realisieren einen erneuten Tastendruck 
zuerkennen? Mir ist schon klar das das auf irgendeine Weise mit dem 
Flankenwechsel zutun haben muss aber wie macht man soetwas geschickt?
Dank im voraus MfG Andi
Gast #472820
Lesenswert?

Die zweite Variable muß nicht mal permant vorhanden sein:
Man kopiert die Tastenvariable hinein, liest die entprellten 
Tastenzustände ein und vergleicht die beiden Variablen dann.

Wenn man das Entprellen per Timerinterrupt macht, wird man eine separate 
Varibale brauchen...
Gast #472866
Lesenswert?

eine einfache Variable hat ja 8 Bit. Daher würde ich einfach das untere 
Nibble für den aktuellen Zustand verwenden und das obere Nibble für den 
vorherigen Zustand.
Somit sparst du Platz im Ram/Register.
Zum speichern des neuen Zustandes musst du einfach die Variable 4 Bits 
nach links shiften (VAR <<= 4;) und um zu überprüfen ob sich die beiden 
Zustände unterscheiden einfach XOR benutzen (if ((VAR >> 4) ^ (VAR & 
0x0F) printf("Taste gedrückt/losgelassen")).

Mit ein wenig mehr aufwand kannst du dir so die vorherigen 7 Zustände 
merken. Diese Methode eignet sich übrigens hervorragen zum entprellen .. 
ich nutze immer das untere Nibble für die 4 letzten Tastenzustände eines 
Timerinterrupts (einfach in jedem Aufruf den aktuellen Tastenzustand von 
rechts nach links "reinshiften") und überprüfe auf 0x0F -> die letzten 4 
Interrupts war Taste auf logisch 1 und somit werte dies als "gedrückt".
Gast #472877
Lesenswert?

Umständlich...
>vorherigen 7 Zustände
Wozu?
Was interessier es mich, wie oft die Taste hin- und hergezappelt ist, 
bevor sie endlich einen stabilen Zustand eingenommen hat?
Es interessiert doch nur, ob die Taste eine gewisse Zeit lang einen 
stabilen Zustand hat.

Es geht aber nicht darum, die Tasten zu entprellen, sondern darum, eine 
Flanke bei schon entprellten Tasten festzustellen.
Dazu braucht man ein "permanentes" Byte, um 8 Tasten auszuwerten.
Gast #472926
Lesenswert?

Mann ich habe es immer noch nicht geschnallt! Ich möchte in meinen 
Routinen den Tastendruck auswerten die Taste ist mit zwei Funktionen 
belegt nämlich an/aus. Wie wertet man das aus? Habe ja schließlich auch 
bei einem langen Tastendruck jede menge 1ser anliegen. (Brett vorm Kopf 
Rahul)
Gast #472947
Lesenswert?

Ist doch ganz einfach:
Du hast 2 Variablen a und b
a enthält die moemtanen Tasterstände nach dem Entprellen z.B. 11111111
b enthält die Tasterstände vor dem Entpressel (man könnte es auch 
einfach "Tastenabfrage" nennen).

a ist 11111111
b ist 11111111

Es hat sich nichts verändert (a^b = 0...)

wenn a jetzt 11101111 ist, wurde die Taste 4 gedrückt.
b ist immer noch 11111111
a^b != 0 (00010000)
da a & (1<<4) ==0 ist, wird ein Tastendruck detektiert.
b = a
solange die Taste gedrückt wird, ist a==b (a^b=0)
wird die Taste losgelassen, ist a^b !=0...
#472952
Lesenswert?

Wurde doch schon gesagt:

Du brauchst eine Variable, die den vorhergehenden Zustand
der Tasten enthält. Dann brauchst du eine Variable die
den jetzigen Zustand der Tasten bekommt.
Und dann vergleichst du die beiden. Wenn du zum Vergleichen
ein XOR benutzt, dann sind im Ergebnis nur dort 1-er, wo
sich der Zustand 'vorher' vom Zustand 'jetzt' unterscheidet.
Und das wars dann auch schon.

[C]
unsigned char TastenVorher;

...
{
   unsigned char TastenJetzt = wie_auch_immer_du_zu_den_Tasten_kommst;
   unsigned char Flanke = TastenJetzt ^ TastenVorher;

   // Welche Taste hat den Zustand gewechselt ?
   if( Flanke & 0x01 ) {
     // Wurde sie gedrückt oder losgelassen ?
     if( TastenJetzt & 0x01 ) {
       // losgelassen ( Annahme: Tasten sind low aktiv )
       mach_was;
     }
     else {
       // gedrückt
     }
   }

   // nächste Taste
   else if( Flanke & 0x02 ) {
     // gedrückt oder losgelassen
     if( TastenJetzt & 0x02 ) {
       ...
     }
     else {
       ...
     }
   }

   else if( Flanke & 0x04 ) {
     ...
   }

   // den jetzigen Zustand der Tasten als vorhergehenden
   // Zustand für den nächsten Durchgang merken.
   TastenVorher = TastenJetzt;
 }

Einfacher ist es alleredings, die Tastenentprellroutine
von PD (zu finden in der Codesammlung) zu benutzen.

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