tidy up code, variable width font, support more characters

This commit is contained in:
Silentium 2019-05-10 20:29:01 +02:00
parent a7034288bc
commit 08740b3ca7
2 changed files with 334 additions and 287 deletions

View file

@ -1,263 +1,272 @@
#ifndef FONT_H
#define FONT_H
const uint8_t font_5x7_col[256][5] PROGMEM = {
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x7F, 0x00, 0x00, 0x00, 0x00 }, // (1 col left)
{ 0x7F, 0x7F, 0x00, 0x00, 0x00 }, // (2 col left)
{ 0x7F, 0x7F, 0x7F, 0x00, 0x00 }, // (3 col left)
{ 0x7F, 0x7F, 0x7F, 0x7F, 0x00 }, // (4 col left)
{ 0x7F, 0x7F, 0x7F, 0x7F, 0x7F }, // (solid fill)
{ 0x00, 0x7F, 0x7F, 0x7F, 0x7F }, // (4 col right)
{ 0x00, 0x00, 0x7F, 0x7F, 0x7F }, // (3 col right)
{ 0x00, 0x00, 0x00, 0x7F, 0x7F }, // (2 col right)
{ 0x00, 0x00, 0x00, 0x00, 0x7F }, // (1 col right)
{ 0x03, 0x07, 0x7E, 0x20, 0x1C }, // (music note)
{ 0x60, 0x66, 0x09, 0x09, 0x09 }, // (deg c)
{ 0x60, 0x6F, 0x0A, 0x0A, 0x08 }, // (deg f)
{ 0x10, 0x18, 0x1C, 0x18, 0x10 }, // (triangle down)
{ 0x00, 0x3E, 0x1C, 0x08, 0x00 }, // (triangle right)
{ 0x00, 0x08, 0x1C, 0x3E, 0x00 }, // (triangle left)
{ 0x04, 0x0C, 0x1C, 0x0C, 0x04 }, // (triangle up)
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, // (space)
{ 0x00, 0x7D, 0x00, 0x00, 0x00 }, // (!)
{ 0x00, 0x70, 0x00, 0x70, 0x00 }, // (")
{ 0x14, 0x7F, 0x14, 0x7F, 0x14 }, // (#)
{ 0x12, 0x2A, 0x7F, 0x2A, 0x24 }, // ($)
{ 0x62, 0x64, 0x08, 0x13, 0x23 }, // (%)
{ 0x36, 0x49, 0x35, 0x02, 0x05 }, // (&)
{ 0x00, 0x50, 0x60, 0x00, 0x00 }, // (')
{ 0x00, 0x1C, 0x22, 0x41, 0x00 }, // (()
{ 0x00, 0x41, 0x22, 0x1C, 0x00 }, // ())
{ 0x44, 0x28, 0x7C, 0x28, 0x44 }, // (*)
{ 0x08, 0x08, 0x7F, 0x08, 0x08 }, // (+)
{ 0x05, 0x06, 0x00, 0x00, 0x00 }, // (,)
{ 0x08, 0x08, 0x08, 0x00, 0x00 }, // (-)
{ 0x00, 0x03, 0x03, 0x00, 0x00 }, // (.)
{ 0x02, 0x04, 0x08, 0x10, 0x20 }, // (/)
{ 0x3E, 0x45, 0x49, 0x51, 0x3E }, // (0)
{ 0x00, 0x21, 0x7F, 0x01, 0x00 }, // (1)
{ 0x21, 0x43, 0x45, 0x49, 0x31 }, // (2)
{ 0x42, 0x41, 0x51, 0x69, 0x46 }, // (3)
{ 0x0C, 0x14, 0x24, 0x7F, 0x04 }, // (4)
{ 0x72, 0x51, 0x51, 0x51, 0x4E }, // (5)
{ 0x1E, 0x29, 0x49, 0x49, 0x06 }, // (6)
{ 0x43, 0x44, 0x48, 0x50, 0x60 }, // (7)
{ 0x36, 0x49, 0x49, 0x49, 0x36 }, // (8)
{ 0x30, 0x49, 0x49, 0x4A, 0x3C }, // (9)
{ 0x00, 0x36, 0x36, 0x00, 0x00 }, // (:)
{ 0x00, 0x35, 0x36, 0x00, 0x00 }, // (;)
{ 0x08, 0x14, 0x22, 0x41, 0x00 }, // (<)
{ 0x14, 0x14, 0x14, 0x14, 0x14 }, // (=)
{ 0x41, 0x22, 0x14, 0x08, 0x00 }, // (>)
{ 0x20, 0x40, 0x45, 0x48, 0x30 }, // (?)
{ 0x3E, 0x41, 0x4D, 0x51, 0x36 }, // (@)
{ 0x3F, 0x48, 0x48, 0x48, 0x3F }, // (A)
{ 0x7F, 0x49, 0x49, 0x49, 0x36 }, // (B)
{ 0x3E, 0x41, 0x41, 0x41, 0x22 }, // (C)
{ 0x7F, 0x41, 0x41, 0x41, 0x3E }, // (D)
{ 0x7F, 0x49, 0x49, 0x49, 0x41 }, // (E)
{ 0x7F, 0x48, 0x48, 0x48, 0x40 }, // (F)
{ 0x3E, 0x41, 0x49, 0x49, 0x2E }, // (G)
{ 0x7F, 0x08, 0x08, 0x08, 0x7F }, // (H)
{ 0x00, 0x41, 0x7F, 0x41, 0x00 }, // (I)
{ 0x02, 0x01, 0x41, 0x7E, 0x40 }, // (J)
{ 0x7F, 0x08, 0x14, 0x22, 0x41 }, // (K)
{ 0x7F, 0x01, 0x01, 0x01, 0x01 }, // (L)
{ 0x7F, 0x20, 0x18, 0x20, 0x7F }, // (M)
{ 0x7F, 0x10, 0x08, 0x04, 0x7F }, // (N)
{ 0x3E, 0x41, 0x41, 0x41, 0x3E }, // (O)
{ 0x7F, 0x48, 0x48, 0x48, 0x30 }, // (P)
{ 0x3E, 0x41, 0x45, 0x42, 0x3D }, // (Q)
{ 0x7F, 0x48, 0x4C, 0x4A, 0x31 }, // (R)
{ 0x31, 0x49, 0x49, 0x49, 0x46 }, // (S)
{ 0x40, 0x40, 0x7F, 0x40, 0x40 }, // (T)
{ 0x7E, 0x01, 0x01, 0x01, 0x7E }, // (U)
{ 0x7C, 0x02, 0x01, 0x02, 0x7C }, // (V)
{ 0x7E, 0x01, 0x06, 0x01, 0x7E }, // (W)
{ 0x63, 0x14, 0x08, 0x14, 0x63 }, // (X)
{ 0x70, 0x08, 0x07, 0x08, 0x70 }, // (Y)
{ 0x43, 0x45, 0x49, 0x51, 0x61 }, // (Z)
{ 0x00, 0x7F, 0x41, 0x41, 0x00 }, // ([)
{ 0x20, 0x10, 0x08, 0x04, 0x02 }, // (\)
{ 0x00, 0x41, 0x41, 0x7F, 0x00 }, // (])
{ 0x10, 0x20, 0x40, 0x20, 0x10 }, // (^)
{ 0x01, 0x01, 0x01, 0x01, 0x01 }, // (_)
{ 0x00, 0x40, 0x20, 0x10, 0x00 }, // (`)
{ 0x02, 0x15, 0x15, 0x15, 0x0F }, // (a)
{ 0x7F, 0x09, 0x11, 0x11, 0x0E }, // (b)
{ 0x0E, 0x11, 0x11, 0x11, 0x02 }, // (c)
{ 0x0E, 0x11, 0x11, 0x09, 0x7F }, // (d)
{ 0x0E, 0x15, 0x15, 0x15, 0x0C }, // (e)
{ 0x08, 0x3F, 0x48, 0x40, 0x20 }, // (f)
{ 0x18, 0x25, 0x25, 0x25, 0x3E }, // (g)
{ 0x7F, 0x08, 0x10, 0x10, 0x0F }, // (h)
{ 0x00, 0x11, 0x5F, 0x01, 0x00 }, // (i)
{ 0x02, 0x01, 0x11, 0x5E, 0x00 }, // (j)
{ 0x7F, 0x04, 0x0A, 0x11, 0x00 }, // (k)
{ 0x00, 0x41, 0x7F, 0x01, 0x00 }, // (l)
{ 0x1F, 0x10, 0x0C, 0x10, 0x0F }, // (m)
{ 0x1F, 0x08, 0x10, 0x10, 0x0F }, // (n)
{ 0x0E, 0x11, 0x11, 0x11, 0x0E }, // (o)
{ 0x1F, 0x14, 0x14, 0x14, 0x08 }, // (p)
{ 0x08, 0x14, 0x14, 0x14, 0x0F }, // (q)
{ 0x1F, 0x08, 0x10, 0x10, 0x08 }, // (r)
{ 0x09, 0x15, 0x15, 0x15, 0x02 }, // (s)
{ 0x10, 0x7E, 0x11, 0x01, 0x02 }, // (t)
{ 0x1E, 0x01, 0x01, 0x02, 0x1F }, // (u)
{ 0x1C, 0x02, 0x01, 0x02, 0x1C }, // (v)
{ 0x1E, 0x01, 0x02, 0x01, 0x1E }, // (w)
{ 0x11, 0x0A, 0x04, 0x0A, 0x11 }, // (x)
{ 0x18, 0x05, 0x05, 0x05, 0x1E }, // (y)
{ 0x11, 0x13, 0x15, 0x19, 0x11 }, // (z)
{ 0x08, 0x36, 0x41, 0x00, 0x00 }, // ({)
{ 0x00, 0x00, 0x7F, 0x00, 0x00 }, // (|)
{ 0x00, 0x00, 0x41, 0x36, 0x08 }, // (})
{ 0x08, 0x10, 0x08, 0x04, 0x08 }, // (~)
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x08, 0x08, 0x2A, 0x1C, 0x08 }, // (arrow right)
{ 0x08, 0x1C, 0x2A, 0x08, 0x08 }, // (arrow left)
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x14, 0x3E, 0x55, 0x41, 0x22 }, // (€)
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x1F, 0x64, 0x24, 0x64, 0x1F }, // (Ä)
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x1E, 0x61, 0x21, 0x61, 0x1E }, // (Ö)
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x3E, 0x41, 0x01, 0x41, 0x3E }, // (Ü)
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x3F, 0x40, 0x40, 0x49, 0x36 }, // (ß)
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x02, 0x55, 0x15, 0x55, 0x0F }, // (ä)
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x0E, 0x51, 0x11, 0x51, 0x0E }, // (ö)
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x1E, 0x41, 0x01, 0x42, 0x1F }, // (ü)
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //
{ 0x18, 0x45, 0x05, 0x45, 0x1E }, // (ÿ)
#include <avr/pgmspace.h>
#include <stdint.h>
struct LCDChar {
uint8_t width;
uint8_t columns[7];
};
const LCDChar font_var_width[256] PROGMEM = {
{ 0, {} }, // 00 NUL
{ 0, {} }, // 01 SOH
{ 0, {} }, // 02 STX
{ 0, {} }, // 03 ETX
{ 0, {} }, // 04 EOT
{ 0, {} }, // 05 ENQ
{ 0, {} }, // 06 ACK
{ 0, {} }, // 07 BEL
{ 0, {} }, // 08 BS
{ 0, {} }, // 09 HT
{ 0, {} }, // 0A LF
{ 0, {} }, // 0B VT
{ 0, {} }, // 0C FF
{ 0, {} }, // 0D CR
{ 0, {} }, // 0E SO
{ 0, {} }, // 0F SI
{ 0, {} }, // 10 DLE
{ 0, {} }, // 11 DC1
{ 0, {} }, // 12 DC2
{ 0, {} }, // 13 DC3
{ 0, {} }, // 14 DC4
{ 0, {} }, // 15 NAK
{ 0, {} }, // 16 SYN
{ 0, {} }, // 17 ETB
{ 0, {} }, // 18 CAN
{ 0, {} }, // 19 EM
{ 0, {} }, // 1A SUB
{ 0, {} }, // 1B ESC
{ 0, {} }, // 1C FS
{ 0, {} }, // 1D GS
{ 0, {} }, // 1E RS
{ 0, {} }, // 1F US
{ 1, { 0x00 } }, // 20 SP
{ 1, { 0x7D } }, // 21 !
{ 3, { 0x70, 0x00, 0x70 } }, // 22 "
{ 5, { 0x14, 0x7F, 0x14, 0x7F, 0x14 } }, // 23 #
{ 5, { 0x12, 0x2A, 0x7F, 0x2A, 0x24 } }, // 24 $
{ 5, { 0x62, 0x64, 0x08, 0x13, 0x23 } }, // 25 %
{ 5, { 0x36, 0x49, 0x35, 0x02, 0x05 } }, // 26 &
{ 2, { 0x50, 0x60 } }, // 27 '
{ 3, { 0x1C, 0x22, 0x41 } }, // 28 (
{ 3, { 0x41, 0x22, 0x1C } }, // 29 )
{ 5, { 0x44, 0x28, 0x7C, 0x28, 0x44 } }, // 2A *
{ 5, { 0x08, 0x08, 0x7F, 0x08, 0x08 } }, // 2B +
{ 2, { 0x05, 0x06 } }, // 2C ,
{ 3, { 0x08, 0x08, 0x08 } }, // 2D -
{ 2, { 0x03, 0x03 } }, // 2E .
{ 5, { 0x02, 0x04, 0x08, 0x10, 0x20 } }, // 2F /
{ 5, { 0x3E, 0x45, 0x49, 0x51, 0x3E } }, // 30 0
{ 3, { 0x21, 0x7F, 0x01 } }, // 31 1
{ 5, { 0x21, 0x43, 0x45, 0x49, 0x31 } }, // 32 2
{ 5, { 0x42, 0x41, 0x51, 0x69, 0x46 } }, // 33 3
{ 5, { 0x0C, 0x14, 0x24, 0x7F, 0x04 } }, // 34 4
{ 5, { 0x72, 0x51, 0x51, 0x51, 0x4E } }, // 35 5
{ 5, { 0x1E, 0x29, 0x49, 0x49, 0x06 } }, // 36 6
{ 5, { 0x43, 0x44, 0x48, 0x50, 0x60 } }, // 37 7
{ 5, { 0x36, 0x49, 0x49, 0x49, 0x36 } }, // 38 8
{ 5, { 0x30, 0x49, 0x49, 0x4A, 0x3C } }, // 39 9
{ 2, { 0x36, 0x36 } }, // 3A :
{ 2, { 0x35, 0x36 } }, // 3B ;
{ 4, { 0x08, 0x14, 0x22, 0x41 } }, // 3C <
{ 5, { 0x14, 0x14, 0x14, 0x14, 0x14 } }, // 3D =
{ 4, { 0x41, 0x22, 0x14, 0x08 } }, // 3E >
{ 5, { 0x20, 0x40, 0x45, 0x48, 0x30 } }, // 3F ?
{ 5, { 0x3E, 0x41, 0x4D, 0x51, 0x36 } }, // 40 @
{ 5, { 0x3F, 0x48, 0x48, 0x48, 0x3F } }, // 41 A
{ 5, { 0x7F, 0x49, 0x49, 0x49, 0x36 } }, // 42 B
{ 5, { 0x3E, 0x41, 0x41, 0x41, 0x22 } }, // 43 C
{ 5, { 0x7F, 0x41, 0x41, 0x41, 0x3E } }, // 44 D
{ 5, { 0x7F, 0x49, 0x49, 0x49, 0x41 } }, // 45 E
{ 5, { 0x7F, 0x48, 0x48, 0x48, 0x40 } }, // 46 F
{ 5, { 0x3E, 0x41, 0x49, 0x49, 0x2E } }, // 47 G
{ 5, { 0x7F, 0x08, 0x08, 0x08, 0x7F } }, // 48 H
{ 3, { 0x41, 0x7F, 0x41 } }, // 49 I
{ 5, { 0x02, 0x01, 0x41, 0x7E, 0x40 } }, // 4A J
{ 5, { 0x7F, 0x08, 0x14, 0x22, 0x41 } }, // 4B K
{ 5, { 0x7F, 0x01, 0x01, 0x01, 0x01 } }, // 4C L
{ 5, { 0x7F, 0x20, 0x18, 0x20, 0x7F } }, // 4D M
{ 5, { 0x7F, 0x10, 0x08, 0x04, 0x7F } }, // 4E N
{ 5, { 0x3E, 0x41, 0x41, 0x41, 0x3E } }, // 4F O
{ 5, { 0x7F, 0x48, 0x48, 0x48, 0x30 } }, // 50 P
{ 5, { 0x3E, 0x41, 0x45, 0x42, 0x3D } }, // 51 Q
{ 5, { 0x7F, 0x48, 0x4C, 0x4A, 0x31 } }, // 52 R
{ 5, { 0x31, 0x49, 0x49, 0x49, 0x46 } }, // 53 S
{ 5, { 0x40, 0x40, 0x7F, 0x40, 0x40 } }, // 54 T
{ 5, { 0x7E, 0x01, 0x01, 0x01, 0x7E } }, // 55 U
{ 5, { 0x7C, 0x02, 0x01, 0x02, 0x7C } }, // 56 V
{ 5, { 0x7E, 0x01, 0x06, 0x01, 0x7E } }, // 57 W
{ 5, { 0x63, 0x14, 0x08, 0x14, 0x63 } }, // 58 X
{ 5, { 0x70, 0x08, 0x07, 0x08, 0x70 } }, // 59 Y
{ 5, { 0x43, 0x45, 0x49, 0x51, 0x61 } }, // 5A Z
{ 3, { 0x7F, 0x41, 0x41 } }, // 5B [
{ 5, { 0x20, 0x10, 0x08, 0x04, 0x02 } }, /* 5C \ */
{ 3, { 0x41, 0x41, 0x7F } }, // 5D ]
{ 5, { 0x10, 0x20, 0x40, 0x20, 0x10 } }, // 5E ^
{ 5, { 0x01, 0x01, 0x01, 0x01, 0x01 } }, // 5F _
{ 3, { 0x40, 0x20, 0x10 } }, // 60 `
{ 5, { 0x02, 0x15, 0x15, 0x15, 0x0F } }, // 61 a
{ 5, { 0x7F, 0x09, 0x11, 0x11, 0x0E } }, // 62 b
{ 5, { 0x0E, 0x11, 0x11, 0x11, 0x02 } }, // 63 c
{ 5, { 0x0E, 0x11, 0x11, 0x09, 0x7F } }, // 64 d
{ 5, { 0x0E, 0x15, 0x15, 0x15, 0x0C } }, // 65 e
{ 5, { 0x08, 0x3F, 0x48, 0x40, 0x20 } }, // 66 f
{ 5, { 0x18, 0x25, 0x25, 0x25, 0x3E } }, // 67 g
{ 5, { 0x7F, 0x08, 0x10, 0x10, 0x0F } }, // 68 h
{ 3, { 0x11, 0x5F, 0x01 } }, // 69 i
{ 4, { 0x02, 0x01, 0x11, 0x5E } }, // 6A j
{ 4, { 0x7F, 0x04, 0x0A, 0x11 } }, // 6B k
{ 3, { 0x41, 0x7F, 0x01 } }, // 6C l
{ 5, { 0x1F, 0x10, 0x0C, 0x10, 0x0F } }, // 6D m
{ 5, { 0x1F, 0x08, 0x10, 0x10, 0x0F } }, // 6E n
{ 5, { 0x0E, 0x11, 0x11, 0x11, 0x0E } }, // 6F o
{ 5, { 0x1F, 0x14, 0x14, 0x14, 0x08 } }, // 70 p
{ 5, { 0x08, 0x14, 0x14, 0x14, 0x0F } }, // 71 q
{ 5, { 0x1F, 0x08, 0x10, 0x10, 0x08 } }, // 72 r
{ 5, { 0x09, 0x15, 0x15, 0x15, 0x02 } }, // 73 s
{ 5, { 0x10, 0x7E, 0x11, 0x01, 0x02 } }, // 74 t
{ 5, { 0x1E, 0x01, 0x01, 0x02, 0x1F } }, // 75 u
{ 5, { 0x1C, 0x02, 0x01, 0x02, 0x1C } }, // 76 v
{ 5, { 0x1E, 0x01, 0x02, 0x01, 0x1E } }, // 77 w
{ 5, { 0x11, 0x0A, 0x04, 0x0A, 0x11 } }, // 78 x
{ 5, { 0x18, 0x05, 0x05, 0x05, 0x1E } }, // 79 y
{ 5, { 0x11, 0x13, 0x15, 0x19, 0x11 } }, // 7A z
{ 3, { 0x08, 0x36, 0x41 } }, // 7B {
{ 1, { 0x7F } }, // 7C |
{ 3, { 0x41, 0x36, 0x08 } }, // 7D }
{ 5, { 0x08, 0x10, 0x08, 0x04, 0x08 } }, // 7E ~
{ 0, {} }, // 7F DEL
{ 0, {} }, // 80 PAD
{ 0, {} }, // 81 HOP
{ 0, {} }, // 82 BPH
{ 0, {} }, // 83 NBH
{ 0, {} }, // 84 IND
{ 0, {} }, // 85 NEL
{ 0, {} }, // 86 SSA
{ 0, {} }, // 87 ESA
{ 0, {} }, // 88 HTS
{ 0, {} }, // 89 HTJ
{ 0, {} }, // 8A VTS
{ 0, {} }, // 8B PLD
{ 0, {} }, // 8C PLU
{ 0, {} }, // 8D RI
{ 0, {} }, // 8E SS2
{ 0, {} }, // 8F SS3
{ 0, {} }, // 90 DCS
{ 0, {} }, // 91 PU1
{ 0, {} }, // 92 PU2
{ 0, {} }, // 93 STS
{ 0, {} }, // 94 CCH
{ 0, {} }, // 95 MW
{ 0, {} }, // 96 SPA
{ 0, {} }, // 97 EPA
{ 0, {} }, // 98 SOS
{ 0, {} }, // 99 SGCI
{ 0, {} }, // 9A SCI
{ 0, {} }, // 9B CSI
{ 0, {} }, // 9C ST
{ 0, {} }, // 9D OSC
{ 0, {} }, // 9E PM
{ 0, {} }, // 9F APC
{ 1, { 0x00 } }, // A0 NBSP
{ 1, { 0x5F } }, // A1 ¡
{ 0, {} }, // A2 ¢
{ 5, { 0x09, 0x3F, 0x69, 0x69, 0x21 } }, // A3 £
{ 5, { 0x14, 0x3E, 0x55, 0x41, 0x22 } }, // A4 €
{ 5, { 0x74, 0x0C, 0x07, 0x0C, 0x74 } }, // A5 ¥
{ 0, {} }, // A6 Š
{ 4, { 0x29, 0x55, 0x55, 0x4A} }, // A7 §
{ 0, {} }, // A8 š
{ 7, { 0x3E, 0x41, 0x5D, 0x55, 0x55, 0x41, 0x3E } }, // A9 ©
{ 0, {} }, // AA ª
{ 5, { 0x04, 0x0A, 0x00, 0x04, 0x0A } }, // AB «
{ 4, { 0x08, 0x08, 0x08, 0x06 } }, // AC ¬
{ 0, {} }, // AD SHY
{ 7, { 0x3E, 0x41, 0x5D, 0x59, 0x55, 0x41, 0x3E } }, // AE ®
{ 3, { 0x02, 0x02, 0x02 } }, // AF ¯
{ 3, { 0x20, 0x50, 0x20 } }, // B0 °
{ 3, { 0x12, 0x3A, 0x12 } }, // B1 ±
{ 3, { 0x48, 0x58, 0x28 } }, // B2 ²
{ 3, { 0x48, 0x68, 0x30 } }, // B3 ³
{ 0, {} }, // B4 Ž
{ 4, { 0x0F, 0x02, 0x02, 0x0E } }, // B5 µ
{ 5, { 0x30, 0x78, 0x7F, 0x40, 0x7F } }, // B6 ¶
{ 1, { 0x08 } }, // B7 ·
{ 0, {} }, // B8 ž
{ 3, { 0x28, 0x78, 0x08 } }, // B9 ¹
{ 0, {} }, // BA º
{ 5, { 0x0A, 0x04, 0x00, 0x0A, 0x04 } }, // BB »
{ 6, { 0x3E, 0x41, 0x41, 0x7F, 0x49, 0x49 } }, // BC Œ
{ 5, { 0x0E, 0x11, 0x11, 0x0E, 0x15, 0x0C } }, // BD œ
{ 0, {} }, // BE Ÿ
{ 5, { 0x06, 0x09, 0x51, 0x01, 0x02 } }, // BF ¿
{ 0, {} }, // C0 À
{ 0, {} }, // C1 Á
{ 0, {} }, // C2 Â
{ 0, {} }, // C3 Ã
{ 5, { 0x1F, 0x64, 0x24, 0x64, 0x1F } }, // C4 Ä
{ 0, {} }, // C5 Å
{ 6, { 0x3F, 0x48, 0x48, 0x7F, 0x49, 0x49 } }, // C6 Æ
{ 0, {} }, // C7 Ç
{ 0, {} }, // C8 È
{ 0, {} }, // C9 É
{ 0, {} }, // CA Ê
{ 0, {} }, // CB Ë
{ 0, {} }, // CC Ì
{ 0, {} }, // CD Í
{ 0, {} }, // CE Î
{ 0, {} }, // CF Ï
{ 5, { 0x08, 0x7F, 0x49, 0x41, 0x3E } }, // D0 Ð
{ 0, {} }, // D1 Ñ
{ 0, {} }, // D2 Ò
{ 0, {} }, // D3 Ó
{ 0, {} }, // D4 Ô
{ 0, {} }, // D5 Õ
{ 5, { 0x1E, 0x61, 0x21, 0x61, 0x1E } }, // D6 Ö
{ 5, { 0x0A, 0x04, 0x0A } }, // D7 ×
{ 0, {} }, // D8 Ø
{ 0, {} }, // D9 Ù
{ 0, {} }, // DA Ú
{ 0, {} }, // DB Û
{ 5, { 0x3E, 0x41, 0x01, 0x41, 0x3E } }, // DC Ü
{ 0, {} }, // DD Ý
{ 4, { 0x7F, 0x28, 0x28, 0x10 } }, // DE Þ
{ 4, { 0x3F, 0x40, 0x49, 0x36 } }, // DF ß
{ 0, {} }, // E0 à
{ 0, {} }, // E1 á
{ 0, {} }, // E2 â
{ 0, {} }, // E3 ã
{ 5, { 0x02, 0x55, 0x15, 0x55, 0x0F } }, // E4 ä
{ 0, {} }, // E5 å
{ 7, { 0x02, 0x15, 0x15, 0x0E, 0x15, 0x15, 0x0C } }, // E6 æ
{ 0, {} }, // E7 ç
{ 0, {} }, // E8 è
{ 0, {} }, // E9 é
{ 0, {} }, // EA ê
{ 0, {} }, // EB ë
{ 0, {} }, // EC ì
{ 0, {} }, // ED í
{ 0, {} }, // EE î
{ 0, {} }, // EF ï
{ 0, {} }, // F0 ð
{ 0, {} }, // F1 ñ
{ 0, {} }, // F2 ò
{ 0, {} }, // F3 ó
{ 0, {} }, // F4 ô
{ 0, {} }, // F5 õ
{ 5, { 0x0E, 0x51, 0x11, 0x51, 0x0E } }, // F6 ö
{ 5, { 0x08, 0x08, 0x2A, 0x08, 0x08 } }, // F7 ÷
{ 0, {} }, // F8 ø
{ 0, {} }, // F9 ù
{ 0, {} }, // FA ú
{ 0, {} }, // FB û
{ 5, { 0x1E, 0x41, 0x01, 0x42, 0x1F } }, // FC ü
{ 0, {} }, // FD ý
{ 4, { 0x7F, 0x14, 0x14, 0x08 } }, // FE þ
{ 5, { 0x18, 0x45, 0x05, 0x45, 0x1E } }, // FF ÿ
};
#endif

