tasten gleichzeitig gedrückt - entprellt feststellen?

OP #363758
Lesenswert?
• ▲
▼
Dank der bekloppten Betrefflängenüberprüfung alles nochmal. Dabei
limitiert das Formular die Datenlänge auf 60 Zeichen!? Egal.

Also, ich habe Peters Entprellroutine in erweiterter Form:

....
key_i &= ct0 & ct1;
key_release |= key_state & key_i;
key_state ^= key_i;
key_press |= key_state & key_i;

um den entprellten Zustand und die Flankenwechsel abfragen zu können.
Funktioniert auch gut.
Den Zustand frage ich mit der noninvasiven Fkt.

uint8_t switch_state( uint8_t key_mask ){
  cli();
  key_mask &= key_state;
  sei();
  return key_mask;
}

ab.

Alle Versuche, zwei gleichzeitig gedrückte Tasten zu erkennen schlagen
bislang fehl..

So ..
if((switch_state(1<<KEYr) && switch_state(1<<KEYr)))

aber auch so ..
if((switch_state(1<<KEYr | 1<<KEYr)))

Was mache ich falsch?
#363759
Lesenswert?
• ▲
▼
Ich geh mal davon aus, dass KEYr fuer irgendetwas
steht. Es ist klar, dass die beiden KEYr in den
if Abfragen verschieden sein muessen, da es sich ja
sonst immer um denselben Key handelt.
Moral: Poste immer realen Code! Sonst analysieren wir
hier Dinge raus, die Du in Wirklichkeit nicht geschrieben
hast.

> if((switch_state(1<<KEYr | 1<<KEYr)))

Das kann so nicht funktionieren. Dazu muesste die
switch_state Funktion genau dann TRUE zurueckliefern,
wenn alle Bits in der Maske auch in kay_mask gesetzt
sind. Das tut sie aber nicht. switch_state liefert
TRUE wenn irgendein Bit der Maske in key_mask gesetzt
ist.

Das laesst sich aber aendern:
uint8_t switch_state( uint8_t key_mask ){
  uint8_t tmp;
  cli();
  tmp = key_mask & key_state;
  sei();
  return key_mask == tmp;
}

Jetzt muessen alle Bits in key_mask auch in key_state
gesetzt sein, nur dann liefert switch_state TRUE zurueck.

> if((switch_state(1<<KEYr) && switch_state(1<<KEYr)))

Wenn die beiden KEYr in Wirklichkeit verschiedene
Variablen sind, dann sollte das schon funktionieren.
Hast Du mal ueberprueft, ob die entsprechenden Bits
an dieser Stelle in key_state auch tatsaechlich gesetzt
sind? Hast Du das ganze mal im Debugger durchgesteppt?
Gast #363760
Lesenswert?
• ▲
▼
Was willst Du machen ?

Soll das eine Shift-Taste werden, mit der man eine Zweitbelegung
realisiert ?

In dem Fall fragt man einfach noch den entprellten Zustand ab:
1
//
2
  if( get_key_press( 1<<KEY0 )){
3
    if( key_state & 1<<KEY1 ){
4
      // 2. Funktion, Shift (KEY1) gedrückt
5
    }else{
6
      // 1. Funktion, Shift losgelassen 
7
    }
8
  }

Die Shift-Taste muß vor der eigentlichen Taste gedrückt oder
losgelassen worden sein (exakt gleichzeitig ginge auch).

Das Ganze bezieht sich auf folgenden Code:

http://www.mikrocontroller.net/attachment.php/310276/C_TAST.C


Peter

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.