Forum: Mikrocontroller und Digitale Elektronik LCD Textausgabe


von Andy (Gast)


Lesenswert?

Hallo,ich hab mal ne frage.Ich muss sehr viel Text auf einem
Grafikdisplay ausgeben.Dieses mache ich mit
ldi zl,low(txt08*2)  ;Zeiger
 ldi zh,high(txt08*2)  ;auf Text
Der Text ist in einzelnen .db Anweisungen gespeichert.
Kann mann für zb.txt08 auch eine Variable übergeben,damit ich
nur die Variable ändern muss und den eigentlichen Schreibbefehl
per unterprogamm aufrufen kann.
gruss
Andy

von Andreas K. (andi_k)


Lesenswert?

Meinst Du sowas?

 ldi   zl,low(2*txt08)
 ldi   zh,high(2*txt08)
 rcall PrintStr
 ...

txt08: .db "Hello World",0

PrintStr:
 lpm   r16,z+
 tst   r16
 breq  PrtStrEnd
 rcall lcd_data
 rjmp  PrintStr
PrtStrEnd:
 ret

Ist doch die einfachste Übung ;-)

MfG
Andi

von Andy (Gast)


Lesenswert?

Hallo,was ich meine ist,das wenn ich zumbeispiel txt31 anzeigen lassen
will,dieses in eine Variable schreibe und dann nur
ldi zl,low(txt08*2)  ;Zeiger
 ldi zh,high(txt08*2)  ;auf Text
als unterprogramm aufrufe,wobei txt08 dann automatisch txt31 wird.
gruss
Andy

von Andreas K. (andi_k)


Lesenswert?

Soll in txt08 nicht nur Text, sondern auch Pointer auf andere Texte
stehen, oder was meinst Du?
Beschreibe mal genauer was Du willst.

MfG
Andi

von Andy (Gast)


Lesenswert?

Hallo was ich meine istfolgendes.
Ich habe ca.100 db anweisungen durchnummeriert mit
txt00:
.db  "blabla",0
bis
txt100:
.db  "blabla",0
Um mir nun txt0 anzeigen zu lassen führe ich folgendes aus
ldi r16,4        ;Zeile 0
 ldi r17,19        ;Spalte 0
 rcall posi        ;Schreibposition einstellen
 ldi zl,low(txt08*2)  ;Zeiger
 ldi zh,high(txt08*2)  ;auf Text
 rcall wtf        ;Write Text from Fla
Wenn ich nun zb.txt100 anzeigen lassen will,könnte ich dann nicht
irgendwie txt100 in eine Variable schreiben,und den oben aufgeführten
Code als unterprogramm ausführen,wobei dann aus txt08 txt100 wird und
somit der gewünschte text angezeigt wird.
Ich hoffe,ich habe mich halbwegs verständlich ausgedrückt.
gruss
Andy

von Klaus (Gast)


Lesenswert?

Hmmm!

Vielleicht solltest Du einen Offset übergeben anstatt explitzit
text08*2 oder zusammen.
Den Zeiger in deinem Unterprogramm kannste ja immer auf den Anfang
zeigenlassen und mit dem Offset könntest Du ja den Zeiger anpassen.

Gruß Klaus

von Andreas K. (andi_k)


Lesenswert?

Du kannst Dir Macros einrichten.
Z. B.:

.macro WriteText
 ldi   zl,low(@0)
 ldi   zh,high(@1)
 rcall wtf
.endm

Aufruf im Programm dann mit

 WriteText txt100

Ist es das was Du meinst?

Ansonsten bereitet mir dieses immer noch Kopfzerbrechen:
"wobei dann aus txt08 txt100 wird"???

mfG
Andi

von Andreas K. (andi_k)


Lesenswert?

Sollte natürlich so aussehen:
.macro WriteText
 ldi   zl,low(@0)
 ldi   zh,high(@0)  <-- hier war vorher der Fehler
 rcall wtf
.endm

MfG
Andi

von Andy (Gast)


Lesenswert?

hallo,ich möchte im programm in eine variable zb.20 schreiben.
dann das ausführen
ldi zl,low(variable*2)  ;Zeiger
 ldi zh,high(variable*2)  ;auf Text
Es geht darum,das ich nur die Variable ändere,dann das u-progamm
aufrufe
und der Zeiger dann auf die gewünschte db anweisung zeigt.
gruss
Andy

von Andreas K. (andi_k)


Lesenswert?

Das geht leider nicht ganz so einfach.
Es gibt zwar Möglichkeiten Konstannten mit .equ und .set zu definieren,
aber die sind nicht zur Laufzeit zu gebrauchen.
Für das, was Du willst, wird es etwas komplizierter.
Du mußt Dir eine Tabelle mit 100 Einträgen mit Zeigern auf Deine Texte
erstellen:

TxtTabelle:
.dw txt00, txt01, txt02, txt03 etc...

Dann brauchst Du eine Sub der Du z. B. 3 übergibst (zl) welche sich
dann aus dem 3. (4.) Eintrag die Adresse des Textes in Z holt:

Sub:
 clr   zh
 lsl   zl      ;Text-Nummer * 2 (Wortzugriff)
 rol   zh
 subi  zl,-(low(TxtTabelle*2))    ;Startadresse der Tabelle addieren
 sbci  zh,-(high(TxtTabelle*2))
 lpm   r0,z+    ;Textadresse low-Byte lesen
 lpm   r1,z+    ;Textadresse high-Byte lesen
 movw  zl,r0    ;Textadresse nach Z (zh:zl)
                ;hier dann die Textausgabe

