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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren