Acorn BBC Micro Font für den LEDMatrixDriver

Im Frühsommer habe ich eine kleine Uhr aus LED Matrix-Elementen gebaut. Da ich das typographisch etwas schön(er) haben wollte, habe ich dafür auch eine Schriftart aus den 80ern zur Verwendung mit diesen Displays vorbereitet. Genau genommen geht es dabei um den Font der für das Heimcomputersystem BBC Micro von Acorn verwendet wurde.

Mehr Informationen zu diesem Font finden sich auch in einem wunderbaren Blogbeitrag mit dem Titel “Typography in 8 bits: System fonts“, der die Systemschriften früher (Heim)Computersysteme beleuchtet.

Um noch kurz etwas besser zu verstehen was LED Matrizen sind, hier ein Foto von der fertigen Uhr. Dort sind 4 Stück 8x8 Matrizen verbaut und fungieren als Display.

Foto von einer Uhr mit 4 Stück MAX7219 LED Matrizen

Die Darstellung von Schriften auf diesem Display funktioniert so, dass Zeilen und Spalten angesteuert werden und einzelne LEDs dabei eingeschaltet werden (und bleiben). Die Umsetzung einer Schriftart muss also diese Muster beinhalten und die Software zur Ansteuerung muss diese Muster wiederum verstehen und in eine entsprechende Beschaltung von Zeilen und Spalten umwandeln.

Für beides gibt es zum Glück fertige Lösungen, das „heavy lifting“ haben also andere schon weitestgehend erledigt.

Für die Ansteuerung der LED Matrizen nutze ich zum Beispiel das Paket LEDMatrixDriver das für meine Zwecke sehr gut funktioniert, auch wenn das letzte Update der Bibliothek schon lange zurückliegt.

Für das Erzeugen der Bitmuster kann man auf ein Tool wie das LED Matrix Tool zurückgreifen. Hier muss man nur noch die jeweiligen Pixel anklicken und erhält dann den Code in hexadezimaler Schreibweise. Ich habe das für jeden Buchstaben aus der Schrift gemacht und so die folgende Tabelle erzeugen können:

