.def keyold = R21        ;Taster die gedrueckt waren
.def keynew = R22        ;Taster die gedrueckt sind
.def keyenter = R23      ;Taster, die neu gedrueckt wurden
.def keyexit = R24       ;Taster, die neu losgelassen wurden
 
keycheck:                ;Unterprogramm zur Tastaturabfrage
  ldi keyenter,0
  ldi keyexit,0
  in keynew,PIND         ;Lade PD
  com keynew             ;invertieren
  andi keynew,0b00001111 ;Maskieren der nicht verwendeten Pins
  cpse keyold,keynew     ;Test ob Veraenderung
  rjmp keyaction         ;Veraenderung
  ret                    ;alles gleich
keyaction:
  rcall wait12ms         ;etwas warten
  in temp,PIND           ;nochmal einlesen
  com temp               ;invertieren bei neg. Logik
  andi temp,0b00001111   ;maskieren der nicht verwendeten Pins
  cpse keynew,temp       ;ist es stabil
  ret                    ;war nix, da nicht stabil
  mov keyenter,keyold
  com keyenter           ;invertieren
  and keyenter,keynew    ;steigende Flanken, !alt & neu
  mov keyexit,keynew
  com keyexit            ;invertieren
  and keyexit,keyold     ;fallende Flanken, alt & !neu
  mov keyold,keynew      ;alt := neu
  ret