1 | ;Lauflicht für 5 LED's
|
2 |
|
3 | ;je nach gedrückter Taste sind 4 versch.Lauflichtvarianten sichtbar
|
4 |
|
5 | ;einfaches Programm um verschiedene Strings mit dem lpm-Befehl
|
6 | ;auszulesen und über LED anzeigen zu lassen
|
7 |
|
8 | ;an PB0 bis PB4 sind 5 LED's angeschlossen nach +
|
9 | ;an PD2 bis PD5 sind 4 Taster (Schalter) angeschlossen low-aktiv
|
10 |
|
11 |
|
12 |
|
13 | .nolist
|
14 | .include"C:\Programme\Atmel\AVR Studio\Appnotes\2313def.inc"
|
15 | .list
|
16 |
|
17 |
|
18 | init: ldi R16, RAMEND
|
19 | out SPL, R16 ; Stackpointer initialisieren
|
20 |
|
21 | ldi R16, 0xff
|
22 | out DDRB, R16 ; PORTB Ausgang
|
23 |
|
24 | ldi R16, 0x00 ; PORTD Eingang
|
25 | out DDRD, R16
|
26 |
|
27 | sbi portd,2 ; pullupwid.
|
28 | sbi portd,3 ; pullupwid.
|
29 | sbi portd,4 ; pullupwid.
|
30 | sbi portd,5 ; pullupwid.
|
31 |
|
32 |
|
33 |
|
34 | start:
|
35 | ldi ZL, LOW(daten*2) ; Adresse des Strings in den
|
36 | ldi ZH, HIGH(daten*2) ; Z-Pointer laden
|
37 | in r16,PIND ; Taster einlesen
|
38 | com r16 ; taster low-aktiv
|
39 | andi r16,0b00111100 ; Taster ausmaskieren
|
40 | cpi r16,0b00000100 ; Taster PD2 betätigt ?
|
41 | breq LED ; verzweige zu "LED"
|
42 |
|
43 | ldi ZL, LOW(daten3*2) ; Adresse des Strings in den
|
44 | ldi ZH, HIGH(daten3*2) ; Z-Pointer laden
|
45 | cpi r16,0b00100000 ; Taster PD5 betätigt ?
|
46 | breq LED ; verzweige zu "LED"
|
47 |
|
48 | ldi ZL, LOW(daten2*2) ; Adresse des Strings in den
|
49 | ldi ZH, HIGH(daten2*2) ; Z-Pointer laden
|
50 | cpi r16,0b00010000 ; Taster PD4 betätigt ?
|
51 | breq LED ; verzweige zu "LED"
|
52 |
|
53 | ldi ZL, LOW(daten1*2) ; Adresse des Strings in den
|
54 | ldi ZH, HIGH(daten1*2) ; Z-Pointer laden
|
55 | cpi r16,0b00001000 ; Taster PD3 betätigt ?
|
56 | brne start ; verzweige zu "start"
|
57 |
|
58 |
|
59 |
|
60 |
|
61 | LED:
|
62 | lpm ; Erstes Byte nach R0 lesen
|
63 | tst R0 ; R0 auf 0 testen
|
64 | breq LED_end ; wenn 0 verzw. zu LED_end
|
65 | mov r16, r0 ; Inhalt von R0 nach R16 kopieren
|
66 | rcall anzei ; UP "anzei"
|
67 | adiw ZL, 1 ; Adresse des Z-Pointers um 1 erhöhen
|
68 | rjmp LED ; wieder zum Anfang springen
|
69 |
|
70 |
|
71 | LED_end:
|
72 | rjmp start
|
73 |
|
74 |
|
75 | anzei:
|
76 | mov r17,r16 ;r16 nach r17 kopieren
|
77 | com r17 ;invertieren,da LED's an+
|
78 | out PORTB, R17 ;Ausgabe der Daten an LED's
|
79 | rcall delay ;Verzögerungsschleife 0,2s bei 4Mhz
|
80 | ret
|
81 |
|
82 | delay: ;erzeugt mit "AVRdelayloop"
|
83 |
|
84 |
|
85 |
|
86 | ldi R18, $09
|
87 | WGLOOP0: ldi R19, $A1
|
88 | WGLOOP1: ldi R20, $D3
|
89 | WGLOOP2: dec R20
|
90 | brne WGLOOP2
|
91 | dec R19
|
92 | brne WGLOOP1
|
93 | dec R18
|
94 | brne WGLOOP0
|
95 |
|
96 | ldi R18, $03
|
97 | WGLOOP3: dec R18
|
98 | brne WGLOOP3
|
99 |
|
100 | ret
|
101 |
|
102 |
|
103 |
|
104 | daten:
|
105 | .db 0b00000001,0b00000010,0b00000100,0b00001000,0b00010000,0x00
|
106 | daten1:
|
107 | .db 0b00000001,0b00000011,0b00000111,0b00001111,0b00011111,0x00
|
108 | daten2:
|
109 | .db 0b00000001,0b00000011,0b00000110,0b00001100,0b00011000,0x00
|
110 | daten3:
|
111 | .db 0b00000100,0b00001010,0b00010001,0b00010101,0b00011111,0x00
|