Source

model100 / font.c

Full commit
/** \file
 * Bitmap font drawing.
 *
 * 5x7 font is stored in program memory in 8-bit columns with the
 * LSB at the top of the column, MSB at the bottom.
 */
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "font.h"
#include "lcd.h"
 
static const char font[][6] PROGMEM =
{
	[' '] = {0x00,0x00,0x00,0x00,0x00,0x00},
 
	['!'] = {0x00,0x00,0x00,0x4F,0x00,0x00},
	['"'] = {0x00,0x00,0x07,0x00,0x07,0x00},
	['#'] = {0x00,0x14,0x7F,0x14,0x7F,0x14},
	['$'] = {0x00,0x24,0x2A,0x7F,0x2A,0x12},
	['%'] = {0x00,0x23,0x13,0x08,0x64,0x62},
	['&'] = {0x00,0x36,0x49,0x55,0x22,0x50},
	['\''] = {0x00,0x00,0x05,0x03,0x00,0x00},
	['('] = {0x00,0x00,0x1C,0x22,0x41,0x00},
	[')'] = {0x00,0x00,0x41,0x22,0x1C,0x00},
	['*'] = {0x00,0x14,0x08,0x3E,0x08,0x14},
	['+'] = {0x00,0x08,0x08,0x3E,0x08,0x08},
	[','] = {0x00,0x00,0x50,0x30,0x00,0x00},
	['-'] = {0x00,0x08,0x08,0x08,0x08,0x08},
	['.'] = {0x00,0x00,0x60,0x60,0x00,0x00},
	['/'] = {0x00,0x20,0x10,0x08,0x04,0x02},
 
	['0'] = {0x00,0x3E,0x51,0x49,0x45,0x3E},
	['1'] = {0x00,0x00,0x42,0x7F,0x40,0x00},
	['2'] = {0x00,0x42,0x61,0x51,0x49,0x46},
	['3'] = {0x00,0x21,0x41,0x45,0x4B,0x31},
	['4'] = {0x00,0x18,0x14,0x12,0x7F,0x10},
	['5'] = {0x00,0x27,0x45,0x45,0x45,0x39},
	['6'] = {0x00,0x3C,0x4A,0x49,0x49,0x30},
	['7'] = {0x00,0x01,0x71,0x09,0x05,0x03},
	['8'] = {0x00,0x36,0x49,0x49,0x49,0x36},
	['9'] = {0x00,0x06,0x49,0x49,0x29,0x1E},
 
	[':'] = {0x00,0x36,0x36,0x00,0x00,0x00},
	[';'] = {0x00,0x56,0x36,0x00,0x00,0x00},
	['<'] = {0x00,0x08,0x14,0x22,0x41,0x00},
	['='] = {0x00,0x14,0x14,0x14,0x14,0x14},
	['>'] = {0x00,0x00,0x41,0x22,0x14,0x08},
	['?'] = {0x00,0x02,0x01,0x51,0x09,0x06},
	['@'] = {0x00,0x30,0x49,0x79,0x41,0x3E},
 
	['A'] = {0x00,0x7E,0x11,0x11,0x11,0x7E},
	['B'] = {0x00,0x7F,0x49,0x49,0x49,0x36},
	['C'] = {0x00,0x3E,0x41,0x41,0x41,0x22},
	['D'] = {0x00,0x7F,0x41,0x41,0x22,0x1C},
	['E'] = {0x00,0x7F,0x49,0x49,0x49,0x41},
	['F'] = {0x00,0x7F,0x09,0x09,0x09,0x01},
	['G'] = {0x00,0x3E,0x41,0x49,0x49,0x7A},
	['H'] = {0x00,0x7F,0x08,0x08,0x08,0x7F},
	['I'] = {0x00,0x00,0x41,0x7F,0x41,0x00},
	['J'] = {0x00,0x20,0x40,0x41,0x3F,0x01},
	['K'] = {0x00,0x7F,0x08,0x14,0x22,0x41},
	['L'] = {0x00,0x7F,0x40,0x40,0x40,0x40},
	['M'] = {0x00,0x7F,0x02,0x0C,0x02,0x7F},
	['N'] = {0x00,0x7F,0x04,0x08,0x10,0x7F},
	['O'] = {0x00,0x3E,0x41,0x41,0x41,0x3E},
	['P'] = {0x00,0x7F,0x09,0x09,0x09,0x06},
	['Q'] = {0x00,0x3E,0x41,0x51,0x21,0x5E},
	['R'] = {0x00,0x7F,0x09,0x19,0x29,0x46},
	['S'] = {0x00,0x46,0x49,0x49,0x49,0x31},
	['T'] = {0x00,0x01,0x01,0x7F,0x01,0x01},
	['U'] = {0x00,0x3F,0x40,0x40,0x40,0x3F},
	['V'] = {0x00,0x1F,0x20,0x40,0x20,0x1F},
	['W'] = {0x00,0x3F,0x40,0x30,0x40,0x3F},
	['X'] = {0x00,0x63,0x14,0x08,0x14,0x63},
	['Y'] = {0x00,0x07,0x08,0x70,0x08,0x07},
	['Z'] = {0x00,0x61,0x51,0x49,0x45,0x43},
 
	['['] = {0x00,0x00,0x7F,0x41,0x41,0x00},
	['\\'] = {0x00,0x02,0x04,0x08,0x10,0x20},
	[']'] = {0x00,0x00,0x41,0x41,0x7F,0x00},
	['^'] = {0x00,0x04,0x02,0x01,0x02,0x04},
	['_'] = {0x00,0x40,0x40,0x40,0x40,0x40},
	['`'] = {0x00,0x00,0x01,0x02,0x04,0x00},
 
	['a'] = {0x00,0x20,0x54,0x54,0x54,0x78},
	['b'] = {0x00,0x7F,0x50,0x48,0x48,0x30},
	['c'] = {0x00,0x38,0x44,0x44,0x44,0x20},
	['d'] = {0x00,0x38,0x44,0x44,0x48,0x7F},
	['e'] = {0x00,0x38,0x54,0x54,0x54,0x18},
	['f'] = {0x00,0x08,0x7E,0x09,0x01,0x02},
	['g'] = {0x00,0x0C,0x52,0x52,0x52,0x3E},
	['h'] = {0x00,0x7F,0x08,0x04,0x04,0x78},
	['i'] = {0x00,0x00,0x44,0x7D,0x40,0x00},
	['j'] = {0x00,0x20,0x40,0x44,0x3D,0x00},
	['k'] = {0x00,0x7F,0x10,0x28,0x44,0x00},
	['l'] = {0x00,0x00,0x41,0x7F,0x40,0x00},
	['m'] = {0x00,0x78,0x04,0x18,0x04,0x78},
	['n'] = {0x00,0x7C,0x08,0x04,0x04,0x78},
	['o'] = {0x00,0x38,0x44,0x44,0x44,0x38},
	['p'] = {0x00,0x7C,0x14,0x14,0x14,0x08},
	['q'] = {0x00,0x08,0x14,0x14,0x18,0x7C},
	['r'] = {0x00,0x7C,0x08,0x04,0x04,0x08},
	['s'] = {0x00,0x48,0x54,0x54,0x54,0x20},
	['t'] = {0x00,0x04,0x3F,0x44,0x40,0x20},
	['u'] = {0x00,0x3C,0x40,0x40,0x20,0x7C},
	['v'] = {0x00,0x1C,0x20,0x40,0x20,0x1C},
	['w'] = {0x00,0x3C,0x40,0x30,0x40,0x3C},
	['x'] = {0x00,0x44,0x28,0x10,0x28,0x44},
	['y'] = {0x00,0x0C,0x50,0x50,0x50,0x3C},
	['z'] = {0x00,0x44,0x64,0x54,0x4C,0x44},
 
	['{'] = {0x00,0x00,0x08,0x36,0x41,0x00},
	['|'] = {0x00,0x00,0x00,0x7F,0x00,0x00},
	['}'] = {0x00,0x00,0x41,0x36,0x08,0x00},
	['~'] = {0x00,0x0C,0x02,0x0C,0x10,0x0C},
};


