Hallo Leute,
bitte nehmt es mir nicht übel, daß ich etwas penetrant werde. Aber
meine Laune wird immer schlechter, weil ich es einfach nicht
hinbekomme.
Mit Peter Dannegers universeller Tastenabfrage möchte ich erkennen, ob
zwei Tasten gleichzeitig gedrückt sind, zusätzlich zur funktionierenden
Prüfung auf kurzen und langen Tastendruck (mit Wiederholung).
Das Problem und den Code findet ihr hier:
http://www.mikrocontroller.net/forum/read-4-310276.html#new
Ich verstehe nicht, an welcher Stelle ich einhaken muß, um diesen
Zustand von den anderen zu unterscheiden. Ich habe auch schon versucht,
direkt am key_state anzusetzen und ihn 'noninvasiv' auszulesen
1 | uint8_t get_key_state( uint8_t key_mask )
|
2 |
|
3 | {
|
4 |
|
5 | cli(); // disable global interrupts
|
6 |
|
7 | key_mask &= key_state; // read key(s)
|
8 |
|
9 | sei(); // enable interrupts globally, regardless of previous state!
|
10 |
|
11 | return key_mask;
|
12 |
|
13 | }
|
also ohne ihn zurückzusetzen. Das hat zur Folge, daß unmittelbar nach
der Erkennung eine der anderen Funktionen greift.
Wenn ich es anders probiere
1 | // turn tv off, when both buttons pushed simultaneously
|
2 |
|
3 | if( get_key_state( 1<<BUTTON_A) && get_key_state( 1<<BUTTON_B))
|
4 |
|
5 | {
|
6 |
|
7 | cli();
|
8 |
|
9 | rc5_send_code( toggle & 1, RC5ADDR_TV1, 12 );
|
10 |
|
11 | key_state ^= 1<<BUTTON_A || 1<<BUTTON_B; // clear key(s)
|
12 |
|
13 | sei();
|
14 |
|
15 | }
|
also key_state erst zurücksetze, wenn beide Tasten als gleichzeitig
gedrückt erkannt werden, funktioniert es anscheinend.
Aber die Wiederholfunktion ist außer Gefecht gesetzt.
Wenn jemand von Euch mich auf den Lösungsweg zu hinzuweisen, und zu
erläutern, wie man geschickt ansetzen kann, wäre ich echt dankbar.