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.