Hallo,
ich möchte Tabellentexte in meinem LCD ausgeben. Dazu der Code weiter
unten. Mit
ldi temp2, low(15*18) und
ldi temp3, high(15*18) lege ich fest, welcher Text (hier: 15)
angezeigt wird.
Nun will ich aber nicht "15" angeben, sondern den Wert 15 an temp2/temp3
übergeben.
ldi temp1, 15
ldi temp2, low(temp1*18)
funktioniert ja logischer Weise nicht. Kann mir da jemand helfen?
Vielen Dank
Ausgabe_lcd:
push temp1 ; Register sichern
push temp2
ldi temp2, low(15*18)
ldi temp3, high(15*18)
ldi zl, low(texte_lcd*2) ; Zeiger auf Texttabelle
ldi zh, high(texte_lcd*2)
add zl, temp2 ; Tabellenplatz berechnen
adc zh, temp3
Ausgabe_lcd1: ; Solange Zeichen ausg.,
lpm temp1,z+ ; bis Zeichen eine 0 ist
cpi temp1,0
breq Ausgabe_lcd2
rcall lcd_data
rjmp Ausgabe_lcd1
Ausgabe_lcd2:
pop temp2
pop temp1
ret
;-----------------------------------------------------------------------
--
texte_lcd:
.db "Pumpsteuerung V1",0,0
.db "Name ",0,0
.db "1. Einstellungen",0,0
.db "2.Manuell ",0,0
.db "3.Status S1/S2",0,0
.db "4.TP Bh ",0,0
.db "Datum ",0,0
.db "Zeit ",0,0
.db "Wochentag ",0,0
.db "TP-Int ein ",0,0
.db "TP-Int aus ",0,0
.db "Sensor1 Verz. ",0,0
.db "Sensor2 Verz. ",0,0
.db "T-Pumpe ",0,0
.db "T-Pumpe aus ",0,0
.db "T-Pumpe Zulauf ",0,0
.db "W-Werk ",0,0
.db "W-Werk aus ",0,0
.db "Tank voll ",0,0
.db "Tank leer ",0,0
.db "ein aus auto ",0,0
.db " ein ",0,0
.db " stopp ",0,0
.db "S1 auf ",0,0
.db "S2 zu ",0,0
.db "Mo Di Mi Do Fr ",0,0
.db " Mi Do Fr Sa So",0,0
.db " ",0,0
.db "**** ERROR *****",0,0
Gast
#1860384
Hi Dann musst du halt multiplizieren. Je nach controller: http://www.atmel.com/dyn/resources/prod_documents/doc0936.pdf oder http://www.atmel.com/dyn/resources/prod_documents/doc1631.pdf MfG Spess
warum gibst du nicht jedem Text ein Label und machst die Außerdem nur so lang, wie nötig?
Gast
#1860497
Hi Die Multiplikation mit 18 lässt sich auch so bewerkstelligen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
MfG Spess
Hallo Spess,
ich hab's dann schlussendlich mit einer Multiplikation gemacht und das
ganze in ein Macro gepackt:
.macro print_lcd_text
ldi temp2, @0 ; Nummer des gewünschten
Textes
dec temp2 ; 1 abz. (tab beginnt bei 0)
ldi temp3, 18 ; 18 in temp3 (Anz bytes)
muls temp3, temp2 ; gew. Text * Textlänge
mov temp3, r1 ; high byte in temp3
mov temp2, r0 ; low byte in temp2
ldi zl, low(texte_lcd*2) ; Zeiger auf Texttabelle
ldi zh, high(texte_lcd*2)
add zl, temp2 ; Tabellenplatz berechnen
adc zh, temp3
Ausgabe_lcd1: ; Solange Zeichen ausg.,
lpm temp1,z+ ; bis Zeichen eine 0 ist
cpi temp1,0
breq Ausgabe_lcd2
rcall lcd_data
rjmp Ausgabe_lcd1
.endmacro
Vielen Dank nochmal für den Tipp
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.