View file

@ -1,78 +1,116 @@
#include "font.h"
#include <Arduino.h>
#include <avr/cpufunc.h>
#include <avr/pgmspace.h>
#include "font.h"
#include <limits.h>
#include <stdint.h>
const int WIDTH = 120;
const int LINES = 7;
const int LINE_PINS[7] = { 2, 3, 4, 5, 6, 7, 8 };
int pixel_width(String const & text);
void shiftout(uint8_t const bit);
int write_letter_at(int col, uint8_t const letter);
void letters(int pos);
void receive_serial();
int const WIDTH = 120;
int const LINES = 7;
int const CHAR_GAP = 1;
int const LINE_PINS[7] = { 2, 3, 4, 5, 6, 7, 8 };
uint8_t buffer[120];
String message = "9600N1 ISO8859-15 https://github.com/silentium83/zielanzeige/tree/develop";
String newMessage;
int messageLength = pixel_width(message);
int ticks = 0;
int runde = 120;
int turn = 120;
int pixel_width(String const & text) {
int width = 0;
for (unsigned int i = 0; i < text.length(); ++i) {
uint8_t const charWidth = pgm_read_byte(&font_var_width[(uint8_t)(text[i])].width);
if (charWidth) {
if (width < INT_MAX - CHAR_GAP - charWidth) {
width += charWidth + CHAR_GAP;
} else {
return INT_MAX;
}
}
}
width -= CHAR_GAP;
if (width < 0) {
width = 0;
}
return width;
}
// Shift register needs to use raw AVR
// B1 is clock
// B2 is data
void shiftout(uint8_t bit) {
void shiftout(uint8_t const bit) {
PORTB = bit << 2;
PORTB |= 0x02;
PORTB = 0;
}
void write_letter_at(int startcol, uint8_t letter) {
for (int_fast8_t x = 0; x < 5; x++) {
int col = startcol + x;
int write_letter_at(int col, uint8_t const letter) {
uint8_t charWidth = pgm_read_byte(&font_var_width[letter].width);
for (int_fast8_t x = 0; x < charWidth; ++x) {
if (col >= 0 && col < WIDTH) {
buffer[col] = pgm_read_byte(&font_5x7_col[letter][x]);
buffer[col] = pgm_read_byte(&font_var_width[letter].columns[x]);
} else if (col >= WIDTH) {
return col;
}
++col;
}
col += CHAR_GAP;
return col;
}
void letters(int round) {
for (int i = 0; i < WIDTH; i++) {
void letters(int pos) {
for (int i = 0; i < WIDTH; ++i) {
buffer[i] = 0;
}
int pos = 0;
for (unsigned int c = 0; c < message.length(); c++) {
write_letter_at(round + pos, message[c]);
pos += 6;
for (unsigned int c = 0; c < message.length() && pos < WIDTH; ++c) {
pos = write_letter_at(pos, message[c]);
}
}
void receive_serial() {
while (Serial.available() > 0) {
char receivedChar = Serial.read();
char const receivedChar = Serial.read();
switch (receivedChar) {
case '\b': // backspace
if (newMessage.length() > 0) {
newMessage.remove(newMessage.length() - 1);
Serial.write("\b ");
}
break;
case '\n': // newline
case '\r': // carriage return
if (newMessage.length() > 0) {
if (message != newMessage) {
message = newMessage;
messageLength = pixel_width(message);
ticks = 0;
runde = 120;
turn = 120;
}
newMessage = "";
}
Serial.print(message);
break;
case '\r': // carriage return
break;
default:
newMessage += receivedChar;
break;
}
Serial.write(receivedChar);
}
}
void setup() {
for (uint_fast8_t i = 2; i <= 10; i++) {
for (uint_fast8_t i = 2; i <= 10; ++i) {
pinMode(i, OUTPUT);
}
pinMode(13, OUTPUT);
@ -81,9 +119,9 @@ void setup() {
}
void loop() {
for (uint_fast8_t y = 0; y < LINES; y++) {
for (uint_fast8_t x = 0; x < WIDTH; x++) {
uint8_t bit = (buffer[x] & (1 << y)) ? 1 : 0;
for (uint_fast8_t y = 0; y < LINES; ++y) {
for (uint_fast8_t x = 0; x < WIDTH; ++x) {
uint8_t const bit = (buffer[x] & (1 << y)) ? 1 : 0;
shiftout(bit);
}
@ -94,19 +132,19 @@ void loop() {
digitalWrite(LINE_PINS[y], 0);
}
ticks++;
++ticks;
if (ticks == 8) {
ticks = 0;
if ((6 * (int)message.length()) > 120) {
runde--;
if (messageLength > 120) {
--turn;
letters(runde);
letters(turn);
if (runde == -(6 * (int)message.length())) {
runde = 120;
if (turn == -messageLength) {
turn = 120;
}
} else {
int padding = (120 - (6 * (int)message.length())) / 2;
int const padding = (120 - messageLength) / 2;
letters(padding);
}