#if 0
// \todo: Make use of this
static void
lcd_select(
	uint8_t x,
	uint8_t y,
	uint8_t val
)
{
	if (y < 32)
	{
		// Top half of the display
		if (x < 50)
			out(LCD_CS20, val);
		else
		if (x < 100)
			out(LCD_CS21, val);
		else
		if (x < 150)
			out(LCD_CS22, val);
		else
		if (x < 200)
			out(LCD_CS23, val);
		else
			out(LCD_CS24, val);
	} else {
		// Bottom half of the display
		if (x < 50)
			out(LCD_CS25, val);
		else
		if (x < 100)
			out(LCD_CS26, val);
		else
		if (x < 150)
			out(LCD_CS27, val);
		else
		if (x < 200)
			out(LCD_CS28, val);
		else
			out(LCD_CS29, val);
	}
}
#endif


void
font_draw(
	uint8_t col,
	uint8_t row,
	uint8_t c,
	uint8_t mod
)
{
	uint8_t x = col * 6;
	uint8_t y = row * 8;

	const char * f = font[c];

	for (uint8_t i = 0 ; i < 6 ; i++, x++)
	{
		// this would be faster if we used the auto-increment
		// functions, but has lots of special cases for crossing
		// display boundaries.
		uint8_t bits = pgm_read_byte(&f[i]);
		if (mod & FONT_UNDERLINE)
			bits |= 0x80;
		if (mod & FONT_INVERSE)
			bits = ~bits;

		lcd_display(x, y, bits);
	}
}