1 | .include "m8def.inc"
|
2 |
|
3 |
|
4 | .def temp1 = r16
|
5 | .def temp2 = r17
|
6 | .def temp3 = r18
|
7 | .def temp4 = r19
|
8 | .def temp5 = r20
|
9 |
|
10 | .org 0x0000
|
11 | rjmp main ; Reset Handler
|
12 | .org OVF0addr
|
13 | rjmp timer0_shift ; gibt an, welche ISR bei Auslösen des Timer0-Overflow-Interrupts aufgerufen werden soll
|
14 |
|
15 | .include "lcdroutines.asm"
|
16 |
|
17 |
|
18 | main:
|
19 | ldi temp1, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
|
20 | out SPL, temp1
|
21 | ldi temp1, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
|
22 | out SPH, temp1
|
23 |
|
24 | rcall lcd_init ; Display initialisieren
|
25 | rcall lcd_clear ; Display löschen
|
26 |
|
27 | ldi ZL, LOW(text*2) ; Adresse des Strings in den
|
28 | ldi ZH, HIGH(text*2) ; Z-Pointer laden
|
29 | ldi temp5, 0 ; initialisiere das Register temp5 als Zählvariable für die Anzahl der auszugebenden Zeichen
|
30 |
|
31 | rcall lcd_flash_string ; Unterprogramm gibt String aus der
|
32 | ; durch den Z-Pointer adressiert wird
|
33 | ldi temp4, ( 1 << CS02 ) | ( 0 << CS01 ) | ( 1 << CS00 ) ;setze den Vorteiler des Timers auf 1024
|
34 | out TCCR0, temp4 ; ein Interrupt wird nun 15mal pro Sekunde ausgelöst 4MHz/1024/255
|
35 |
|
36 | ldi temp4, (1 << TOIE0 ) ; TOIE0: Interrupt bei Timer0Overflow einschalten
|
37 | out TIMSK, temp4
|
38 | ldi temp4, 0 ; soll die Anzahl der Interrupts zählen nach 7 Interrupts soll etwas geschehen
|
39 | sei ; generelle Aktivierung von Interrupts
|
40 |
|
41 | loop:
|
42 | rjmp loop
|
43 |
|
44 |
|
45 | timer0_shift:
|
46 | inc temp4 ; dekrementiert die Zählvariable
|
47 | cpi temp4, 7
|
48 | brne timer0_shift_1
|
49 | rcall lcd_shift_left
|
50 | ldi temp4, 0
|
51 | timer0_shift_1:
|
52 | reti
|
53 |
|
54 |
|
55 | text:
|
56 | .db "Das Programmieren macht mir noch grossen Spass",0 ; Stringkonstante, durch eine 0
|
57 | ; abgeschlossen
|