2025-05-27
电子
0

目录

前言
5x7 行扫描点阵字体

50603-20170410112400251-1369264669.png

前言

最近在写VFD屏幕驱动,但是点阵部分的5x7字体却一直找不到合适的,所以干脆找AI帮忙把一个列扫描格式的字体转换到行扫描了。好不好看先另说,但至少是能用了🤗。

5x7 行扫描点阵字体

该字体原始数据基于博客园这篇文章:PHP 点阵5*7字体

原字体数据取模方式为逆向列扫描低7位有效格式,例如字母“A”,其原始数据为:

c
// 'A' {0x7E, 0x11, 0x11, 0x11, 0x7E}

转换为二进制就是:

ini
0x7E = 0b01111110 0x11 = 0b00010001 0x11 = 0b00010001 0x11 = 0b00010001 0x7E = 0b01111110
示例图片

不难看出这个数据格式中每一字节代表字符一列,并且每字节的低7位(bit0~bit6)有效,第一字节的最低位对应字符的最左上角的一个像素,倒数第二位对应第一列第二行的像素,以此类推。

如果我们要将其转换为顺向行扫描高5位有效,就需要将每一字节的相同位数据抽出后按原字节顺序重新拼接在新的字节的高5位,并在每一字节的末尾部分补0,凑齐一个字节。

同样以A为例,按照上述方式转换完的7字节数据应当如下:

ini
0x70 = 0b01110000 0x88 = 0b10001000 0x88 = 0b10001000 0x88 = 0b10001000 0xF8 = 0b11111000 0x88 = 0b10001000 0x88 = 0b10001000

这样保存的字模数据比较适合行扫描型的屏幕使用,缺点是存储利用率较低,因为每字节只有5bit的有效数据(62.5%),相较于每字节7bit有效数据(87.5%)的列扫描格式利用率低了很多。对于程序大小不敏感的应用还是可以接受的,但是如果设备的存储空间及其有限,还是建议更换其他的存储格式。

最终整体转换好的数据如下,格式为C语言二维数组(我把最后一位全黑的字符删除了,所以相比原数据少了一行):

