PicAsSo-Adventskalender: Das dritte Türchen darf endlich geöffnet werden
Seite 4: Textausgabe mit einer Font
Praktischerweise gibt es schon fertige Fonts in Array-Form. Wir haben einen Font aus dem Mikrocontrollerforum verwendet.
Font aufspielen
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.
Ausgabe
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 22EEPROM 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.
Zeichen größer darstellen
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.
Ausgabe einzelner Zeichen
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.
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)