Entprellen von Tasten in C

Gast #41750
Lesenswert?
• ▲
▼
#include <io.h>

int main (void)
{
  unsigned char in = 0x0;
  unsigned char in1;
  unsigned char in2 = 0;
  unsigned char i,j;
  outp(0xff, DDRB);
  outp(0x00, DDRD);
  while (1) {
    in1 = ~inp(PIND);
    if ( in1 == in2 )
      in1 = 0;
    else
      in2 = in1;

    if (in & in1) {
      in &= ~in1;
    } else {
      in |= in1;
    }
    outp (~in,PORTB);
    if ( in1 )
      for ( i = 0; i < 255; i++)
        for ( j = 0; j < 200; j++) ;
  }
}
#41751
Lesenswert?
• ▲
▼
Wirklich super,

keinerlei Kommentare, keine Beschreibung.


So stell ich mir Codebeispiele jedenfalls nicht vor.

Die sollen doch auch nachnutzbar sein und möglichst auch von nicht so 
erfahrenen Programmierern.


So ist es nur eine Verschwendung von Forum-Platz.


Peter
Gast #41752
Lesenswert?
• ▲
▼
Sorry,
aber ich habe das nur schnell gepostet, ohne dabei was zu denken!
Es war mein erstes kleines Tasten und LED Testprogramm.
Das Interrupthandling mit AVR habe ich bisher noch nicht gelesen. 
Deshalb alles in einer while Schleife!

Aber jetzt mit Dokumentation:

#include <io.h>

 int main (void)
 {
   unsigned char in = 0x0;
   unsigned char in1;
   unsigned char in2 = 0;
   unsigned char i,j;
   outp(0xff, DDRB);
   outp(0x00, DDRD);
   while (1) {
     in1 = ~inp(PIND);  /* lese; bits der entspechenden tasten sind 
gesetzt! */
     if ( in1 == in2 )  /* sind es die gleichen tasten? */
       in1 = 0;    /* ja: nichts aendern! */
     else
       in2 = in1;  /* nein: speichere fuer naechtes mal*/

     if (in & in1) {  /* war die taste schon gedrueckt? */
       in &= ~in1;  /* ja: na dann loesche es! */
     } else {
       in |= in1;  /* nein: setze es! */
     }
     outp (~in,PORTB);  /* gib  aus */
     if ( in1 )    /* bei neuer taste: warten */
       for ( i = 0; i < 255; i++)
         for ( j = 0; j < 200; j++) ;
   }
 }
Gast #41753
Lesenswert?
• ▲
▼
Versuche eimal folgenden Code zur Tastenentprellung



#ifndef key_driver
 #define key_driver

#define TAST_PORT  P2
#define TAST_MASK 0x0F // nur die unteren 4 Bit f. Tastatur

 // TastenCodes für eine kleine Tastatur (pro Portpin eine Taste)
 enum {  KEY_HOLD=0x1F,
    KEY_NONE=0x00,
    KEY_RIGHT=0x0B,
    KEY_LEFT=0x07,
    KEY_UP=0x0E,
    KEY_DOWN=0x0D
    };

unsigned char tastatur (void);

unsigned char tastatur (void)
{
  static unsigned char tast_code, verzoeger;
  static bit gedrueckt;
  if (gedrueckt&&(tast_code==(TAST_PORT&TAST_MASK)))
    {
      // Taste schon erkannt (noch gedrückt)
      // evtl. Toggelfunktion !
      if (verzoeger)
        {
          verzoeger--;
          delay (20000);  // ca. 250ms
          return(KEY_HOLD);
        }
      delay (23077);      // ca. 330ms
      gedrueckt=0;
      return(KEY_HOLD);
    }
    else
      {
        tast_code=(TAST_PORT&TAST_MASK);
        // hier entprellen
        if ((tast_code==(TAST_PORT&TAST_MASK)&&(tast_code!=0x0F)))
          {
            // neue Taste gedrückt
            gedrueckt=1;
            return(tast_code);
          }
          else
            {
              // Taste losgelassen
              gedrueckt=0;
              verzoeger=1;
              return(KEY_NONE);
            }
      }
}

#endif
Angehängte Dateien:

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.