⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 source.txt

📁   在某些产品的显示部分[如点真LED,液晶屏等]往往都要显示汉字
💻 TXT
字号:
  在某些产品的显示部分(如点真LED,液晶屏等)往往都要显示汉字,而字库是这类产品系统中必不可少的,最近我也用到了字库这部分,在这里把我的心得和整理的资料分享下.

  GB18030字库是一个相对比较全的字库,大小不超过1M字节.本人存储器用的是29c040(两片),对29C040的读操作非常简单,类似于SRAM。主要是怎么样通过汉字的汉字代码找到汉字在存储器中的位置。GB18030每个汉字在存储器中占32字节,这样通过汉字代码算出偏移量,通过偏移量找到汉字在存储器中的位置。下面给出一个比较通用的计算偏移量的程序:

//-----------------------------------------------
//提取字库函数
//----------------------------------------------
unsigned long font_get_bmp_15_16(uchar  p_1, uchar p_2)
{
    unsigned char c1 = (unsigned char)p_1;
    unsigned char c2 = (unsigned char)p_2;

    unsigned long len = -1;

 const ulong  i_32 =32;
    if (c1 >= 0xb0 && c2 >= 0xa1)   
    {
        len = ((c1 - 0xb0) * 94 + (c2 - 0xa1)) * i_32;
    }

    if (c1 > 0x80 && c1 < 0xa1 && c2 >= 0x40)       {
        //len = ((c1 - 0x81) * 190 + (c2 - 0x40)) * i_32 + 6768 * i_32;
         
        len = ((c1 - 0x81) * 190 + (c2 - 0x40)) * i_32 + 6768 * i_32;
  if(c2>0x7e)  len-=i_32;
    }

    if (c1 >= 0xaa && c2 >= 0x40 && c2 < 0xa1)     {
       len = ((c1 - 0xaa) * 96 + (c2 - 0x40)) * i_32 + (6768 + 6080) * i_32;
       if(c2>0x7e)  len-=i_32;
    }

    if (len >= 0)
        return len; 

   /* if (c1 >= 0xa1 && c1 <= 0xa9 && c2 >= 0xa0)//0xa1  
        len = ((c1 - 0xa1) * 94 + (c2 - 0xa1)) * 32;
    if (c1 >= 0xa8 && c1 <= 0xa9 && c2 >= 0x40 && c2 <= 0xa0)  
        len = ((c1 - 0xa8) * 94 + (c2 - 0x40)) * 32 + 846 * 32;

    if (len >= 0)
        return len;*/
}

  以上程序是我在8位51单片机上写的,如果移植用注意变量INT型等的长度。函数内注释的部分也是用得到的,最好能通过GB18030资料弄清以上程序,这样提取字库才不会出问题.上面的函数是按照字库中汉字的顺序存储在存储器中的情况编写的,有些时候为了提取或是使用方便,也可将字库处理后再存储.

  总的说:提取字库就是一个通过汉字代码算出偏移量,通过偏移量找到汉字在存储器位置的过程.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -