【发布时间】:2016-04-04 16:33:38
【问题描述】:
您知道将字母转换为代表字母的矩阵(由 0 和 1 组成)的程序或脚本吗? 例如,从字母 I 到这样的矩阵:(这是一个显示字母 I 的 LED 面板):
请告诉我一种创建这种矩阵的方法,而不是手动输入
谢谢。
【问题讨论】:
标签: string matrix character pixelate
您知道将字母转换为代表字母的矩阵(由 0 和 1 组成)的程序或脚本吗? 例如,从字母 I 到这样的矩阵:(这是一个显示字母 I 的 LED 面板):
请告诉我一种创建这种矩阵的方法,而不是手动输入
谢谢。
【问题讨论】:
标签: string matrix character pixelate
唯一的解决办法是使用字体。
对于硬件实现我通常使用 EGA/VGA 8x8 字体
从gfx卡BIOS中提取,您可以在MS-DOS环境中轻松完成
另一种方法是从图像中以编程方式提取字体
将整个字体绘制到位图(在线或矩阵中......,或使用一些已经创建的像我的)。使用固定间距,字体大小最适合您的需要,不要忘记几乎没有现代字体支持固定间距,因此请使用 OEM_CHARSET 和 System 命名字体。正确设置颜色(理想的是黑色背景和白色字体)并逐像素读取图像并将其存储为数字表。没有背景颜色的像素被设置为像素。
由于抗锯齿和过滤器,请勿与字体颜色进行比较。现在读取字体表中的所有字符并设置/重新设置相应的位。首先计算图像中字符的开始 x,y(来自 ASCII 代码和图像组织)然后执行 2 个嵌套的 8 步 x,y for 循环(按照您的 font[] 组织顺序)
set/res对应font[]地址8*ASCII到8*ASCII+8的位
我假设您使用 MCU 来控制 LED 面板
内存中的字体组织通常是8位数字代表字符中的单行。当然,如果您的 LED 面板是用来显示动画滚动的,那么字体的列组织以及硬件实现会大大简化事情。如果您有 16 位 MCU 和 IO 访问权限,则可以使用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(行虎钳|从左到右|从上到下)组织方式:
所以例如8x8 中的char '1' 将是这样的(b 表示二进制数):
00000000b,
00001000b,
00011000b,
00101000b,
00001000b,
00001000b,
00111100b,
00000000b,
当您将所有字符提取到字体表中,然后将其作为源代码保存到文件中,您稍后将包含在您的 MCU 代码中(可以放在 EEPROM 中pgm代码)
现在在 LED 面板上打印字符的算法很大程度上取决于您的硬件实现
我假设您希望以像素为单位向左移动滚动
如果您的 LED 面板由列而不是行驱动,则最合适
您可以通过一些数据IO端口激活单列LED(所有位都可以同时激活),选择哪一列激活由另一个选择 IO 端口(一次只能激活一个位)。所以在这种情况下计算要在字体表中显示的列的起始地址:
address = (8*ASCII + x_offset)font[8*ASCII + x_offset]到数据IO端口x_offset 是滚动移位如果您的硬件实现不适合这种方式,请不要担心
只需使用位 SHIFT、AND、OR 操作在内存中创建数据字,然后以类似方式发送它们
希望对你有帮助
【讨论】:
您可以尝试找到一种看起来像您想要的字体(可能是等宽字体,例如 Courier),以特定大小(8pt?)绘制/光栅化它,而不使用抗锯齿,然后将生成的图像转换为你的矩阵格式。
【讨论】: