Unlike a computer monitor where you can place text at any X/Y coordinate, u8x8 displays operate on a cell grid. A typical display might be 16 columns by 8 rows of characters. You cannot place a letter halfway between two cells.
At its core, a U8x8 font is a fixed-width bitmap font where each character is contained within a box that is exactly 8 pixels wide by 8 pixels tall. The "U8" typically stands for "Microcontroller (µC) with 8-bit architecture" or simply "unsigned 8-bit," referencing the data type used to store each column of the glyph.
Unlike proportional fonts (where an 'i' is narrower than a 'w'), every character in a U8x8 set occupies the same bounding box. This uniformity simplifies rendering dramatically: to draw a character, the software simply copies a pre-defined pattern of bits into an 8x8 block of pixels on the screen. u8x8 fonts
These look like standard PC BIOS or terminal fonts.
U8x8 supports hardware scaling (no extra memory): Unlike a computer monitor where you can place
u8x8.setFont(u8x8_font_8x13_1x2_n); // "1x2" = 1 column wide, 2 rows tall (per char)
u8x8.setFont(u8x8_font_inb21_2x4_n); // "2x4" = 2 cols wide, 4 rows tall
Scaling multiplies the base character cell size – useful for headings or low-vision displays.
A U8x8 font is not a file like a .ttf or .otf. Instead, it is a C-language byte array stored in the microcontroller's flash memory (PROGMEM). Each character is represented by 8 bytes (one per row of pixels). With each byte controlling one row, its 8 bits correspond to the 8 columns from left to right. Scaling multiplies the base character cell size –
Here’s a simplified conceptual example for the letter 'A' in a U8x8 font:
Because of the 8-byte-per-character structure, a complete ASCII font (96 printable characters) would require 96 * 8 = 768 bytes of storage—perfectly comfortable for even the smallest ATmega328P (Arduino Uno) with its 32KB of flash.