byte font[95][8] = { 
  {0,0,0,0,0,0,0,0}, // SPACE
  {0x18,0x18,0x18,0x18,0x18,0x00,0x18,0x00}, // EXCL
  {0x6c,0x6c,0x6c,0x00,0x00,0x00,0x00,0x00}, // QUOT
  {0x36,0x36,0x7f,0x36,0x7f,0x36,0x36,0x00}, // #
  {0x0c,0x3f,0x68,0x3e,0x0b,0x7e,0x18,0x00}, // $
  {0x60,0x66,0x0c,0x18,0x30,0x66,0x06,0x00}, // %
  {0x38,0x6c,0x6c,0x38,0x6d,0x66,0x3b,0x00}, // &
  //{0x0c,0x18,0x30,0x00,0x00,0x00,0x00,0x00}, // '
  {0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00}, // ' alternative: straight down, no curve
  {0x0c,0x18,0x30,0x30,0x30,0x18,0x0c,0x00}, // (
  {0x30,0x18,0x0c,0x0c,0x0c,0x18,0x30,0x00}, // )
  {0x00,0x18,0x7e,0x3c,0x7e,0x18,0x00,0x00}, // *
  {0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00}, // +
  {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30}, // COMMA
  {0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00}, // -
  {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00}, // DOT
  //{0x03,0x06,0x0c,0x18,0x30,0x60,0x00,0x00}, // /
  {0x03,0x06,0x0c,0x18,0x30,0x60,0xc0,0x00}, // / alternative: larger so it matches uppercase letters
  {0x3c,0x66,0x6e,0x7e,0x76,0x66,0x3c,0x00}, // 0
  {0x18,0x38,0x18,0x18,0x18,0x18,0x7e,0x00}, // 1
  {0x3c,0x66,0x06,0x0c,0x18,0x30,0x7e,0x00}, // 2
  {0x3c,0x66,0x06,0x1c,0x06,0x66,0x3c,0x00}, // 3
  {0x0c,0x1c,0x3c,0x6c,0x7e,0x0c,0x0c,0x00}, // 4
  {0x7e,0x60,0x7c,0x06,0x06,0x66,0x3c,0x00}, // 5
  {0x1c,0x30,0x60,0x7c,0x66,0x66,0x3c,0x00}, // 6
  {0x7e,0x06,0x0c,0x18,0x30,0x30,0x30,0x00}, // 7
  {0x3c,0x66,0x66,0x3c,0x66,0x66,0x3c,0x00}, // 8
  {0x3c,0x66,0x66,0x3e,0x06,0x0c,0x38,0x00}, // 9
  {0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00}, // :
  {0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x30}, // ;
  {0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x00}, // <
  {0x00,0x00,0x7e,0x00,0x7e,0x00,0x00,0x00}, // =
  {0x30,0x18,0x0c,0x06,0x0c,0x18,0x30,0x00}, // >
  {0x3c,0x66,0x0c,0x18,0x18,0x00,0x18,0x00}, // ?
  {0x3c,0x66,0x6e,0x6a,0x6e,0x60,0x3c,0x00}, // @
  {0x3c,0x66,0x66,0x7e,0x66,0x66,0x66,0x00}, // A
  {0x7c,0x66,0x66,0x7c,0x66,0x66,0x7c,0x00}, // B
  {0x3c,0x66,0x60,0x60,0x60,0x66,0x3c,0x00}, // C
  {0x78,0x6c,0x66,0x66,0x66,0x6c,0x78,0x00}, // D
  {0x7e,0x60,0x60,0x7c,0x60,0x60,0x7e,0x00}, // E
  {0x7e,0x60,0x60,0x7c,0x60,0x60,0x60,0x00}, // F
  {0x3c,0x66,0x60,0x6e,0x66,0x66,0x3c,0x00}, // G
  {0x66,0x66,0x66,0x7e,0x66,0x66,0x66,0x00}, // H
  {0x7e,0x18,0x18,0x18,0x18,0x18,0x7e,0x00}, // I
  {0x3e,0x0c,0x0c,0x0c,0x0c,0x6c,0x38,0x00}, // J
  {0x66,0x6c,0x78,0x70,0x78,0x6c,0x66,0x00}, // K
  {0x60,0x60,0x60,0x60,0x60,0x60,0x7e,0x00}, // L
  {0x63,0x77,0x7f,0x6b,0x6b,0x63,0x63,0x00}, // M
  {0x66,0x66,0x76,0x7e,0x6e,0x66,0x66,0x00}, // N
  {0x3c,0x66,0x66,0x66,0x66,0x66,0x3c,0x00}, // O
  {0x7c,0x66,0x66,0x7c,0x60,0x60,0x60,0x00}, // P
  {0x7c,0x66,0x66,0x66,0x6a,0x6c,0x36,0x00}, // Q
  {0x7c,0x66,0x66,0x7c,0x6c,0x66,0x66,0x00}, // R
  {0x3c,0x66,0x60,0x3c,0x06,0x66,0x3c,0x00}, // S
  {0x7e,0x18,0x18,0x18,0x18,0x18,0x18,0x00}, // T
  {0x66,0x66,0x66,0x66,0x66,0x66,0x3c,0x00}, // U
  {0x66,0x66,0x66,0x66,0x66,0x3c,0x18,0x00}, // V
  {0x63,0x63,0x6b,0x6b,0x7f,0x77,0x63,0x00}, // W
  {0x66,0x66,0x3c,0x18,0x3c,0x66,0x66,0x00}, // X
  {0x66,0x66,0x66,0x3c,0x18,0x18,0x18,0x00}, // Y
  {0x7e,0x06,0x0c,0x18,0x30,0x60,0x7e,0x00} // Z
};

Zwei Änderungen zur Ursprungsversion des Fonts gibt es. Ich habe den Schrägstrich verlängert, so passt er standardmäßig zur Höhe von Großbuchstaben. Und beim Apostroph/single quote habe ich einen kleinen Schwung am Zeichen entfernt. Ist persönlicher Geschmack, ich finde so sieht es stimmiger aus.

Der Codeschnipsel oben ist dabei auch ein direkter „drop in replacement“ für den bereits in LEDMatrixDriver integrierten Font. Man kann das also einfach „drüberkopieren“ und nutzt dann den neuen Font.

Wer also auch mal etwas mit solchen Displays, die MAX7219 sind ein sehr geläufiger Typ, bauen möchte, kann gerne diese Schriftart verwenden.