2

您知道将字母转换为代表字母的矩阵(由 0 和 1 组成)的程序或脚本吗?例如,从字母 I 到这样的矩阵:(这是一个显示字母 I 的 LED 面板):

例子

请让我知道一种创建此类矩阵的方法,而不是手动键入
Thx。

4

2 回答 2

2

唯一的解决方案是使用字体。

  1. 对于硬件实现,我通常使用 EGA/VGA 8x8 字体

    从 gfx 卡BIOS中提取,您可以在MS-DOS环境中轻松完成

  2. 另一种方法是从图像中以编程方式提取字体

    将整个字体绘制到位图(在线或矩阵中......,或使用一些已经创建的像我的)。使用固定间距,字体大小最适合您的需要,不要忘记几乎没有现代字体支持固定间距,因此请使用OEM_CHARSETSystem从中命名字体。正确设置颜色(理想的是黑色背景和白色字体)并逐像素读取图像并将其存储为数字表。没有背景颜色的像素被设置为像素。

    不要因为抗锯齿和过滤器而与字体颜色进行比较。现在读取字体表中的所有字符并设置/重新设置相应的位。首先计算x,y图像中字符的开始(来自ASCII代码和图像组织),然后执行 2 个嵌套的 8 步x,yfor 循环(根据您的font[]组织顺序)

    set/res地址对应的 font[]8*ASCII8*ASCII+8

  3. 我假设您使用 MCU 来控制 LED 面板

    内存中的字体组织通常是 8 位数字代表字符中的单行。当然,如果您的LED面板是用来显示动画滚动的,那么字体的列组织和硬件实现会大大简化事情。如果您有 16 位MCUIO访问权限,则可以使用16-bit/ 像素字体大小。

    如果您有超过 8 个像素且只有 8 位 MCU,您仍然可以使用 16 位数据,但 IO 访问将通过两个 IO 端口而不是 1 个分两步进行。我强烈建议整个数据范围的 IO 访问而不是 set/res单独的 IO 线更快,并且可以防止闪烁

好的,这是我以前8x8使用的旧字体...我认为这是从EGA/VGA BIOS中提取的,但我不支持...这是太多年前的事了

固定间距 8x8 字体

现在有趣的部分

const BYTE font[8*256]={ 0,0,0,0,0,0,0,0, ... }

任何字符都表示为 8 个数字。如果位是0则表示纸张(背景像素) 如果位是1则表示墨水(字体像素)。现在有更多组合(从左到右,从上到下及其组合)

OK ( row-vise | left to right | up to down ) 组织意味着:

  • 第一个数字在最上面的 char 行
  • msb是最左边的像素
  • lsb是最右边的像素

因此,例如 char '1' in8x8将是这样的(b 表示二进制数):

00000000b,
00001000b,
00011000b,
00101000b,
00001000b,
00001000b,
00111100b,
00000000b,

当您将所有字符提取到字体表而不是将其作为源代码保存到文件中时,您稍后将包含在您的MCU代码中(可以放在EEPROM中用于 pgm-code)

现在在LED面板上打印字符的算法很大程度上取决于您的硬件实现

  • 所以请贴一张LED面板与控制系统互连的电路图
  • 指定目标平台和语言
  • 指定所需的功能

我假设您希望按像素步向左移动滚动

  1. 如果您的 LED 面板由列而不是行驱动,则最合适

    您可以通过某个数据 IO端口激活单列LED(一次可以激活所有位),选择哪一列激活由另一个选择 IO端口驱动(一次只能激活单个位)。所以在这种情况下,计算要在字体表中显示的列的起始地址:

    • address = (8*ASCII + x_offset)
    • 发送font[8*ASCII + x_offset]数据IO
    • 使用正确的位激活选择 IO端口
    • 稍等一下(1-10ms)......所以如果延迟太短,您实际上可以看到光,如果延迟太长,则没有亮度,则有闪烁,因此您需要进行一些实验(取决于选择的数量位)。
    • 停用选择 IO端口
    • 重复下一列
    • x_offset是滚动移位
  2. 如果您的硬件实现不适合这种方式,请不要担心

    只需使用位 SHIFT、AND、OR 操作在内存中创建数据字,然后以类似的方式发送它们

希望它有点帮助

于 2013-12-09T11:03:49.227 回答
0

您可以尝试找到一种看起来像您想要的方式的字体(可能是等宽字体,例如 Courier),以特定大小(8pt?)绘制/光栅化它,而不使用抗锯齿,然后将生成的图像转换为您的矩阵格式.

于 2013-01-07T13:41:39.027 回答