www.mikrocontroller.net

Forum: Projekte & Code Entprellen von Tasten in C


Autor: Preller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++) ;
  }
}

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Preller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++) ;
   }
 }

Autor: Heiko Krämer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

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.