.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