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
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?
Hi Die Multiplikation mit 18 lässt sich auch so bewerkstelligen:
1 | ldi temp1, 15 |
2 | |
3 | mov temp2,temp1 |
4 | mov temp3,temp1 ; Kopie von temp1 |
5 | swap temp2 |
6 | swap temp3 |
7 | andi temp2,$F0 |
8 | andi temp3,$0F ; temp3:temp2 = 16*temp1 |
9 | |
10 | ldi zl, low(texte_lcd*2) ;Zeiger auf Texttabelle |
11 | ldi zh, high(texte_lcd*2) |
12 | |
13 | add ZL,temp2 |
14 | adc ZH,temp3 ; Z=Z+16*temp1 |
15 | |
16 | clr temp2 ; Null |
17 | |
18 | add ZL,temp1 |
19 | adc ZH,temp2 |
20 | add ZL,temp1 |
21 | adc ZH,temp2 ; Z=Z+ 2*temp1 |
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.