www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie ist der Font des GLCD Font Creators von apetech aufgebaut?


Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen...

Ich bin derzeit daran, mir eine kleine Lib für ein Nokia6100 Display zu 
erstellen...

Ich kann bereits Texte anzeigen, jedoch habe ich den Font dazu mühsam 
von hand erstellt... Meine Aufbau sieht derzeit so aus

0 0 0 0 0
0 0 0 0 0
0 0 X 0 0
0 X 0 X 0
X 0 0 0 X
X X X X X
X 0 0 0 X
0 0 0 0 0

Man sieht es leider etwas schlecht... Es sollte ein A sein
Die X stehen dabei für eine 1
Oben ist das LSB unten das MSB

Es ist also ein Byte pro Spalte. Und so gebe ich auch meinen Font aus, 
Spaltenweise. Dies Funktioniert einwandfrei... Nur möchte ich nicht 
immer
von hand neue Fonts erstellen müssen.

Also wollte ich den Font Creator verwenden. Doch leider verstehe ich das 
Format nicht richtig... Wie komme ich da an die Daten welche ich 
anzeigen muss? Und wie sind diese Aufgebaut? Falls jemand also eine 
Beschreibung dazu hat, wäre das Klasse :)

Von hier ist der FontCreator 
Beitrag "KS0108 GLCD Routinen"

EDIT -> Aus einem unerklärlichen grund, wird dieser Link: 
mikrocontroller.net/topic/ks0108-glcd-routinen

Zu dem hier
Beitrag "KS0108 GLCD Routinen"

Hier ein Auszug eines Fonts

Danke schonmal
/*
 *
 * new Font
 *
 * created with FontCreator
 * written by F. Maximilian Thiele
 *
 * http://www.apetech.de/fontCreator
 * me@apetech.de
 *
 * File Name           : verdana_9.c
 * Date                : 19.11.2010
 * Font size in bytes  : 4662
 * Font width          : 10
 * Font height         : 10
 * Font first char     : 32
 * Font last char      : 128
 * Font used chars     : 96
 *
 * The font data are defined as
 *
 * struct _FONT_ {
 *     uint16_t   font_Size_in_Bytes_over_all_included_Size_it_self;
 *     uint8_t    font_Width_in_Pixel_for_fixed_drawing;
 *     uint8_t    font_Height_in_Pixel_for_all_characters;
 *     unit8_t    font_First_Char;
 *     uint8_t    font_Char_Count;
 *
 *     uint8_t    font_Char_Widths[font_Last_Char - font_First_Char +1];
 *                  // for each character the separate width in pixels,
 *                  // characters < 128 have an implicit virtual right empty row
 *
 *     uint8_t    font_data[];
 *                  // bit field of all characters
 */

#include <inttypes.h>
#include <avr/pgmspace.h>

#ifndef NEW_FONT_H
#define NEW_FONT_H

#define NEW_FONT_WIDTH 10
#define NEW_FONT_HEIGHT 10

static uint8_t new_Font[] PROGMEM = {
    0x12, 0x36, // size
    0x0A, // width
    0x0A, // height
    0x20, // first char
    0x60, // char count
    
    // char widths
    0x00, 0x01, 0x03, 0x06, 0x05, 0x09, 0x06, 0x01, 0x03, 0x03, 
    0x05, 0x07, 0x02, 0x03, 0x01, 0x04, 0x05, 0x05, 0x05, 0x05, 
    0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x01, 0x02, 0x06, 0x06, 
    0x06, 0x04, 0x08, 0x07, 0x05, 0x06, 0x06, 0x04, 0x05, 0x06, 
    0x06, 0x03, 0x04, 0x06, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 
    0x06, 0x05, 0x07, 0x06, 0x07, 0x09, 0x05, 0x07, 0x05, 0x03, 
    0x04, 0x03, 0x06, 0x06, 0x02, 0x05, 0x05, 0x04, 0x05, 0x05, 
    0x04, 0x05, 0x05, 0x01, 0x02, 0x05, 0x01, 0x09, 0x05, 0x05, 
    0x05, 0x05, 0x03, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x04, 
    0x04, 0x05, 0x01, 0x05, 0x06, 0x08, 
    
    // font data
    0xBE, 0x00, // 33
    0x07, 0x00, 0x07, 0x00, 0x00, 0x00, // 34
    0x20, 0xF8, 0x2E, 0xE8, 0x3E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 35
    0x88, 0x94, 0xFF, 0xA4, 0x44, 0x00, 0x00, 0xC0, 0x00, 0x00, // 36
    0x0C, 0x12, 0x92, 0x6C, 0x10, 0x6C, 0x92, 0x90, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 37
    0x6C, 0x92, 0x92, 0xAC, 0x40, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 38
    0x07, 0x00, // 39
    0xFC, 0x02, 0x01, 0x00, 0x40, 0x80, // 40
    0x01, 0x02, 0xFC, 0x80, 0x40, 0x00, // 41

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuchs mal;)

