#include <avr/io.h>     // Definitionen laden 
#include <util/delay.h> // Delay-Bibliothek laden 
 
#define KEYREADER ~PIND >> 4    // Einlesen, invertieren, maskieren zurecht schieben
unsigned char keyOld = 0;       // alter Tasten-Zustand 
unsigned char keyEnter,keyExit; // gedrueckte und losgelassene Tasten 
 
void keyCheck(){                // Tastaturabfrage mit Flankendedektion  
  unsigned char keyTest,tmp; 
  keyEnter = 0, keyExit = 0; 
  keyTest = KEYREADER;          // Einlesen
  if (keyOld != keyTest){       // hat sich was getan 
    _delay_ms(10);              // Prellen abwarten 
    tmp = KEYREADER;            // noch mal Einlesen
    if (tmp == keyTest){        // ist es stabil? 
      keyEnter = (~keyOld) & keyTest; // steigende Flanke !alt und neu 
      keyExit = keyOld & (~keyTest);  // fallende Flanke alt und !neu 
      keyOld = keyTest; 
    } 
  } 
} 
 
int main(){         // Hauptprogramm 
  PORTB=0xe0;       // alle LED aus 
  DDRB=0xff;        // PB als Ausgang
  PORTD=0x7f;        // PullUps an
  unsigned char zaehler = 0;
  while(1){         // Endlosschleife 
    keyCheck();     // Tastatur abfragen
    if(keyEnter&1){ // wenn Taste0 gedrueckt
      zaehler++;
      PORTB= 0xe0 | zaehler&0xf; // Ausgeben
    }
  } 
}