;Lauflicht für 5 LED's

;je nach gedrückter Taste sind 4 versch.Lauflichtvarianten sichtbar

;einfaches Programm um verschiedene Strings mit dem lpm-Befehl
;auszulesen und über LED anzeigen zu lassen

;an PB0 bis PB4 sind 5 LED's angeschlossen nach +
;an PD2 bis PD5 sind 4 Taster (Schalter) angeschlossen low-aktiv

.nolist
.include"C:\Programme\Atmel\AVR Studio\Appnotes\2313def.inc"
.list

init:   ldi R16, RAMEND
        out SPL, R16                        ; Stackpointer initialisieren

        ldi R16, 0xff
        out DDRB, R16                       ; PORTB Ausgang
        
        ldi R16, 0x00                       ; PORTD Eingang
        out DDRD, R16
        
        sbi portd,2                          ; pullupwid.
        sbi portd,3                          ; pullupwid.
        sbi portd,4                          ; pullupwid.
        sbi portd,5                          ; pullupwid.

start:
        ldi ZL, LOW(daten*2)                ; Adresse des Strings in den
        ldi ZH, HIGH(daten*2)               ; Z-Pointer laden
        in r16,PIND                         ; Taster einlesen
        com r16                             ; taster low-aktiv
        andi r16,0b00111100                 ; Taster ausmaskieren
        cpi r16,0b00000100                  ; Taster PD2 betätigt ?
        breq LED                            ; verzweige zu "LED"
        
        ldi ZL, LOW(daten3*2)               ; Adresse des Strings in den
        ldi ZH, HIGH(daten3*2)              ; Z-Pointer laden
        cpi r16,0b00100000                  ; Taster PD5 betätigt ?
        breq LED                            ; verzweige zu "LED"
        
        ldi ZL, LOW(daten2*2)               ; Adresse des Strings in den
        ldi ZH, HIGH(daten2*2)              ; Z-Pointer laden
        cpi r16,0b00010000                  ; Taster PD4 betätigt ?
        breq LED                            ; verzweige zu "LED"
                
        ldi ZL, LOW(daten1*2)               ; Adresse des Strings in den
        ldi ZH, HIGH(daten1*2)              ; Z-Pointer laden
        cpi r16,0b00001000                  ; Taster PD3 betätigt ?
        brne start                          ; verzweige zu "start"                 

      

LED:
        lpm                               ; Erstes Byte nach R0 lesen
        tst R0                            ; R0 auf 0 testen
        breq LED_end                      ; wenn 0 verzw. zu LED_end
        mov r16, r0                       ; Inhalt von R0 nach R16 kopieren
        rcall anzei                       ; UP "anzei"
        adiw ZL, 1                        ; Adresse des Z-Pointers um 1 erhöhen
        rjmp LED                          ; wieder zum Anfang springen

LED_end:
        rjmp start

anzei:
        mov r17,r16                       ;r16 nach r17 kopieren
        com r17                           ;invertieren,da LED's an+
        out PORTB, R17                    ;Ausgabe der Daten an LED's
        rcall delay                       ;Verzögerungsschleife 0,2s bei 4Mhz
        ret
        
        delay:                            ;erzeugt mit "AVRdelayloop"

        
          ldi  R18, $09
WGLOOP0:  ldi  R19, $A1
WGLOOP1:  ldi  R20, $D3
WGLOOP2:  dec  R20
          brne WGLOOP2
          dec  R19
          brne WGLOOP1
          dec  R18
          brne WGLOOP0

          ldi  R18, $03
WGLOOP3:  dec  R18
          brne WGLOOP3
          
          ret

daten:
.db 0b00000001,0b00000010,0b00000100,0b00001000,0b00010000,0x00 
daten1:
.db 0b00000001,0b00000011,0b00000111,0b00001111,0b00011111,0x00
daten2:
.db 0b00000001,0b00000011,0b00000110,0b00001100,0b00011000,0x00
daten3:
.db 0b00000100,0b00001010,0b00010001,0b00010101,0b00011111,0x00