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
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
Hy Johannes Raschke, könnten Sie vielleicht doch noch mal den Assemblercode kommentieren. Wäre sehr nett.
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?
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
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
@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
@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
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ß
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.