Forum: Projekte & Code Entprellen von Tasten in C


von Preller (Gast)


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++) ;
  }
}

von Peter D. (peda)


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

von Preller (Gast)


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++) ;
   }
 }

von Heiko Krämer (Gast)


Angehängte Dateien:

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.