LCD_interrupt_schieben.asm


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 ) | ( 1 << 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/25
35
 
36
           ldi    temp4, 1 << TOIE0       ; TOIE0: Interrupt bei Timer0Overflow einschalten
37
           out    TIMSK, temp4
38
           ldi    temp4, 7          ; 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
;schieben:
45
;       mov    temp4, temp5      ; sichere den Wert der ausgegebenen Zeichen!
46
47
;schieben_1:
48
;           rcall  lcd_shift_left
49
;       rcall  delay500ms
50
;       dec    temp4
51
;       cpi    temp4, 0
52
;       brne   schieben_1
53
;schieben_2:
54
;       mov    temp4, temp5
55
;schieben_3:
56
;           rcall  lcd_shift_right
57
;       rcall  delay500ms
58
;       dec    temp4  
59
;       cpi    temp4, 0
60
;       brne   schieben_3       
61
;       rjmp   schieben
62
;
63
;
64
;delay500ms:
65
;       ldi    temp3, 100
66
;delay500ms_1:
67
;       rcall  delay5ms
68
;       dec    temp3
69
;       cpi    temp3, 0
70
;       brne   delay500ms_1
71
;       ret
72
73
;**************************************************
74
75
timer0_shift:
76
       dec    temp4         ; dekrementiert die Zählvariable
77
       cpi    temp4, 0
78
       brsh   timer0_shift_1
79
           rcall  lcd_shift_left
80
       ldi    temp4, 7
81
timer0_shift_1:
82
           reti
83
84
85
text:
86
           .db "Das Programmieren macht mir noch grossen Spass",0                ; Stringkonstante, durch eine 0
87
                                       ; abgeschlossen