.include "m8def.inc"
.def temp1Â Â Â = r16
.def temp2Â = r17
.def tast_neu = r18
.def tast_alt = r19
.def temp3Â = r20
.def temp4Â = r21
.def temp5Â = r22
.def temp6Â = r23
.equ F_CPU = 8000000Â Â Â Â ; Systemtakt in Hz
.equ BAUDÂ = 9600Â Â Â Â Â Â ; Baudrate
; Berechnungen
.equ UBRR_VALÂ Â = ((F_CPU+BAUD*

/(BAUD*16)-1)Â ; clever runden
.equ BAUD_REALÂ = (F_CPU/(16*(UBRR_VAL+1)))Â Â Â ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)Â ; Fehler in Promille
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))Â Â Â Â ; max. +/-10 Promille Fehler
 .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif
ldi  temp1, 0b00111111 ;PORTC -> Ausgang
out  DDRC, temp1
ldi  temp1, 0b00011111 ;PORTB -> Pull-Up Widerstände ein
out  PORTB, temp1
ldi  temp1, 0b00001100 ;PORTD -> Ausgang und Eingang
out  DDRD, temp1
ldi  temp1, 0b11000000 ;PORTD -> Pull-Up Widerstände ein
out  PORTD, temp1
ldi   tast_alt, 0b11111111
haupt:
in   tast_neu, PIND  ; PIND -> temp1 (11100000)
andi   tast_neu, 0b11100000
in   temp1, PINB  ; PINB -> temp2 (00011111)
andi   temp1, 0b00011111
or  temp1, tast_neu ; 11100000(temp1) und 00011111(temp2) = 11111111(temp1)
mov tast_neu, temp1     ; und in temp1 sichern
   eor tast_neu, tast_alt    ; mit dem vorhergehenden Zustand XOR
   mov tast_alt, temp1     ; und den jetzigen Zustand für den nächsten
                 ; Schleifendurchlauf als alten Zustand merken
   breq haupt          ; Das Ergebnis des XOR auswerten:
                 ; wenn keine Taste gedrückt war -> neuer Schleifendurchlauf
   and temp1, tast_neu     ; War das ein 1->0 Übergang, wurde der Taster also
                 ; gedrückt (in key_now steht das Ergebnis vom XOR)
   brne haupt  Â
ldi temp1, $7F       ; ein bisschen warten ...
wait1:
   ldi temp2, $7F
wait2:
   dec temp2
   brne wait2
   dec temp1
   brne wait1
        ; ... und nachsehen, ob die Taste immer noch gedrückt ist
   in  temp2, PIND  ; PIND -> temp1 (11100000)
andI temp2, 0b11100000
in  temp1, PINB  ; PINB -> temp2 (00011111)
andi temp1, 0b00011111
or  temp1, temp2 ; 11100000(temp1) und 00011111(temp2) = 11111111(temp1)
   and temp1, tast_neu
   brne haupt
        Â
      Â
ausgabe:
com temp1
sbrc temp1, 0 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke schleife_1
rjmp pruefen_0
rjmp schleife_1
pruefen_0:
sbis PORTD, 2 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_0 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_0 ; Wenn es 1 ist tu das(Ausschalten)
an_0:
sbi PORTD, 2 ; Einschalten

rjmp schleife_1
aus_0:
cbi PORTD, 2 ; Ausschalten

schleife_1:
sbrc temp1, 0 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke weiter_D
rjmp pruefen_1
rjmp schleife_2
pruefen_1:
sbis PORTD, 3 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_1 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_1 ; Wenn es 1 ist tu das(Ausschalten)
an_1:
sbi PORTD, 3 ; Einschalten

rjmp schleife_2
aus_1:
cbi PORTD, 3 ; Ausschalten

schleife_2:
sbrc temp1, 2 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke weiter_D
rjmp pruefen_2
rjmp schleife_3
pruefen_2:
sbis PORTC, 0 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_2 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_2 ; Wenn es 1 ist tu das(Ausschalten)
an_2:
sbi PORTC, 0 ; Einschalten

rjmp schleife_3
aus_2:
cbi PORTC, 0 ; Ausschalten

schleife_3:
sbrc temp1, 3 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke weiter_D
rjmp pruefen_3
rjmp schleife_4
pruefen_3:
sbis PORTC, 1 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_3 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_3 ; Wenn es 1 ist tu das(Ausschalten)
an_3:
sbi PORTC, 1 ; Einschalten

rjmp schleife_4
aus_3:
cbi PORTC, 1 ; Ausschalten

schleife_4:
sbrc temp1, 4 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke weiter_D
rjmp pruefen_4
rjmp schleife_5
pruefen_4:
sbis PORTC, 2 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_4 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_4 ; Wenn es 1 ist tu das(Ausschalten)
an_4:
sbi PORTC, 2 ; Einschalten

rjmp schleife_5
aus_4:
cbi PORTC, 2 ; Ausschalten

schleife_5:
sbrc temp1, 5 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke weiter_D
rjmp pruefen_5
rjmp schleife_6
pruefen_5:
sbis PORTC, 3 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_5 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_5 ; Wenn es 1 ist tu das(Ausschalten)
an_5:
sbi PORTC, 3 ; Einschalten

rjmp schleife_6
aus_5:
cbi PORTC, 3 ; Ausschalten

schleife_6:
sbrc temp1, 6 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke weiter_D
rjmp pruefen_6
rjmp schleife_7
pruefen_6:
sbis PORTC, 4 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_6 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_6 ; Wenn es 1 ist tu das(Ausschalten)
an_6:
sbi PORTC, 4 ; Einschalten

rjmp schleife_7
aus_6:
cbi PORTC, 4 ; Ausschalten

schleife_7:
sbrc temp1, 7 ; Wenn aktuelles Bit=0Â springe zur Sprungmarke weiter_D
rjmp pruefen_7
rjmp haupt
pruefen_7:
sbis PORTC, 5 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_7 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_7 ; Wenn es 1 ist tu das(Ausschalten)
an_7:
sbi PORTC, 5 ; Einschalten

rjmp haupt
aus_7:
cbi PORTC, 5 ; Ausschalten

   rjmp haupt