>static uint8_t new_Font[] PROGMEM = {
>    0x12, 0x36, // size

size ist die Größe des Fonts, bzw wie viel Speicher belegt der.

>   0x0A, // width

Ignorieren, unten kommt eine Tabelle mit char widths

>    0x0A, // height

Die Höhe des Fonts. 10 Pixel, in der Tabelle unten also zwei
aufeinander folgende Bytes die vertikal gezeichnet werden.

>    0x20, // first char

Der Code des ersten Zeichens hier 0x20 = 32 = Space = Leerzeichen

>    0x60, // char count

Anzahl der Zeichen im Font ab first char.

>    // char widths

Hier beginnt die Tabelle mit den Breiten der Zeichen

>    0x00, 0x01, 0x03, 0x06, 0x05, 0x09, 0x06, 0x01, 0x03, 0x03,

0x00 ist die Breite für das Zeichen mit dem Code 0x20 = 32.
Der Wert ist 0. Es stehen also keine Werte dafür in der Tabelle!
Siehst du dann gleich.

0x01 ist die Breite für das Zeichen mit dem Code 0x21 = 33
0x03 ist die Breite für das Zeichen mit dem Code 0x22 = 34

usw.

>    // font data

Hier beginnen die Pixeldaten für jedes Zeichen

>    0xBE, 0x00, // 33

Das Zeichen mit dem Code 33 = 0x21
Du siehst oben das die Breite 0x01 ist. Also zwei Bytes wenn man
die Höhe berücksichtigt.

>    0x07, 0x00, 0x07, 0x00, 0x00, 0x00, // 34

Das Zeichen mit dem Code 34 = 0x22

Du siehst oben das die Breite 0x03 ist. Also sechs Bytes wenn man
die Höhe berücksichtigt. Die ersten beiden Bytes sind die erste Spalte
des Zeichens. Byte drei und vier die zweite Spalte, Byte fünf und sechs
die dritte Spalte.

Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achsoooooo :)


Vielen Dank :) Deine Beschreibung ist wirklich sehr ausführlich!

Das bedeutet, das die Daten identisch abgelegt sind...
Mit den unterschied, das wenn die zeichen grösser als 8 bit sind also 8 
pixel, ist das nachfolgende byte, einfach die zweite ebene der spalte :)

Hoffe ich habe das so korrekt verstanden :)

ich sehe, das nur so viele Daten wie nötig in der Tabelle vorhanden 
sind.
Zb. bei Leerzeichen steht für die Breite ja 0x00 also 0

Ich gehe davon aus, das ich die Zeichen zuerst nach ihrem Muster in der 
Tabelle ausgebe und danach mit leerem Inhalt auffülle, bis die 
Zeichenbreite erreicht ist, oder?

Oder gebe ich nur soviel aus wie auch in der Tabelle steht (halt das 
minimum) und erzeuge in abhängigkeit vom gewünschen abstand noch 
leerspalten?

(Was sieht besser aus? )

Nach meinem verständniss müsste ich im Algorithmus die erste version 
anwenden. Da ansonsten zb ein Leerzeichen mit einer breite von 0x00 
nicht dargestellt würde. Mit version 2 würden dann bei diesem Font 10 
Leerspalten eingefügt...

Autor: holger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>Ich gehe davon aus, das ich die Zeichen zuerst nach ihrem Muster in der
>Tabelle ausgebe und danach mit leerem Inhalt auffülle, bis die
>Zeichenbreite erreicht ist, oder?

Nein.

>Oder gebe ich nur soviel aus wie auch in der Tabelle steht (halt das
>minimum) und erzeuge in abhängigkeit vom gewünschen abstand noch
>leerspalten?

Ja so machst du das. Im einfachsten Fall fügst du eine Leerspalte ein.
Kannst auch zwei oder drei nehmen. Wie es dir gefällt.

>Nach meinem verständniss müsste ich im Algorithmus die erste version
>anwenden. Da ansonsten zb ein Leerzeichen mit einer breite von 0x00
>nicht dargestellt würde. Mit version 2 würden dann bei diesem Font 10
>Leerspalten eingefügt...

Such mal nach GLCDFontCreator2.1.jar.

Der erzeugt auch für das Leerzeichen Code. Siehe unten.

    // font data
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 32
    0x80, 0x3E, 0x00, 0x00, // 33

Beispiel Font im Anhang.

Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Such mal nach GLCDFontCreator2.1.jar.