MfG
Andi

von Andy (Gast)


Lesenswert?

Hallo,das sieht doch gut aus.Werd ich gleich mal ausprobieren.Danke für
die antwort und deine geduld.
gruss
Andy

von Andreas K. (andi_k)


Lesenswert?

Ach ja, in den Textadressen der Tabelle muß überall ein "* 2"
dahinter:
.dw txt00*2, txt01*2, txt02*2, txt03*2 etc...

MfG
Andi

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

In beiliegender Sammlung dürfte "printt" und "printts" das sein, was
du suchst.
Verwendet wird es etwa so:

Dies steht vor der Mainloop und wird nach Abarbeitung eines Menüpunktes
aufgerufen (mp ist die Menüpunktnummer, mt_head und mt_key sind die
Indextabellen):

 locate 0,0                 ;Position der LCD-Ausgabe
 printt mt_head,mp          ;Kopfzeile Menüpunkt ausgeben
 locate 7,0                 ;Position der LCD-Ausgabe
 printt mt_key,mp           ;Fußzeile Tastenzuordnung ausgeben

und am Ende des Programms stehen dann die Indextabellen mit den
Pointern auf die Texte und die Tabellen mit den Texten selbst:

mt_head:        ;obere Menüzeilen (Menüpunkte)
.dw mt_000,mt_010,mt_020,mt_030,mt_040,mt_050,mt_060,mt_070
.dw mt_080,mt_090,mt_100,mt_110,mt_120,mt_130,mt_030,mt_030
.dw mt_160

mt_000:     .db " ***   Edit-Mode    *** ",0,0
mt_010:     .db "  Datentransfer mit PC  ",0,0
mt_020:     .db "zur ersten/letzten Zeile",0,0
mt_030:     .db " eine Zeile hoch/runter ",0,0
mt_040:     .db "  Zeile de/aktivieren   ",0,0
mt_050:     .db " Einstellung Stunde x 1 ",0,0
mt_060:     .db "Einstellung Minute x 10 ",0,0
mt_070:     .db " Einstellung Minute x 1 ",0,0
mt_080:     .db "Einstellung Sekunde x 10",0,0
mt_090:     .db "Einstellung Sekunde x 1 ",0,0
mt_100:     .db "Auswahl des Z",$f5,"ndger",$e1,"tes ",0,0
mt_110:     .db " Z",$f5,"ndkreisnummer x 10   ",0,0
mt_120:     .db " Z",$f5,"ndkreisnummer x 1    ",0,0
mt_130:     .db "Daten ins EEP",$f5,"bernehmen ",0,0

mt_160:     .db " *** Feuerwerk-Mode *** ",0,0

mt_key:         ;untere Menüzeilen (Tastenzuordnung)
.dw mt_007,mt_017,mt_027,mt_037,mt_047,mt_057,mt_067,mt_077
.dw mt_087,mt_097,mt_107,mt_117,mt_127,mt_137,mt_037,leerz
.dw mt_167,mt_177,mt_187,mt_197,mt_197,mt_177a,mt_177a,mt_177a
.dw mt_167,mt_197,mt_197

mt_007:     .db "       Run         ++++>",0,0
mt_017:     .db "<----  Load  Save  ++++>",0,0
mt_027:     .db "<----  Home  End   ++++>",0,0
mt_037:     .db "<----  Up    Down  ++++>",0,0
mt_047:     .db "<----  deakt aktiv ++++>",0,0
mt_057:     .db "<----  +1 h  -1 h  ++++>",0,0
mt_067:     .db "<----  +10m  -10m  ++++>",0,0
mt_077:     .db "<----  +1 m  -1 m  ++++>",0,0
mt_087:     .db "<----  +10s  -10s  ++++>",0,0
mt_097:     .db "<----  +1 s  -1 s  ++++>",0,0
mt_107:     .db "<----  +1    -1    ++++>",0,0
mt_117:     .db "<----  +10   -10   ++++>",0,0
mt_127:     .db "<----  +1    -1    ++++>",0,0
mt_137:     .db "<----  Save  Abort      ",0,0

mt_167:     .db "             Edit  ++++>",0,0
mt_177:     .db "<Menu  Start Skip  Set >",0,0
mt_177a:    .db "       Stop  Skip       ",0,0
mt_187:     .db "<----  Up    Down  ++++>",0,0
mt_197:     .db "<Stop  Shot  Skip  Up   ",0,0

In diesem konkreten Beispiel wird auf einem Textdisplay mit 8 Zeilen a
24 Zeichen in der oberen Zeile eine Überschrift angezeigt und in der
unteren Zeile die Funktion der 4 darunter angeordneten
Bedienungstasten. Das Ganze läuft auf einem Mega8535 und dient als
Steuergerät (Schaltuhr) für Feuerwerke der Klasse 4.

Die Bibliothek (Routinensammlung) ist nicht als Dogma anzusehen, sie
wird so nach und nach an sich ändernde Ansprüche angepasst. Wenn es im
Flash mal eng werden sollte, dann werden unbenutzte Teile davon (von
einer zu verwendenden Kopie) gelöscht.

...

von Hannes L. (hannes)


Lesenswert?

Ganz vergessen:

Mojje Andi... - Schönen Sonntagabend wünsche ich dir...

Bit- & Bytebruch...
...HanneS...

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
Noch kein Account? Hier anmelden.