如何将字母转换为像素

时间:2012-10-26 05:51:17

标签: string matrix character pixelate

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

example

请让我知道一种创建除手动打字之外的矩阵的方法 谢谢。

2 个答案:

答案 0 :(得分:2)

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

  1. 用于HW实现我通常使用EGA / VGA 8x8字体

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

  2. 另一种方法是从图像中提取字体programaticaly

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

    由于抗锯齿和过滤器,请勿与字体颜色进行比较。现在读取所有字符并在字体表中设置/ res对应的位。首先计算图像中字符的开始x,y(来自 ASCII 代码和图像组织),然后为循环执行2个嵌套的8步x,y(根据您的{{1顺序)组织)

    地址font[]set/res

  3. 的{p> font[]8*ASCII
  4. 我假设您使用MCU来控制LED面板

    内存中的字体组织通常是8位数字表示单行字符。当然,如果你的 LED 面板用于显示动画滚动,那么字体的列组织和硬件实现将使事情变得更加容易。如果您有16位 MCU IO 访问权限,则可以使用8*ASCII+8 / pixels字体大小。

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

  5. 好的,这是我以前用过的旧16-bit字体......我觉得这个字体是从 EGA / VGA BIOS 中提取的,但我不是支持...太多年前了

    fixed pitch 8x8 font

    现在有趣的部分

    8x8

    任何字符都表示为8个数字。如果位是const BYTE font[8*256]={ 0,0,0,0,0,0,0,0, ... } 那么它意味着纸张(背景像素),如果位是0那么它意味着墨水(字体像素)。现在有更多组合(从左到右,从上到下和它们的组合)

    确定(行间隔|从左到右|向上到向下)组织意味着:

    • 第一个数字是最多的一行char
    • msb 是最左边的像素
    • lsb 是最正确的像素

    所以例如1中的char'1'将是这样的(b表示二进制数):

    8x8

    将所有字符提取到字体表后,将其保存为文件的源代码,稍后将包含在 MCU 代码中(可以放在 EEPROM 中PGM-代码)

    现在,在 LED 面板上打印字符的算法非常依赖于您的硬件实现

    • 请发布LED面板与控制系统之间的互连电路图
    • 指定目标平台和语言
    • 指定所需的功能

    我假设你想要按像素步骤左移动滚动

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

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

      • 00000000b, 00001000b, 00011000b, 00101000b, 00001000b, 00001000b, 00111100b, 00000000b,
      • address = (8*ASCII + x_offset)发送到数据IO 端口
      • 使用正确的位激活选择IO 端口
      • 等待一段时间(1-10ms)...所以如果延迟太短,你实际上可以看到灯光,如果延迟太长则没有亮度然后闪烁,所以你需要实验一点(取决于选择位数。)。
      • 停用选择IO 端口
      • 重复下一栏
      • font[8*ASCII + x_offset]是滚动转移
    2. 如果您的硬件实施方式不合适,请不要担心

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

    3. 希望它有助于痘痘

答案 1 :(得分:0)

您可以尝试找到一种看起来像您想要的字体(可能是等宽字体,如Courier),使用一定大小(8pt?)绘制/栅格化它,没有消除锯齿,并将生成的图像转换为你的矩阵格式。