Vielen Dank für die Antwort...

Google findet leider nichts...

Falls du die Software haben solltest, lade Sie doch bitte wenn möglich 
hoch :)

Gruss

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Claudio Hediger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank :)

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch eine Ergänzung: Wenn der Fonthöhe kein vielfaches von 8 ist, so 
sind die Daten im untersten Byte so nach "unten" verschoben, daß keine 
nachfolgenden Nullen auftauchen Ein senkrechter Strich in einem 
11-Bit-Font ist also nicht 0xFF 0xE0, sondern 0xFF 0x0E.

Die lib schiebt das unterste Byte dann entsprechend nach oben.

Oliver

Autor: Claudio Hediger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:
> Noch eine Ergänzung: Wenn der Fonthöhe kein vielfaches von 8 ist, so
> sind die Daten im untersten Byte so nach "unten" verschoben, daß keine
> nachfolgenden Nullen auftauchen Ein senkrechter Strich in einem
> 11-Bit-Font ist also nicht 0xFF 0xE0, sondern 0xFF 0x0E.
>
> Die lib schiebt das unterste Byte dann entsprechend nach oben.
>
> Oliver

Mit der Lib meinst du nehme ich an, das C File zur ausgabe des Fonts und 
nicht den FontCreator oder?

Also das Bedeutet, die Daten Sähen etwa so aus

X
X
X
X
X
X
X
X

0
0
0
0
X
X
X
0

Ist eigentlich bei der Ausgabe des FontCreators das MSB des bytes oben 
oder unten? Ist bei mehrzeiligen fonts (höher als 8) das erste byte in 
der Tabelle das obere oder das untere?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Claudio Hediger schrieb:

> oder unten? Ist bei mehrzeiligen fonts (höher als 8) das erste byte in
> der Tabelle das obere oder das untere?

Meine Erfahrung bei solchen Dingen:
Am einfachsten ist es immer, so etwas einfach auszuprobieren.

Lass dir einen Font erzeugen und verfolge für 1 bekanntes Zeichen 
(meinetwegen ein 'A') die Bytes in der Datenstruktur. Du weißt, was 
rauskommen muss und wenn man sich dann die 1 und 0-en einfach aufmalt 
sieht man schnell was Sache ist. Zudem hat man dann die Gewissheit, dass 
man den Aufbau der Struktur verstanden hat, was eine gewisse Sicherheit 
bei der Programmierung gibt.

So ein Detail, wie jetzt dieses hier, probiert man einfach aus, indem 
man einfach eine der beiden Varianten annimmt. Hat man die falsche 
Annahme getroffen, dann sehen die Zeichen 'in sich verdreht' aus. Das 
erkennt dann auch ein Blinder und man dreht dann einfach die Bytes 
entsprechend um.

Autor: Claudio Hediger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Claudio Hediger schrieb:
>
>> oder unten? Ist bei mehrzeiligen fonts (höher als 8) das erste byte in
>> der Tabelle das obere oder das untere?
>
> Meine Erfahrung bei solchen Dingen:
> Am einfachsten ist es immer, so etwas einfach auszuprobieren.
>
> Lass dir einen Font erzeugen und verfolge für 1 bekanntes Zeichen
> (meinetwegen ein 'A') die Bytes in der Datenstruktur. Du weißt, was
> rauskommen muss und wenn man sich dann die 1 und 0-en einfach aufmalt
> sieht man schnell was Sache ist. Zudem hat man dann die Gewissheit, dass
> man den Aufbau der Struktur verstanden hat, was eine gewisse Sicherheit
> bei der Programmierung gibt.
>
> So ein Deteil, wie jetzt dieses hier, probiert man einfach aus, indem
> man einfach eine der beiden Varianten annimmt. Hat man die falsche
> Annahme getroffen, dann sehen die Zeichen 'in sich verdreht' aus. Das
> erkennt dann auch ein Blinder und man dreht dann einfach die Bytes
> entsprechend um.

Danke :)

Hab ich gemacht... Mir ist die Struktur jetzt klar...

Damit eventuell auch andere Davon Provitieren, werde ich eventuell eine 
kleine Doku schreiben...

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Claudio Hediger schrieb:
> Also das Bedeutet, die Daten Sähen etwa so aus

Nö ;) Fehler meinerseits. Das sieht soe aus:

1
1
1
1
1
1
1
1

0
0
0
0
0
1
1
1

Das ist dann 0xFF 0x07

Oliver

Autor: Claudio Hediger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achjaa nochwas...

Bei der Geposteten Version des GLCD Font Creator 2.1

Funktioniert die Export funktion nicht... Habe nur ich das problem?

Autor: Claudio Hediger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei noch meine kleine Doku :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.