Forum: Mikrocontroller und Digitale Elektronik Font auf LCD in ASM...


von Lightning (Gast)


Lesenswert?

Hallo,

Ich würde gerne wissen wie man einen eigenen
Font für ein Grafik LCD in Assembler erstelt.

Habe schon Google und das Forum durchsucht
und dabei auch viele Infos gefunden aber
es war leider nicht das was ich brauche.

Falls jemand Tipps, Links, etc. über dieses
Thema hat, immer her damit...

Danke schonmal im Voraus.

Mfg. Lightning

von Klaus...(Norad) (Gast)


Lesenswert?

@Lightning´

Nun Ja!
Du machst dir am besten in einem Editor eine Tabelle
z.B. für Standard  6*5 Font (ich Glaub so nennt man das)
Eine ASCII- Tabelle kann da sehr hilfreich sein.


; Character: ' ' - 20h = 00h
CHR_20:  DB  00000000b,00000000b,00000000b,00000000b,00000000b,00000000b
                  .
                  .
                  .
; Character: 'A' - 41h = C6h
CHR_41:  DB  01111110b,00010001b,00010001b,00010001b,01111110b,00000000b

Jedes Zeichen besteht aus 6-Bytes wenn Du größere Zeichen ausgeben
möchtest musst Du dir was einfallen lassen zwecks Steuerung der Ausgabe
x,y pro Datenbyte, Sprich (Zeile, Spalte  und noch welcher
Displayhälfte) hängt natürlich vom Display-Typ ab.

Gruß Klaus

von Ludwig W. (lordludwig)


Lesenswert?

naja das problem ist man kann nur 6? zeichen speichern und wenn man ein
zeichen ausgibt und danach ändert bleibt es nicht erhalten. Also wird
das schlecht gehen

von Klaus...(Norad) (Gast)


Lesenswert?

@Ludwig

Ähh! Wie meinst Du das??

MFG Klaus

von Lightning (Gast)


Lesenswert?

@Klaus

Wegen x,y ist es eigentlich kein Problem
da ich so ein NOKIA 6100 Display verwende.
Und dort die Zeichen sowiso aufs Display
"gezeichnet" und nicht geschrieben werden.

Ich weiß nur nicht wie ich das Zeichen ausgeben kann.
Was ich meine ist, dass wenn ich z.B. ein 'A' vom
PC über UART zum AVR sende, dann kann man das bei
normalen Displays ziemlich leicht anzeigen lassen.

Das Problem ist:
"Der AVR muss das Zeichen erkennen" und dann
das entsprechende Zeichen aus der Tabelle abrufen
und auf dem Display ausgeben.
Nur ich weiß nicht wie ich das bewerkstelligen soll.


@Ludwig
Du meinst sicher die 6 oder 8 Benutzerdefinierten Zeichen
die man in solchen Display erstellen kann stimmts ???

Ja ne da hast schon recht das ist keine gute Lösung.
Aber ich will das sowiso anders machen. Und zwar werden
die Zeichen die Ich defunier ja eugentlich auf das Display
gezeichnet da es aus einer Tabelle geschrieben wird.
Also ist auch die Größe egal.


MFG. Lightning

von Karl H. (kbuchegg)


Lesenswert?

> "Der AVR muss das Zeichen erkennen" und dann
> das entsprechende Zeichen aus der Tabelle abrufen
> und auf dem Display ausgeben.
> Nur ich weiß nicht wie ich das bewerkstelligen soll.

Um ein 'Zeichen' anzuzeigen, musst Du ja bestimmte 'Pixel'
einschalten.
D.h. Du musst fuer jedes Zeichen exakt wisse, welche Pixel
eingechaltet werden muessen. Klaus hat das ja schon mal exemplarisch
gezeigt:

Fuer ein 'A' brauchst Du (bei seinem angenommenen Font von 6*8)

 +---+---+---+---+---+---+
 | * | * | * | * | * |   |
 +---+---+---+---+---+---+
 | * |   |   |   | * |   |
 +---+---+---+---+---+---+
 | * |   |   |   | * |   |
 +---+---+---+---+---+---+
 | * |   |   |   | * |   |
 +---+---+---+---+---+---+
 | * | * | * | * | * |   |
 +---+---+---+---+---+---+
 | * |   |   |   | * |   |
 +---+---+---+---+---+---+
 | * |   |   |   | * |   |
 +---+---+---+---+---+---+
 |   |   |   |   |   |   |
 +---+---+---+---+---+---+

(Ich hoffe man kann das 'A' erkennen. Es sind die '*' in einer
Matrix. Schnapp Dir einfach ein Blatt karriertes Papier, umrande
ein 6*8 Quadrate grosses Gebiet und mal ein Kreuz in alle Pixel
die Du eingeschaltet benoetigts um das Zeichen darzustellen.)

Dann ist Klaus einfach hergegangen und hat fuer eine Spalte
(beginnend von unten) die Bits entsprechend rausgeschrieben
0 = nicht gesetzt, 1 = gesetzt.
Das Ergebnis war:
  01111110b,00010001b,00010001b,00010001b,01111110b,00000000b

Soweit so gut.
Wenn Du also eine Funktion schreibst, die obige Bytes wieder in
Bits zerpflueckt und entsprechend dem Wert am Display das Pixel
ein- oder ausschaltet, muesste ein 'A' auftauchen.

Probier das mal. Du kannst im uebrigen auch die Codierung voellig
anders machen. zb die Pixel von oben nach unten lesen, oder ueberhaupt
waagrecht statt senkrecht. Ist voellig dir ueberlassen.

