Forum: Mikrocontroller und Digitale Elektronik Textausgabe auf LCD


von Helmut Hofmann (Gast)


Lesenswert?

Hallo,
gibt es eine elegantere Möglichkeit der Assemblerprogrammierung für
eine Textausgabe auf LCD, als einzelne Zeichen wie folgt zu
assemblern??
          rcall lcd_clear
    ldi temp1, 0x00
           sbr temp1,1<<7
           rcall lcd_command

           ldi temp1,'H'
     rcall lcd_data

    ldi temp1,'A'
     rcall lcd_data

    ldi temp1,'L'
     rcall lcd_data

    ldi temp1,'L'
     rcall lcd_data

    ldi temp1,'O'
     rcall lcd_data

für eine kurze Beschreibung mit Code wäre ich dankbar.


Helmut

von Johannes Raschke (Gast)


Lesenswert?

Dieses Programmfragment dürfte selbsterklärend sein.


rcall lcd_clear

    ldi ZH, high(2*help_string)
    ldi ZL, low(2*help_string)
    rcall printdisp


; ***********PRINTDISP - String - Ausgabe auf Display ************
printdisp: ;erwartet Adresse des auszugebenden Strings in ZL
      push r0
      push temp1
      lpm
      mov temp1, r0
next_char2:  rcall lcd_data ; Die Funktion, um ein einzelnes Zeichen in
r0 auszugeben
      adiw ZH:ZL, 1
ok2:    lpm
      mov temp1, r0
      cpi temp1, 0    ;erwartet 0-terminierte Strings
      brne next_char2
      pop temp1
      pop r0
ret

Texte:
help_string: .db "0123456789abcdefghijklmnopqrstuvwxyzzzzzzzz",0

von Bastian (Gast)


Lesenswert?

Hy Johannes Raschke,
könnten Sie vielleicht doch noch mal den Assemblercode kommentieren.
Wäre sehr nett.

von Johannes Raschke (Gast)


Lesenswert?

Wenn's denn sein muß... Hast Du es denn mal ausprobiert? Im Simulator
dürfte die Funktion sehr schnell klar werden!

Im Hauptprogramm lade ich das Z-Doppelregister mit der Startadresse des
Strings:

ldi ZH, high(2*help_string)
ldi ZL, low(2*help_string)

dann wird das Unterprogramm aufgerufen, welches die Zeichen ab der in Z
stehenden Adresse ausgeben soll, bis zum ersten Nullbyte (Ende -
Markierung).
Dort sichere ich erstmal temp1 und r0 auf dem Stack, weil ich die
verändern werde:

push r0
push temp1

Dann wird mit dem Befehl

lpm

der Inhalt der Adresse, die in Z steht, nach r0 geladen. In diesem Fall
also der ASCII - Code des Zeichens "0", welches am Anfang des Strings
steht.
Die Funktion lcd_data erwartet das auszugebende Zeichen aber in temp1
(Fehler im Kommentar), so daß ich dort hineinschreiben muß:

mov temp1, r0

Jetzt kann ich die LCD - Ausgabefunktion aufrufen, die ich aus dem
Quelcode-Archiv hier übernommen habe:

next_char2:  rcall lcd_data

Weil ich ja noch mehr Zeichen ausgeben will, erhöhe ich die Adresse in
Z um eins:

adiw ZH:ZL, 1

und lese mal, was dort steht:

lpm

Der aus dem String gelesene Wert wird wieder nach temp1 kopiert und
anschließend mit null verglichen:

mov temp1, r0
cpi temp1, 0

Ich habe nämlich am Ende des am Programmende definierten Strings eine
Null am Ende angehängt, damit ich das Ende erkennen kann. Das Zeichen
Nr. Null kommt nämlich in keinem normalen String vor.
Wenn nun eine Null gelesen wurde, bin ich am Ende und damit fertig;
falls nicht, muß ich das soeben gelesene Zeichen ausgeben. Dazu springe
ich zurück an die Stelle, wo das gemacht wird:

brne next_char2

Am Ende werden die zuvor gesicherten Register wieder zurückgeschrieben
und das Unterprogramm wird verlassen.

Alles klar?

von Johannes Raschke (Gast)


Lesenswert?

Hallo Basian,

nachdem ich mir die Mühe mit der Programmerklärung gemacht habe wäre es
natürlich nett, wenn von Deiner Seite auch mal eine Rückmeldung käme,
ob Dein Projekt damit nun funktioniert...

Viele Grüße

Johannes

von Bastian (Gast)


Lesenswert?

Hallo Johannes,
bin grat zwei Wochen auf einem Lehrgang und nur an ein paar Tagen
daheim. Deshalb konnte ich mich bis jetzt noch nicht in deine
Programmbeschreibung einlesen.
Und wegen dem Projekt. Ich habe eigentlich noch keins. Ich will mich
erstmal in die AVR´s einarbeiten. Dazu habe ich kleinere Probeprogramme
geschrieben und getestet. Aber die Displayroutinen habe ich erst nur
theoretisch durchgearbeitet. Dazu habe ich schon mal die
Assemblerroutinen auf dieser Hompage durchgelesen und will sie mit
deinen vergleichen. Deswegen bin ich eigentlich für alles dankbar was
ich an Informationen bekomme. Auch wenn machnche Leute von der Fragerei
schon genervt sind ;)

MfG
Bastian

von Merle (Gast)


Lesenswert?

@Johannes Raschke
Hi dein string-code ist wirklich super.
Werd ihn sobald mein AVR brenner wieder
funzt ausprobieren.

Könnte man den code auch zur ausgabe
von strings an einem Grafik LCD verwenden??
Rein theoretisch müsste das doch gehen oder ??

Gruß
Beni

von Johannes Raschke (Gast)


Lesenswert?

@Merle

Hi!

Ja, das könnte im Prinzip  gehen, aber da tritt das  Problem auf , daß
Du erstmal eine Funktion schreiben mußt, die ein einzelnes Zeichen aufs
Display schreiben kann. Viele Grafik - LCDs können das nämlich nicht
selbst.
Das wird also sehr viel Arbeit...
Wenn Du ein GLCD hast, welches einen Zeichengenerator eingebaut hat,
bist Du natürlich im Vorteil...

Der Code funktioniert übrigens genau so zur Ausgabe von Strings über
die serielle Schnittstelle (UART).

Viele Grüße

Johannes

von bukongahelas (Gast)


Lesenswert?

hi,heiße uli,bin neu.
hab mal ein led-display mit 512 leds gebaut
und weils nur aus leds und transistoren bestand,
hatte ich keine ansteuerprobleme.
klar:ist kein lcd,wolz nur mal anmerken.
gruß

von Merle (Gast)


Lesenswert?

@Johannes Raschke
Thanx für die antwort werd mich
mal drann machen es auszuprobieren.

Ein GLCD mit T6963C hat doch einen
Zeichengenerator integriert oder ??

Gruß
Beni

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.