爱板网论坛

查看: 132|回复: 0

[原创] 独特的FireBeetle 点阵屏字库构造

[复制链接]

105

主题

9

好友

1151

积分

进士

Rank: 5Rank: 5

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 567 天

    连续签到: 8 天

    [LV.9]以坛为家II

    爱板会员勋章 活跃会员勋章

    发表于 2017-12-31 10:23:31 |显示全部楼层
    要在点阵屏上显示字符信息就必须为其提供相应的字库,对于FireBeetle 点阵屏来说它的字库构造是较为独特的。一般来说字库分为2类,一类是点阵式字库,另一类是矢量字库。就微控器来讲多是采用点阵字库,FireBeetle 点阵屏的字库也属点阵字库,其结构如下:
    const byte FONT_5X4 [] PROGMEM = {
    0b00000000, //
    0b11101000, // !
    0b11000000, 0b00000000, 0b11000000, // "
    0b01010000, 0b11111000, 0b01010000, 0b11111000, 0b01010000, // #
    0b00000000, 0b00000000, 0b00000000, 0b00000000, // $
    0b11001000, 0b11010000, 0b00100000, 0b01011000, 0b10011000, // %
    0b01010000, 0b10101000, 0b10011000, 0b01011000, // &
    0b11000000, // '
    。。。
    0b10000001, 0b11111111, // ]
    0b01000000, 0b10000000, 0b01000000, // ^
    0b00000001, 0b00000001, 0b00000001, 0b00000001, // _
    };
    下面是常规的点阵字库,对比一下是否差别很大。
    const unsigned char font6x8[][6] =
    {
        { 0x00, 0x00, 0x00,0x00, 0x00, 0x00 },   // sp
        { 0x00, 0x00, 0x00,0x2f, 0x00, 0x00 },   // !
        { 0x00, 0x00, 0x07,0x00, 0x07, 0x00 },   // "
        { 0x00, 0x14, 0x7f,0x14, 0x7f, 0x14 },   // #
        { 0x00, 0x24, 0x2a,0x7f, 0x2a, 0x12 },   // $
        { 0x00, 0x62, 0x64,0x08, 0x13, 0x23 },   // %
        。。。
        { 0x00, 0x1C, 0xA0,0xA0, 0xA0, 0x7C },   // y
        { 0x00, 0x44, 0x64,0x54, 0x4C, 0x44 },   // z
        { 0x14, 0x14, 0x14,0x14, 0x14, 0x14 }    // horiz lines
    };
    经分析才发现FireBeetle 点阵屏的字库是一种压缩型点阵字库,它在使用时还要配合相应的参数来工作,其形式如下:
    intFONT_5X4_END [] = {
    1,2, 5, 10, 14, 19, 23, 24,
    26,28, 31, 36, 38, 41, 42, 46,
    49,52, 56, 59, 63, 66, 70, 74,
    78,82, 83, 85, 88, 91, 94, 98,
    103,107, 110, 114, 117, 120, 123, 127,
    131,134, 137, 141, 144, 149, 154, 158,
    161,166, 169, 173, 176, 180, 185, 190,
    193,196, 200, 202, 206, 208, 211, 214
    };
    5*4的点阵字符库为例,其一个字符通常要占用4个字节。但对于一些字符来说,其需要点亮的点阵却很少,以较少的字节就可显示出该字符。例如“!”的关键字节只需一个字节,其内容为0b11101000
    显示的形式为:
    *     
    *     
    *     
          
    *     
    而对于笔画较复杂的字符,则需要较多的字节来表示,如“#”就需要5个字节,其内容如下:
    0b01010000, 0b11111000, 0b01010000, 0b11111000, 0b01010000
    显示的形式为:
    *  *     
    * * * * *   
    *  *     
    * * * * *   
    *  *     
    因而在FireBeetle 点阵屏的字库中只存储关键的字节,对于为零的字节则不予存储。为了在显示过程中,明确要读取的字节数,就需借助辅助参数来解决。
    以数组FONT_5X4_END [] = {1,2, 5, 10, 14, 19, 23, 24,。。。}为例,其第一个字符占1个字节,第二个字符占1个字节(2-1),第三个字符占3个字节(5-2),第四个字符占5个字节(10-5)。这便是FireBeetle 点阵屏的压缩型字库结构和显示原理,在编写相应程序的情况下即可显示字符的再现。
    通过程序的分析可知,FireBeetle点阵屏提供了FONT_5X464个字符)和FONT_8X464个字符)两种字符库,若想实现汉字的显示,仿此结构构建相应的字库及显示函数也是可行的。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /2 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2018-1-22 18:23 , Processed in 0.482103 second(s), 10 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部