Der springende Punkt ist nur: Fuer alle Zeichen brauchst du eine
konstante Anzahl an Bytes. Im obigen Fall sind es genau 6.
D.h. Du baust Dir eine riesige Tabelle auf, bei der jeweils 6
Bytes in Folge das Pixelmuster fuer ein Zeichen enthalten. Wenn
Du dann ein Zeichen bekommst (zb ueber die serielle), dann nimmst
Du einfach den Code dieses Zeichens her, multiplizierst mit 6
und genau an dieser Indexposition in der Tabelle beginnen die
Pixeldaten fuer dieses Zeichen und sind 6 Bytes lang.

Ist nicht wirklich schwierig, nur das Erstellen der Pixeltabelle
ist eine Mordsarbeit.

von Thorsten F. (thorsten)


Angehängte Dateien:

Lesenswert?

Morgen!

Genau so wie Karl es beschrieben hat, habe ich mir einen Zeichensatz
für das Hyundai Grafik Display von Pollin gebaut.

Vielleicht kann der ein oder andere damit ja was anfangen :)

mfg

von SuperUser (Gast)


Lesenswert?

Wenn du hier im Code schaust findest du auch eine ASCII Tabelle in
binary Form. Ist zwar in C aber das in .data umzuwandeln sollte kein
Problem sein.

http://www.mikrocontroller.net/forum/read-4-243641.html#new

von Lightning (Gast)


Lesenswert?

Hallo,

Erstmal danke für die vielen Antworten.

Ich habe mir jetzt so eine ASCII-Tabelle
für meinen AVR geschrieben. Nun habe ich
nur noch folgende Probleme:

1.) Wie erkenne ich mit dem AVR das Zeichen, dass
    (z.B. seriell) ankommt ???

2.) Wie rufe ich aus der Tabelle das benötigte
    Zeichen auf.

Mfg. Lightning

von Hannes L. (hannes)


Lesenswert?

Das ankommende Zeichen ist ein ASCII-Wert.
Das bedeutet nix Anderes, als die Nummer des Zeichens in der
ASCII-Tabelle.
Da die darstellbaren (druckbaren) Zeichen erst ab 32 (Leerzeichen)
beginnen, deine Tabelle aber schon ab 0, musst du erstmal vom
empfangenen Zeichen 32 subtrahieren.
Dann setzt du den Z-Pointer auf den Beginn der Tabelle:

 ldi zl,low(tabelle*2)
 ldi zh,high(tabelle*2)

wobei mit "tabelle" das Label vor der Tabelle gemeint ist.

Nun musst du den (bereits um 32 verminderten) ASCII-Wert mit 6
multiplizieren.

 ldi temp,6
 mul asciiwert,temp

Das Ergebnis steht nun in r1:r0. Dieses muss zum Z-Pointer addiert
werden, damit der Z-Pointer auf das richtige Byte zeigt:

 add zl,r0
 adc zh,r1

Danach kannst du 6 mal hintereinander ein Byte aus den Flash lesen und
weiterbearbeiten (versenden):

 lpm r0,z+

...

von Lightning (Gast)


Angehängte Dateien:

Lesenswert?

Ohne jetzt auf sparsamkeiten zu achten.
Könnte folgender Code im Anhang stimmen ??

Ich habe ih nach HanneS beispiel programmiert.

Mfg. Lighning

von Hannes L. (hannes)


Lesenswert?

Falsch...

Deine ASCII-Tabelle stimmt nicht.
"A" ist erst an Position 65. Nach Space kommt erstmal das
Ausrufezeichen, dann das Anführungszeichen usw. Du wirst schonmal den
Blick in die verbindliche ASCII-Tabelle riskieren müssen.

Ansonsten wird dir der Simulator im AVR-Studio Auskunft geben können.
Tip: Öffne eines der Memory-Fenster und wähle darin die Anzeige der
Register aus. Dann kannst du dich im Workspace auf die I/O-Register
konzentrieren. Eine Liste (Papier) mit den Aliasnamen der Register kann
auch sehr hilfreich sein, da das Memoryfenster diese Aliasnamen (aus mir
nicht verständlichen Gründen) nicht anzeigt.

Ob es genügt, dem LCD einfach nur eine Sequenz dieser Bitmuster
hinzuwerfen, weiß ich nicht, da musst du das Datenblatt deines LCDs
fragen. Auch weiß ich nicht, ob dein LCD mit waagerechten oder
senkrechten Bytes (Pixelgruppen 8x1) arbeitet. Bei waagerechten Bytes
müsstest du 8 Bytes pro Zeichen haben, die jeweils 6 Bit fassen (2 Bit
umbenutzt).

...

von Lightning (Gast)


Lesenswert?

@HanneS

Ja ne das mit der ASCII-Tabelle weiß ich schon.
Ich hab da nur zur besseren verständlichkeit
die ABC daruntergeschrieben. Meine Tabelle
fängt natürlich mit Space an und geht mit
", !, ", #, $, %, &, ', (, ),........ weiter.

Wegen dem LCD:
Das Nokia 6100 Display ist sehr flexiebel.
Man kann da sowohl senkrecht als auch waagrecht schreiben.
Das ist überhaupt kein Thema. Auch kann man die Bitmuster
einfach so hineinschreiben. Man muss nur für jede neue Zeile
des Zeichens eine Y Adresse (1 Pixel Zeile) weiter runter gehen.
Und für ein neues Zeichen eben einen neuen X-Wert setzen.

Mfg. Lightning

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.