【问题标题】:How to convert from alphabets to pixels如何从字母转换为像素
【发布时间】:2016-04-04 16:33:38
【问题描述】:

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

请告诉我一种创建这种矩阵的方法,而不是手动输入
谢谢。

【问题讨论】:

    标签: string matrix character pixelate


    【解决方案1】:

    唯一的解决办法是使用字体。

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

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

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

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

      由于抗锯齿和过滤器,请勿与字体颜色进行比较。现在读取字体表中的所有字符并设置/重新设置相应的位。首先计算图像中字符的开始 x,y(来自 ASCII 代码和图像组织)然后执行 2 个嵌套的 8 步 x,y for 循环(按照您的 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访问而不是设置/解析单个 IO 线它更快并且可以防止闪烁

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

    现在是有趣的部分

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

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

    OK(行虎钳|从左到右|从上到下)组织方式:

    • 第一个数字在字符的最上方
    • msb 是最左边的像素
    • lsb 是最右边的像素

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

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

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

    现在在 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 操作在内存中创建数据字,然后以类似方式发送它们

    希望对你有帮助

    【讨论】:

    • 哦,如果您的内存不足,您可以只使用字母和数字...忘记特殊字符,这样您将拥有更少的字体数据,但是您的字符串编码必须与您的字体匹配。 .. 或跳过前 32 个字符和后 128 个字符,这样可以节省一半以上的内存
    • @user1776194 我可以看到您尚未检查任何答案...如果您的问题的任何答案有帮助,您可以投票(我不确定您是否可以立即投票或需要一些代表)通过投票数上方的那个小三角形,如果它是错误的,辱骂性的......那么你可以通过那个三角形来投票反对相同的数字。如果答案可以解决您的问题,您应该通过单击投票三角形下方的复选标志来检查它。它将向答案作者奖励代表点数,并将您的问题标记为已回答。 (我也认为你会获得一些徽章,比如接受的第一个答案)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 2023-01-31
      • 2020-01-03
      相关资源
      最近更新 更多