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
@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
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
@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
> "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.
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
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
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
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+ ...
Ohne jetzt auf sparsamkeiten zu achten. Könnte folgender Code im Anhang stimmen ?? Ich habe ih nach HanneS beispiel programmiert. Mfg. Lighning
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). ...
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.