Tabelle auslesen (asm)

OP #1860375
Lesenswert?

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 #1860497
Lesenswert?

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
OP #1861264
Lesenswert?

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.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren