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
Mit einer zweiten Variablen, mit der man sich den vorherigen Zustand merkt. Sollten sich die beiden unterscheiden (bzw. Teile davon), dann gab es eine Flanke...
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...
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".
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.
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)
dann sag es mir bitte! Das war doch nett oder? Denke ich habe eine Antwort verdient!
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...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.