c
const uint8_t VFD_FONT[95][7] = { // ------------------------------- // ASCII 32 (' ') 到 ASCII 126 ('~') // 格式说明: 一个字节表示一行,[行0] [行1] ... [行6]共计7行 // 高位对应左列, 5bit有效数据(bit7~bit3) // ------------------------------- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},/*" ",0*/ {0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20},/*"!",1*/ {0x50, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00},/*""",2*/ {0x50, 0x50, 0xF8, 0x50, 0xF8, 0x50, 0x50},/*"#",3*/ {0x20, 0x78, 0xA0, 0x50, 0x08, 0xD0, 0x00},/*"$",4*/ {0xC0, 0xC8, 0x10, 0x20, 0x40, 0x98, 0x18},/*"%",5*/ {0xE0, 0x90, 0xA0, 0x40, 0xA8, 0x90, 0x68},/*"&",6*/ {0x60, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00},/*"'",7*/ {0x10, 0x20, 0x40, 0x40, 0x40, 0x20, 0x10},/*"(",8*/ {0x40, 0x20, 0x10, 0x10, 0x10, 0x20, 0x40},/*")",9*/ {0x00, 0x50, 0x20, 0xF8, 0x20, 0x50, 0x00},/*"*",10*/ {0x00, 0x20, 0x20, 0xF8, 0x20, 0x20, 0x00},/*"+",11*/ {0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x40},/*",",12*/ {0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00},/*"-",13*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60},/*".",14*/ {0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00},/*"/",15*/ {0x70, 0x88, 0x98, 0xA8, 0xC8, 0x88, 0x70},/*"0",16*/ {0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x70},/*"1",17*/ {0x70, 0x88, 0x08, 0x10, 0x20, 0x40, 0xF8},/*"2",18*/ {0xF8, 0x10, 0x20, 0x10, 0x08, 0x88, 0x70},/*"3",19*/ {0x10, 0x30, 0x50, 0x90, 0xF8, 0x10, 0x10},/*"4",20*/ {0xF8, 0x80, 0xF0, 0x08, 0x08, 0x88, 0x70},/*"5",21*/ {0x30, 0x40, 0x80, 0xF0, 0x88, 0x88, 0x70},/*"6",22*/ {0xF8, 0x08, 0x10, 0x20, 0x40, 0x40, 0x40},/*"7",23*/ {0x70, 0x88, 0x88, 0x70, 0x88, 0x88, 0x70},/*"8",24*/ {0x70, 0x88, 0x88, 0x78, 0x08, 0x10, 0x60},/*"9",25*/ {0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00},/*":",26*/ {0x00, 0x60, 0x60, 0x00, 0x60, 0x20, 0x40},/*";",27*/ {0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08},/*"<",28*/ {0x00, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x00},/*"=",29*/ {0x80, 0x40, 0x20, 0x10, 0x20, 0x40, 0x80},/*">",30*/ {0x70, 0x88, 0x08, 0x10, 0x20, 0x00, 0x20},/*"?",31*/ {0x70, 0x88, 0x08, 0x68, 0xA8, 0xA8, 0x70},/*"@",32*/ {0x70, 0x88, 0x88, 0x88, 0xF8, 0x88, 0x88},/*"A",33*/ {0xF0, 0x88, 0x88, 0xF0, 0x88, 0x88, 0xF0},/*"B",34*/ {0x70, 0x88, 0x80, 0x80, 0x80, 0x88, 0x70},/*"C",35*/ {0xE0, 0x90, 0x88, 0x88, 0x88, 0x90, 0xE0},/*"D",36*/ {0xF8, 0x80, 0x80, 0xF0, 0x80, 0x80, 0xF8},/*"E",37*/ {0xF8, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x80},/*"F",38*/ {0x70, 0x88, 0x80, 0x80, 0x98, 0x88, 0x70},/*"G",39*/ {0x88, 0x88, 0x88, 0xF8, 0x88, 0x88, 0x88},/*"H",40*/ {0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70},/*"I",41*/ {0x38, 0x10, 0x10, 0x10, 0x10, 0x90, 0x60},/*"J",42*/ {0x88, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x88},/*"K",43*/ {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xF8},/*"L",44*/ {0x88, 0xD8, 0xA8, 0x88, 0x88, 0x88, 0x88},/*"M",45*/ {0x88, 0x88, 0xC8, 0xA8, 0x98, 0x88, 0x88},/*"N",46*/ {0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70},/*"O",47*/ {0xF0, 0x88, 0x88, 0xF0, 0x80, 0x80, 0x80},/*"P",48*/ {0x70, 0x88, 0x88, 0x88, 0xA8, 0x90, 0x68},/*"Q",49*/ {0xF0, 0x88, 0x88, 0xF0, 0xA0, 0x90, 0x88},/*"R",50*/ {0x78, 0x80, 0x80, 0x70, 0x08, 0x08, 0xF0},/*"S",51*/ {0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20},/*"T",52*/ {0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70},/*"U",53*/ {0x88, 0x88, 0x88, 0x88, 0x88, 0x50, 0x20},/*"V",54*/ {0x88, 0x88, 0x88, 0xA8, 0xA8, 0xD8, 0x88},/*"W",55*/ {0x88, 0x88, 0x50, 0x20, 0x50, 0x88, 0x88},/*"X",56*/ {0x88, 0x88, 0x50, 0x20, 0x20, 0x20, 0x20},/*"Y",57*/ {0xF8, 0x08, 0x10, 0x20, 0x40, 0x80, 0xF8},/*"Z",58*/ {0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38},/*"[",59*/ {0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00},/*"\",60*/ {0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0xE0},/*"]",61*/ {0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00},/*"^",62*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8},/*"_",63*/ {0x40, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00},/*"`",64*/ {0x00, 0x00, 0x70, 0x08, 0x78, 0x88, 0x78},/*"a",65*/ {0x80, 0x80, 0xB0, 0xC8, 0x88, 0x88, 0xF0},/*"b",66*/ {0x00, 0x00, 0x70, 0x80, 0x80, 0x88, 0x70},/*"c",67*/ {0x08, 0x08, 0x68, 0x98, 0x88, 0x88, 0x78},/*"d",68*/ {0x00, 0x00, 0x70, 0x88, 0xF8, 0x80, 0x70},/*"e",69*/ {0x30, 0x48, 0x40, 0xE0, 0x40, 0x40, 0x40},/*"f",70*/ {0x00, 0x00, 0x78, 0x88, 0x78, 0x08, 0x30},/*"g",71*/ {0x80, 0x80, 0xB0, 0xC8, 0x88, 0x88, 0x88},/*"h",72*/ {0x20, 0x00, 0x60, 0x20, 0x20, 0x20, 0x70},/*"i",73*/ {0x10, 0x00, 0x30, 0x10, 0x10, 0x90, 0x60},/*"j",74*/ {0x40, 0x40, 0x48, 0x50, 0x60, 0x50, 0x48},/*"k",75*/ {0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70},/*"l",76*/ {0x00, 0x00, 0xD0, 0xA8, 0xA8, 0x88, 0x88},/*"m",77*/ {0x00, 0x00, 0xB0, 0xC8, 0x88, 0x88, 0x88},/*"n",78*/ {0x00, 0x00, 0x70, 0x88, 0x88, 0x88, 0x70},/*"o",79*/ {0x00, 0x00, 0xF0, 0x88, 0xF0, 0x80, 0x80},/*"p",80*/ {0x00, 0x00, 0x68, 0x98, 0x78, 0x08, 0x08},/*"q",81*/ {0x00, 0x00, 0xB0, 0xC8, 0x80, 0x80, 0x80},/*"r",82*/ {0x00, 0x00, 0x70, 0x80, 0x70, 0x08, 0xF0},/*"s",83*/ {0x40, 0x40, 0xE0, 0x40, 0x40, 0x48, 0x30},/*"t",84*/ {0x00, 0x00, 0x88, 0x88, 0x88, 0x98, 0x68},/*"u",85*/ {0x00, 0x00, 0x88, 0x88, 0x88, 0x50, 0x20},/*"v",86*/ {0x00, 0x00, 0x88, 0x88, 0xA8, 0xA8, 0x50},/*"w",87*/ {0x00, 0x00, 0x88, 0x50, 0x20, 0x50, 0x88},/*"x",88*/ {0x00, 0x00, 0x88, 0x88, 0x78, 0x08, 0x70},/*"y",89*/ {0x00, 0x00, 0xF8, 0x10, 0x20, 0x40, 0xF8},/*"z",90*/ {0x10, 0x20, 0x20, 0x40, 0x20, 0x20, 0x10},/*"{",91*/ {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20},/*"|",92*/ {0x40, 0x20, 0x20, 0x10, 0x20, 0x20, 0x40},/*"}",93*/ {0x40, 0xA8, 0x10, 0x00, 0x00, 0x00, 0x00},/*"~",94*/ };

本文作者:Polaris⭐

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 Polari_S_tation 版权所有 许可协议。转载请注明出处!