Hi, ich habe hier ein DOGXL240 und suche hier schon seit Stunden Zeichensätze die ich damit verwenden könnte. Es gibt hier ein super Archiv unter Beitrag "LCD Schriftarten ( Fonts in veschiedenen Größen )". Nur wie ich dort gerade gepostet haben scheinen die grösseren Vertikal-Fonts defekt zu sein. Ich suche Zeichensätze in 8x16 und 24x32. Oder auch 10x16. Vorzugsweise als zwei-dimensionales Array. Irgendwie finde ich fertig nur horizontal angeordnete Zeichensätze.
Ich hab mir hier aus dem Forum einen Font-Editor geholt, mit dem ich mir meine Fonts aus Windows-Fonts selbst erzeuge. Brauch ich sowieso, weil ich ein paar Sonderzeichen brauche, die in einem normalen Font nicht drinn sind. Ausserdem geht es schneller als stundenlang nach Fonts suchen, für die man dann sowieso erst recht wieder eigene Anzeigeroutinen schreiben muss. Hier die Routine, mit der ich dann einen einzelnen Buchstaben Pixel für Pixel hinmale. Leerzeichen werden extra behandelt, weil sie in den Fontdaten nicht drinnen sind.
1 | // Das Header File wird vom FontTool erzeugt
|
2 | #include "../Font/Trebuchet_20.h" |
3 | |
4 | struct fontDesc_t* pFontDesc = &Trebuchet_20_Desc; |
5 | |
6 | int LCDDrawChar( int left, int top, char c ) |
7 | {
|
8 | int heightInPixel = pFontDesc->heightInPixel; |
9 | int widthInPixel; |
10 | int i; |
11 | int firstPixelBitPos; |
12 | unsigned char cu = (unsigned char)c; |
13 | unsigned char* pDataStart = &(pFontDesc->pData)[pFontDesc->lastChar - pFontDesc->firstChar + 1]; |
14 | |
15 | if( c == ' ' ) { |
16 | BSP_LCD_SetFillColor( (uint32_t)0xFFFFFFFF ); |
17 | LCDFillRect( DISPLAY_OFFSET_X + CursorX * CellSizeX, DISPLAY_OFFSET_Y + CursorY * CellSizeY, |
18 | CellSizeX+1, CellSizeY+1 ); |
19 | return 3; |
20 | }
|
21 | |
22 | if( cu < pFontDesc->firstChar || cu > pFontDesc->lastChar ) |
23 | cu = '?'; // Assume exists everywhere |
24 | |
25 | cu -= pFontDesc->firstChar; |
26 | |
27 | widthInPixel = pFontDesc->pData[cu]; |
28 | |
29 | // locate data bytes by summing up all the width of the previous characters
|
30 | // starting at the beginning of the data location
|
31 | firstPixelBitPos = 0; |
32 | for( i = 0; i < cu; i++ ) |
33 | firstPixelBitPos += pFontDesc->pData[i]; |
34 | firstPixelBitPos *= heightInPixel; |
35 | |
36 | LCDRenderFontData( left, top, pDataStart, firstPixelBitPos, widthInPixel, heightInPixel ); |
37 | |
38 | return widthInPixel; |
39 | }
|
40 | |
41 | void LCDRenderFontData( int x, int y, unsigned char* pDataStart, int firstPixelBitPos, int widthInPixel, int heightInPixel ) |
42 | {
|
43 | int i; |
44 | int top = y; |
45 | |
46 | for( i = 0; i < widthInPixel * heightInPixel; i++ ) { |
47 | int bytePos = firstPixelBitPos / 8; |
48 | int bitPos = firstPixelBitPos % 8; |
49 | |
50 | if( ( pDataStart[bytePos] & ( 1 << bitPos) ) && BSP_LCD_GetTextColor() != LCD_COLOR_TRANSPARENT ) |
51 | LCDDrawPixel( x, y, BSP_LCD_GetTextColor() ); |
52 | else if( BSP_LCD_GetBackColor() != LCD_COLOR_TRANSPARENT ) |
53 | LCDDrawPixel( x, y, BSP_LCD_GetBackColor() ); |
54 | |
55 | firstPixelBitPos++; |
56 | y++; |
57 | if( y == top + heightInPixel ) { |
58 | y = top; |
59 | x++; |
60 | }
|
61 | }
|
62 | }
|
Edit: Ist für einen STM32, daher der recht freizügige Umgang mit 'int'. Auf einem AVR würde ich das nicht so machen.
:
Bearbeitet durch User
Okay, den 10x16 habe ich am Laufen, einfach mal falsch interpretiert wie die Daten im Array abgelegt sind. Aber abwechselnd die beiden Zeilen des Zeichens passt so überhaupt nicht zu einer halbwegs effizienten Ausgabe. Hat dann noch mal bitte jemand einen 24x32 Zeichensatz für mich? Oder ein Idee, womit ich das 22x36.bmp konvertieren könnte?
Karl H. schrieb: > Ich hab mir hier aus dem Forum einen Font-Editor geholt, mit dem ich mir > meine Fonts aus Windows-Fonts selbst erzeuge. Den habe ich mir gerade angesehen, danke. Verstehen tue ich das Ding allerdings nicht. Irgendwie kann ich aus dem Teil heraus nicht exportieren. Und wie bei allen Font-Importern die ich bisher gesehen habe kommt irgendwas unkontrollierbarers in Beziehung auf die X-Y Grösse dabei raus. Font.exe kann nur mit .font Dateien arbeiten und Convert.exe kommt nur mit Grafik-Dateien klar und lässt sich nicht einstellen.
Rudolph schrieb: > Irgendwie kann ich aus dem Teil heraus nicht exportieren. Font.exe: "import Font" Font einstellen, Größe und sonstiges einstellen "export Font" Filenamen angeben Fertig. > Und wie bei allen Font-Importern die ich bisher gesehen habe kommt > irgendwas unkontrollierbarers in Beziehung auf die X-Y Grösse dabei > raus. Ja, das ist leider ein Problem. Ich hab dann halt einfach mit der Windows-Font Größe gespielt, bis ein 'A' die Pixelgröße hat, die ich haben will. Geht ja schnell. Und hat man denn erst mal eine brauchbare Größe gefunden, dann funktioniert die auch mit anderen Font-Formen. Dafür hab ich allerdings einen riesigen Pool an fertigen Font-Daten für alle denkbaren Verwendungszwecke. Aber ok. Wenn du nicht willst, dann eben nicht. Ich seh die Sache halt so, dass ich anstelle stundenlang nach etwas zu suchen, was ich nicht finde, lebe ich lieber mit einer Krücke und schreib mir halt die dazu passenden Ausgabe-Routinen schnell selber. Wozu bin ich Programmierer? Mit der gesparten Zeit spiele ich lieber rum und seh mir an, wie die Maschinensteuerung mit einem Western-Font aussieht oder ob doch etwas mehr futuristisches Eindruck schindet.
:
Bearbeitet durch User
Karl H. schrieb: >> Irgendwie kann ich aus dem Teil heraus nicht exportieren. > > Font.exe: > > "import Font" > Font einstellen, Größe und sonstiges einstellen > > "export Font" > Filenamen angeben > > Fertig. Hmm, ja, und dann? Damit bekomme ich als Ergebnis eine .font Datei mit der ich nichts weiter machen kann.
Ah, moment, die .h wird auch noch generiert, nur ohne jedes Feedback. Sind die Daten da drin jetzt horizontal oder vertikal?
Rudolph schrieb: > Ah, moment, die .h wird auch noch generiert, nur ohne jedes Feedback. > Sind die Daten da drin jetzt horizontal oder vertikal? Die Daten da drinn sind so drinnen, wie du sie ausgibst. WEnn du putpixel( x, y ); machst, dann eben vertikal (oder horizontal, je nach Sichtweise) WEnn du putpixel( y, x ); machst, dann in der anderen Richtung. Das ist das schöne am selberschreiben. Man kann sich das alles anpassen. (Die Bits sind so angeordnet, dass die Buchstaben Spalte für Spalte von oben nach unten bearbeitet werden. Was du dann daraus machst, ist aber eine andere Sache. Koordinaten zu tauschen ist ja nicht das grosse Problem. Und ja, eines der 'Problemkreise' ist, dass ein Font, der sich mit einer Höhe von 14 Pixel identifiziert dann auch tatsächlich alle 14 Bits einen Spaltenwechsel macht. Die Fonts sind spaltenweise nicht auf Bytegrenzen ausgerichtet. Für mich spielte das keine grosse Rolle, weil ich keine Mördertexte ausgeben muss. Für ein paar Beschriftungen im überschaubaren Rahmen ist das schnell genug. Wenn es ein Problem wäre, dann würde ich den Font mit einem weiteren Tool vorverarbeiten, so dass mir der fertig aufs LCD klatschbare Bytes generiert. Dadurch verliere ich dann allerdings auch die einfache Möglichkeit, einen Buchstaben an jede beliebige Pixelposition hinzusetzen. Aber ich gebe auch zu, dass ich in dieser Beziehung sowieso eigen bin - ich schrecke nicht davor zurück mir für ein Projekt die entsprechenden Daten-Konverter notfalls auch selbst zu programmieren.
:
Bearbeitet durch User
Karl H. schrieb: > Die Daten da drinn sind so drinnen, wie du sie ausgibst. Ist ja richtig, das Display will das aber vertical haben. Wenn der Controller das auch noch on-the-fly von horizontal auf vertikal umbauen muss, dann ist der ja quasi nur noch damit beschäftigt. Und auch noch sinnlos beschäftigt weil die Daten ja an sich statisch sind.
Rudolph schrieb: > Karl H. schrieb: >> Die Daten da drinn sind so drinnen, wie du sie ausgibst. > > Ist ja richtig, das Display will das aber vertical haben. > Wenn der Controller das auch noch on-the-fly von horizontal auf vertikal > umbauen muss, dann ist der ja quasi nur noch damit beschäftigt. > > Und auch noch sinnlos beschäftigt weil die Daten ja an sich statisch > sind. Soll ich dir einen Converter schreiben? Die pixelbasierte Routine ist ja schon vorhanden. Da noch eine Funktion, die die Pixel für einen Character in ein 2D Array 'rendert' und die so entstandenen Bytes auf ein neues File (fertig aufbereitet für einen #include) schreibt, ist doch jetzt nicht wirklich das Problem? Man merkt, ich werde alt.
:
Bearbeitet durch User
Hallo, @ Karl Heinz: bei mir endet sowas immer so: da ich einen lokalen Webserver aus anderen Gründen parat habe und da am wenigsten nachdenken muß, gibt es schell ein PHP-Script, das die Daten eben umsortiert. Das (jetzt ohnehin seit Jahren vorhandene) ist meist in 15 Minuten und einem Fehlversuch erledigt. Wenn da nichts vorhanden ist, würde es wohl der gerade genutzte AVR mit seriellen Schnittstellen und einem Terminalprogramm erledigen müssen... Font in den Flash, Konvertierung geschrieben, testweise gleich auf dem Zieldisplay angezeigt und per seriellen, Terminalprogram, Datei gespeichert. Gruß aus Berlin Michael
:
Bearbeitet durch User
Michael U. schrieb: > Hallo, > > @ Karl Heinz: bei mir endet sowas immer so: da ich einen lokalen > Webserver aus anderen Gründen parat habe und da am wenigsten nachdenken > muß, gibt es schell ein PHP-Script, das die Daten eben umsortiert. Bei mir ist es nicht PHP sondern C++ oder C. Und das auch nur deshalb weil ich da einfach die letzten 20 Jahre drinn gearbeitet habe. Sonst wärs eben die Sprache oder das Tool mit dem ich am besten umgehen kann. Ergo: selbes Prinzip. > Das > (jetzt ohnehin seit Jahren vorhandene) ist meist in 15 Minuten und einem > Fehlversuch erledigt. Yup. Genau so siehts aus. Und das beste daran: je mehr man programmiert und je mehr Tools man sich selber macht, desto besser wird man. Übung macht eben den Meister. Ich hab mir meine Fertigkeiten auch nicht über Nacht angeeignet. Vielleicht habe ich gerade deshalb wenig Verständnis dafür, dass jemand stundenlang das Web nach einfachen Werkzeugen absucht, die er leicht in längstens 1 Stunde selbst machen kann.
:
Bearbeitet durch User
Och, wenn Ihr Spass dran habt. :-) Nein, im Ernst, der 10x16 läuft ja und zwar unkompliziert. Der wird einfach aus dem FLASH ins Display geschrieben. Dazu bin ich gerade dran mit der 22x36 davon noch zu konvertieren. Auch alleine schon weil der dazu passt. Ohne die Software die Benedikt zum Konvertieren benutzt hat wird das aber noch ganz schön anstrengend. Wenigstens brauche ich lange nicht alle Zeichen, im wesentlichen die Zahlen.
Hier, nicht immer nur nehmen, sondern auch mal was geben. :-) Das sind die Zahlen von 0..9 und ein Punkt als 20x32, angeordnet wie das DOGXL240 das haben möchte. Konvertiert aus dem Bild eins weiter oben das aus dem Archiv stammt im Beitrag den ich Eingangs verlinkt habe.
Karl H. schrieb: > Hier die Routine, mit der ich dann einen einzelnen Buchstaben Pixel für > Pixel hinmale. Au weia, warum einfach, wenn es auch kompliziert geht? Zum einen sieht dein Buchstaben-Hinmale-Routine reichlich wirr aus, zum anderen scheinen mir die Fonts von H.Reddmann recht unüberlegt gemacht zu sein, siehe dort:
1 | struct fontDesc_t { |
2 | unsigned int totalSize; |
3 | unsigned char widthInPixel; |
4 | unsigned char heightInPixel; |
5 | unsigned char bitsPerPixel; |
6 | unsigned char firstChar; |
7 | unsigned char lastChar; |
8 | unsigned char* pData; |
9 | };
|
Das heißt im Klartext, daß man nur feste Breiten hat, dafür aber BitsPerPixel, also Farbangaben - die nun wirklich nicht in einen Font hineingehören. Rudolph schrieb: > Hat dann noch mal bitte jemand einen 24x32 Zeichensatz für mich? Fertig zum Sich_ins_gemachte_Bett_legen? Nö. Aber wenn du mal in die (mittlerweile steinalte) Lernbetty hier im Forum hineinguckst, dann findest du dort sowohl Fonts, als auch nen kleinen Fontcompiler als auch das dazu passende GDI. Und die Fonts können je nach Gusto feste Breite haben als auch proportional sein. Ich häng dir mal was zum Ansehen dran. Das GDI ist für Monochrom, in der Lernbetty findest du ein kompatibles für 4 Graustufen und die Erweiterung auf Farben sollte damit ein Leichtes sein. W.S.
W.S. schrieb: > Rudolph schrieb: >> Hat dann noch mal bitte jemand einen 24x32 Zeichensatz für mich? > > Fertig zum Sich_ins_gemachte_Bett_legen? Nö. Tja, schade, die Idee war einfach das Rad nicht wiederholt neu zu pixeln. > Aber wenn du mal in die (mittlerweile steinalte) Lernbetty In was bitte? > hier im Forum hineinguckst, dann findest du dort sowohl Fonts, > als auch nen kleinen Fontcompiler als auch das dazu passende GDI. > Und die Fonts können je nach Gusto feste Breite haben > als auch proportional sein. Und wo bitte? Die Vielfalt hier wird langsam etwas unübersichtlich und schwieriger zu durchsuchen. Kann gut sein, dass ich was übersehen habe. Ausserdem habe ich ausdrücklich für das DOGXL240 gesucht, das hat entgegen den scheinbar meisten anderen Displays und so BIOS-Fonts die Anordnung vertikal und nicht horizontal. > Ich häng dir mal was zum Ansehen dran. Das GDI ist für Monochrom, in der > Lernbetty findest du ein kompatibles für 4 Graustufen und die > Erweiterung auf Farben sollte damit ein Leichtes sein. Danke, aber weder suche ich Grafik-Routinen, noch brauche ich Farbe. Das DOGXL240 ist einfach nur ein Monochrom-Display. Das FM.exe in dem Archiv macht scheinbar garnichts. "Das war's. ...enter" Einzelne Pixel kann ich auch nicht setzen, ich habe keinen Abbild des Displays im Controller und per SPI kann man das nur beschreiben. Aber naja, eigentlich bin ich ja fertig. Der Zeichensatz könnte nur etwas schicker aussehen, gerade auch der 10x16.
Hi >Ausserdem habe ich ausdrücklich für das DOGXL240 gesucht, das hat >entgegen den scheinbar meisten anderen Displays und so BIOS-Fonts die >Anordnung vertikal und nicht horizontal. Nein. Bei den monochromen grafischen Displays ist die vertikale Ausrichtung eindeutig in der Überzahl. Allerdings hast du den Fehler gemacht, nach Fonts für das DOGXL240 zu suchen. Das dürfte einen geringen kleinen Anteil aufweisen. Sinnvoller wäre eine Displaycontrollerspezifische Suche gewesen. Bekannte Controller in dieser Richtung wären SED1520, HD61202, KS0108B, ... . Noch mehr findest du hier: http://www.lcd-module.de/datenblaetter.html MfG Spess
... dieses Display funktioniert so wie deins. - monochromen grafischen Displays - vertikale Ausrichtung (1 Byte = 8 Pixel vertikal = 1 Zeile) http://www.jtronics.de/avr-projekte/display-nokia3310.html
spess53 schrieb: > Allerdings hast du den Fehler gemacht, nach Fonts für das DOGXL240 > zu suchen. Nee, ich habe nur hier ausdrücklich danach gefragt, aber sonst mit diversen Stichwörtern rauf und runter gesucht. 8x16 ist offenbar zu spezifisch. Und kleine Fonts habe ich auch genug gefunden.
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.