www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Knopf geht nicht!?


Autor: Gernot Frisch (gernotfrisch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich nix mach, steht da "Enter" =4. Wenn ich GND auf die pins
lege, geht nur der 3er ("right"). Die anderen scheinen keine Reaktion
zu zeigen. Ist schon spät. Liegt vielleicht daran ;)
void HandleKeys(void)
{
  if(KEY_VALID) return;

  for (char i=0;i<5;i++)
  {
    if(KEY_PIN & (1<<i))
    {
      KEY_VALID = 1;
      KEY = i;
    }
  }
}
int main(void)
{  
    lcd_init();
  KEY_DDR = 0xff; KEY_PORT = 0xff;
  switch(GetKey())
  {
  case 0: lcd_string_P ("UP"); break;
  case 1: lcd_string_P ("LEFT"); break;
  case 2: lcd_string_P ("DOWN"); break;
  case 3: lcd_string_P ("RIGHT"); break;
  case 4: lcd_string_P ("ENTER"); break;
  }
}

Autor: Gernot Frisch (gernotfrisch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS. Ich ruf in main() schon immer wieder HandleKEys auf. Klar, oder?

Autor: Alex Trusk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was bewirkt folgende zeile?
KEY_DDR = 0xff; KEY_PORT = 0xff;

Autor: MasterFX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne es zu wissen würde ich mal sagen dass it KEY_DDR = 0xff; alle
PortPins auf Ausgang geschaltet werden und mit KEY_PORT = 0xff; eben
die  Ports auf High gesetzt werden.

Autor: Alex Trusk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
korrekt. und wenn man dann gnd an die pins legt, machts brrrzzzzt...

zum glueck sind avrs hart im nehmen. davon mal ab, ist der code eher
suboptimal. hier ein bisschen lesestoff, wie man taster abfragt:

http://www.mikrocontroller.net/articles/Entprellung

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Ich ruf in main() schon immer wieder HandleKEys auf. Klar, oder?"


Nö, überhaupt nicht klar !

Ich sehe da nur lcd_init(), lcd_string_P(), GetKey(), welche nirgends
definiert sind und auch sämtliche Variablen und Konstanten fehlen.


Was ist denn daran bloß so schwierig, Copy+Paste zu benutzen, d.h.
exakt das hinzuschreiben, was man auch ausprobiert hat ???

Und Code als Anhang sollte doch auch klar sein.

Für uncompilierbare und falsche Codefragmente braucht man sich nicht
wundern, wenns darauf keine Hilfe gibt.



Peter

Autor: Gernot Frisch (gernotfrisch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich Depp! Es muss so sein:
int main(void)
{
lcd_init();
KEY_DDR = 0x00 KEY_PORT = 0xff; // input + pullup
switch(GetKey())
{
case 0: lcd_string_P ("UP"); break;
case 1: lcd_string_P ("LEFT"); break;
case 2: lcd_string_P ("DOWN"); break;
case 3: lcd_string_P ("RIGHT"); break;
case 4: lcd_string_P ("ENTER"); break;
}
} 

und bei GetKey muss ich (! (KEY_PIN & i)) abfragen, damit er gedrückt
ist, nicht? GND == 0!?

Was so ein bischen Schlaf alles ausmacht... ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.