Userdefinierte Characters erstellen

Oskar01

Mitglied
24. März 2008
267
0
16
Köln
Sprachen
  1. Assembler
Hallo,
im folgenden soll nun berichtet werden, wie es um die Versuche bestellt ist, selbst irgendwelche Pixel-Zeichen auf einem Dotmatrix 5 x7 bzw 5 x 8 LCD zu programmieren.

Es gibt hier - wie "immer" bei den LCDs - Mißverständnisse, oder die Beschreibungen sind einfach fehlerhaft oder fehlen ganz.



Set CGRAM Address:

lade Hex 40 für Adresse 00 im ASCII-Satz
dann Kommandomodus-Übergabe
jetzt die unteren 5 Bit für die Pixel reservieren, also
für waagerechten Strich Hex 1F. im "Datenübernahmemodus" (wie beschrieben in den Proggis von mir)
Der Controller erwartet jetzt insgesamt 8 Datenübernahme-Schreiboperationen.
Dann muß eine "Locate"-Positionierungsangabe erfolgen, sonst sieht man garnichts.
Erst jetzt wieder den neu kreierten Character auf der reservierten ASCII-
stelle also Hex 00 im Datenübernahmemodus übergeben.

Und es klappt.


Wie Adressen 01, bis 07 nun weiter programmiert werden, ist auch noch mit einem Fallstrick verbunden.

Mehr als 8 userdefinerte Zeichen kann man üblicherweise nicht programmieren.


Demnächst mehr. Auch die Tricks und das ASM-Programm, wo der Z-Pointer wieder Probleme bereitete.


So long,
Gruß von Oskar01
 
Fortsetzung

Hallo,
hier nun die gesammelten "Erfahrungen" beim Erstellen userdefinierter Charakters bei einem 16x2 Dotmatrix - LCDisplay.
Der erste Aha-Effekt ergab sich bei der Adressenzuordung der 7 freien ASCII-Code-Adressen hex 00 bis hex 07.
Man könnte ja den Steuerbefehlssatz Set CGRAM address so auffassen,
daß fortlaufend immer eine Nummer weitergezählt wird, also:
ASCII Code hex 00 = > Steuerbefehlssatz hex 40
.....
ASCII Code hex 07 = > Steuerbefehlssatz hex 47

das ist komplett falsch, wird aber nirgendwo in den Datenblättern explizit erwähnt:
Also korrekt muß es lauten:

Zunächst sendet man im Kommandomodus (RS auf "low") den Steuerbefehlssatz:

DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L H X X X X X X = "Set CGRAM Add."
DB6 = high => Set CGRAM address (ca. 50 Mikrosekunden)

ldi temp, 0x40 ; für den ASCII-Code hex 00
rcall kommando

und dann kommt's:

ASCII Code hex 00 = > Set Character generating ROM Address hex 40
ASCII Code hex 01 = > Set Character generating ROM Address hex 48
ASCII Code hex 02 = > Set Character generating ROM Address hex 50
ASCII Code hex 03 = > Set Character generating ROM Address hex 58
ASCII Code hex 04 = > Set Character generating ROM Address hex 60
ASCII Code hex 05 = > Set Character generating ROM Address hex 68
ASCII Code hex 06 = > Set Character generating ROM Address hex 70
ASCII Code hex 07 = > Set Character generating ROM Address hex 78

Mehr geht so nicht, da wir uns sonst schon im Steuerbefehlssatz
DB7 = high => Set DDRAM address (ca. 50 Mikrosekunden)
befinden würden.

Aha- Effekt numero zwei:
Und jetzt denkt man, ok, bin im Steuerteil, also Steuerbefehls-Kommandomodus mit "RS= low".

Dem ist aber nicht so.
Die Pixel werden nun in insgesamt acht aufeinanderfolgenden Datenübernahme-Operationen (RS= "high") generiert.

Dabei zählt der Controller mit jedem "Enable"-Impuls automatisch eine Adresse weiter, daher auch der geänderte Steuerbefehlssatz "Set CGRAM-Address" wie oben erwähnt.
So,so.

Da ich etwas "programmierschreibfaul" bin, schreibe ich nicht jedesmal Ladebefehle etc. rein, sondern möchte eine "Datenbank"-Funktion in Form eines Z-Pointer-Arrays oder wie man das nennt, verwenden.

Hierbei kommt die bereits früher erwähnte Problematik zum Tragen, daß sogenannte "Strings" immer irgendwie "terminiert", hier "nullteminiert" sein müssen.
Ich brauche aber die Null, also Wert hex 00 als Argument. Hmm.
OK.
Bleibt nichts anderes übrig, als auf die "Nullterminierung" hierbei zu verzichten und mich auf das korrekte Arbeiten einer Abzählschleife zu verlassen.

Scheint ja beides zu klappen,
also, sowohl beim "normalen" Text mit Testen (Befehl tst) des Registers r0 auf Null, als auch bei den Pixeln mit Zählen bis 9 (wobei 8 Schritte sauber ausgeführt werden).

Und noch etwas,
Sollen die Zeichen direkt dargestellt werden, muß zunächst eine
Positionierungsangabe (Locate => set DDRAM address) vorausgehen,
dann kann im Datenübernahmemodus wie auch bei einem "normalen" Text,
der entsprechende ASCII-Code hex 00 bis hex 07 gesendet werden.
(Also, Shift-Set läßt immer eine Stelle zu weit nach rechts oder links rutschen, aber die Ursache dafür versuche ich auch noch herauszubekommen.)

Unten als Dateianhang noch das vollständige Progrämmchen in AVR-ASM.

Viel Spaß,

Euer Oskar01

P.S.: OK, das userdefinierte "Smiley" ist wohl etwas mißraten......man arbeitet "pixelweise" noch dran.
 

Anhänge

  • userdefchar1.asm
    14,7 KB · Aufrufe: 9
  • userdefchar0.PNG
    userdefchar0.PNG
    45,9 KB · Aufrufe: 12

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)