PicAsSo-Adventskalender: Das dritte Türchen darf endlich geöffnet werden

Seite 4: Textausgabe mit einer Font

Inhaltsverzeichnis

Praktischerweise gibt es schon fertige Fonts in Array-Form. Wir haben einen Font aus dem Mikrocontrollerforum verwendet.

Den Font legen wir in den table-Bereich des Picaxe: Das ist ein zusätzlicher Speicher für Lookup-Tabellen, der sich hervorragend für einen Zeichenfont eignet. Dadurch bleibt der Programmspeicher frei für das eigentliche Programm. Beim 14M2 beträgt die Größe dieses Speicherbereichs 512 Bytes. Wir greifen auf ihn mit dem readtable-Befehl zu. Im Makro OLED_PRINTCHAR(c) wird zunächst vom auszugebenden Zeichen der ASCII-Wert des Leerzeichens (0x20) subtrahiert. Der Zeichensatz beginnt aus Platzgründen erst im druckbaren Bereich und verwendet die Steuerzeichen im Bereich von 0x00 bis 0x1F nicht. Das Ergebnis wird in die Variable oledChar geschrieben und dann die Subroutine oledPrintChar aufgerufen. Dort wird der Wert mit 5 multipliziert, da jedes Zeichen 5 Bytes Speicherplatz benötigt. Somit erhält man die passende Startadresse, die an den readtable-Befehl übergeben wird, um die 5 Bytes in die Variablen font0 bis font4 zu lesen und dann mit hi2cout an das OLED zu übertragen. Zusätzlich geben wir einen Nullbyte als Abstand zum nächsten Zeichen aus. Der Font umfasst den ASCII-Bereich von 0x20 (Leerzeichen) bis 0x7F, d.h. es sind alle Ziffern, Groß- und Kleinbuchstaben sowie gängige Sonderzeichen enthalten.

Um einen einzelnen Buchstaben auszugeben, verwenden wir das Makro OLED_PRINTCHAR(c), wobei in den Klammern das gewünschte ASCII-Zeichen steht. Soll ein kompletter Text ausgegeben werden, steht das Makro OLED_PRINTTEXT(addr) zur Verfügung. Als Wert addr wird die Adresse des Textes im onchip-EEPROM-Bereich des Picaxe erwartet. Texte lassen sich beispielsweise folgendermaßen abspeichern:

#define TEXT0 0
EEPROM TEXT0,("OLED mit 128x64 Pixel",0) ; 0 als Endezeichen
#define TEXT1 22

EEPROM TEXT1,("Font ASCII 0x20-7F:",0) ; 0 als Endezeichen

Hierbei ist mit TEXT0 und TEXT1 jeweils die EEPROM-Startadresse des Textes definiert und diese Defines können wir dann für OLED_PRINTTEXT verwenden. Die binäre Null nach dem Text dient als Ende-Zeichen. Die Firmware gibt solange Zeichen aus dem EEPROM aus, bis ein binäres Nullzeichen (nicht zu verwechseln mit einer ASCII Null „0“) gefunden wird.

Das Beispielprogramm picasso_3_font.bas gibt auf dem OLED in Zeile 0 und Zeile 1 die genannten Texte aus. Danach folgt eine Darstellung des ASCII-Zeichensatzes.

Font mit 5x7 Pixeln

Die Zeichen mit 5×7 Pixel-Darstellung sind auf dem OLED recht klein. Um die Schrift etwas größer und besser lesbar darzustellen, kann man den Font skalieren und die Schrift beispielsweise mit doppelter Breite und Höhe ausgeben, also 10x14. Beispiele haben wir in picasso_3_font_big.bas vorbereitet.

Bereits mit doppelter Breite und gleicher Höhe ist die Schrift besser lesbar. Das machen wir mit dem Makro OLED_PRINTTEXT_WIDE. Hierzu geben wir in der Subroutine oledPrintCharWide jedes Byte eines Zeichens zweimal hintereinander aus und verdoppeln die Breite so auf 10 Pixel. Die Höhe bleibt bei 8 Pixeln. Da als Zeichenabstand 1 Pixel genügt, benötigt ein Zeichen insgesamt 11×8 Pixel. In eine Zeile passen dann maximal 11 Zeichen.

Mit dem Makro OLED_PRINTTEXT_BIG kann ein Text in doppelter Breite und doppelter Höhe ausgegeben werden. Hierzu stellen wir in der Subroutine oledPrintTextBig das Eingabeformat von horizontal auf vertikal um. Das OLED-Fenster wird dann so aufgezogen, dass es ausgehend von der aktuellen Cursorposition in vertikaler Richtung 16 Pixel hoch ist und in horizontaler Richtung bis zum rechten Displayrand reicht. Die einzelnen Zeichen verdoppeln wir mit OLED_PRINTCHAR_BIG zunächst auf 16-Bit-Auflösung und damit in der Höhe: Bit 7 kopieren wir in die Bits 15 und 14, Bit 6 in die Bits 13 und 12 usw. bis hin zu Bit 0, das wir in die Bits 1 und 0 kopieren.

Um die Zeichen noch einmal in der Breite zu verdoppeln, nutzen wir beim Senden an das Display einen weiteren Trick: Die Bits 0 bis 15 ergeben zusammen die Wortvariable w0 (im Beispiel als tempVarWord definiert), die wiederum Bitzugriffsmöglichkeit bietet. Wir senden den 16-Bit-Wert daher zwei Mal hintereinander, jeweils als die zwei Bytes tempVarWord_b0 und tempVarWord_b1 – insgesamt also vier Bytes.

hi2cout(0x40, tempVarWord_b0,tempVarWord_b1, tempVarWord_b0,tempVarWord_b1)

Da als Zeichenabstand 1 Pixel ausreicht, benötigt ein Zeichen dann 11×16 Pixel.

Möchte man einzelne Zeichen über OLED_PRINTCHAR_BIG ausgeben, muss vorher der Cursor mit der Funktion OLED_CURSOR_BIG an die gewünschte Stelle gesetzt werden. Ab dann ist das vertikale Eingabeformat für das OLED aktiv, solange bis OLED_CURSOR wieder in den horizontalen Mode wechselt. Bei OLED_PRINTTEXT_BIG ist dies nicht notwendig, da es dort vor und nach der Textausgabe automatisch gemacht wird. Im Beispielprogramm picasso_3_font_big.bas stellen wir unterschiedliche Textgrößen auf dem OLED dar, die alle auf dem 5x7 Font basieren.

Zeichenausgabe mit unterschiedlicher Breite und Höhe

Durch das EEPROM konnten wir mehr Bilder für das OLED speichern und zugleich den Programmspeicher des Picaxe schonen. Am vierten Advent werden wir sehen, wie wir eine Echtzeituhr anschließen und damit auf dem OLED den Countdown bis zur Bescherung herunterzählen lassen können.

Wir wünschen einen schönen 3. Advent und frohes Basteln! (stri)