Hallo,
hat hier vielleicht jemand eine gut funktionierene Routine, mit der man
auf einem 2x16 Display im CGRAM freie Zeichen definieren kann.
Ich habe selbst eine Routine geschrieben, die allderings nicht zu
funktionieren scheint:
.
.
.
DEFINE_CHAR: ldi temp1, 0b01000000 ;Setze CGRAM Adresse auf 0
rcall LCD_COMMAND ;Befehl Ausführen (RS=0)
ldi ZL, LOW(2*char1) ;Z_Pointer laden
ldi ZH, HIGH(2*char1)
rcall PRINT
PRINT: lpm ;Z-Pointer Inhalt nach R0
tst r0 ;Teste R0 auf 0 (Abschluss)
breq PRINT_END
mov temp1, r0
rcall LCD_DATA ;Daten aufs LCD (RS=1)
adiw ZL, 1
rjmp PRINT
PRINT_END: ret
char1: .db 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0
.
.
.
.
Die Funktionen LCD_COMMAND und LCD_DATA funktionieren sicher. Ich habe
sie schon anderweitig getestet.
Vielleicht hat jemand eine elegantere und vor allem funktionierende
Lösung hierzu.
DesWeiteren habe ich folgende Frage: Ist es überhaupt sinnvoll auf die
CGRAM Adresse 0 ein Zeichen zu definieren, da dieses Zeichen dann den
ASCII-Code 0 hat und gleichzeitig auch als Abschluss eines Strings
hergenommen wird, und somit nie geschrieben wird.
Ein Simulationsprogramm für 2x16 LCD mit HD44780 Controller findet man
unter:
http://www.sxlist.com/techref/io/lcd/djlcdsim/djlcdsim.html
Dort funktioniert meine Routine, nur in der Realität nicht.
Für Lösungsansätze wäre ich sehr dankbar.
Gruß
Bernhard
DEFINE_CHAR: ldi temp1, 0b01000000 ;Setze CGRAM Adresse auf 0
rcall LCD_COMMAND ;Befehl Ausführen (RS=0)
ldi ZL, LOW(2*char1) ;Z_Pointer laden
ldi ZH, HIGH(2*char1)
rcall PRINT
hier fehlt ein ret, wie soll es denn weiter gehen, wenn das Programm
von print zurückkommt?
PRINT: lpm ;Z-Pointer Inhalt nach R0
tst r0 ;Teste R0 auf 0 (Abschluss)
breq PRINT_END
mov temp1, r0
rcall LCD_DATA ;Daten aufs LCD (RS=1)
adiw ZL, 1
rjmp PRINT
PRINT_END: ret
char1: .db 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0
Ob das mit tst 0 der richtige Weg ist? Kann ja schon mal vorkommen,
dass in einem Zeichen eine 0 vorkommt. Eine einfache for/next
-schleife mit fester Schleifenzahl entsprechend der Spaltenzahl (oder
wird das zeilenweise adressiert? Weiss ich jetzt nicht aus dem Kopf.)
des Displays.
Eine Routine habe ich nicht, da ich bisher immer mit dem vorhandenen ROM-Zeichensatz zurecht kam. Was Adresse 0 betrifft, die 8 selbstdefinierten Zeichen sind doch auch über Adresse 8...15 erreichbar. ...
Hy, Ich hab eine die mit dem LCD-Code aus dem AVR-Tutorial funktioniert: ....... ....... ....... rcall lcd_init rcall lcd_clear ;Display löschen ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;In den CG-RAM wechseln (Addresse 0) ldi temp1, 0x48 rcall lcd_command ;---------------------------------------------------- ;Daten senden (Zeichen deffinieren) (Die ersten 3 Bit's müssen 0 sein da nur 5 Pixel/Zeile) ldi temp1, 0b00010001 ;#ooo# rcall lcd_data ldi temp1, 0b00001010 ;o#o#o rcall lcd_data ldi temp1, 0b00000100 ;oo#oo rcall lcd_data ldi temp1, 0b00001010 ;o#o#o rcall lcd_data ldi temp1, 0b00000100 ;oo#oo rcall lcd_data ldi temp1, 0b00001010 ;o#o#o rcall lcd_data ldi temp1, 0b00010001 ;#ooo# rcall lcd_data ;Cursorzeile sollte leer ;bleiben, kann aber auch Deffiniert werden: ldi temp1, 0b00000000 ;ooooo rcall lcd_data ;---------------------------------------------------- ;Wieder in den DD-RAM wechseln ldi temp1, 0b10000000 rcall lcd_command ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;deffiniertes Zeichen aufrufen. ldi temp1, 0x01 rcall lcd_data loop: rjmp loop ;Endlosschleife ....... ....... ....... Gruß Lightning
Vielen Dank für die Tipps. Manchmal sieht man halt den Wald vor lauter Bäumen nicht mehr. Nun aber noch eine Frage: Wenn ich in den CGRAM wechsle (z.B. Adresse 0), dann wechselt der Cursor in die zweite Zeile, erste Spalte, bei Adresse 1 dann in die zweite Spalte. Ich möchte ja eigentlich im CGRAM Zeichen definieren, und nicht die Cursor-Position wechseln. Ist das normal, oder gewollt? Wenn ja für welche Zwecke, oder muß man darüber hinweg sehen? Danke schon mal für die Antworten. Gruß Bernhard
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.