单片机字库有多少_单片机字库 - CSDN
  • 单片机字库建立

    2017-06-28 20:25:08
    单片机搭配的显示器,12864、TFT、OLED等。在有些系统中,我们需要显示汉字,可以购买汉字芯片,或者购买带汉字显示的显示器,当然,也可以自己做字库。 这里我们介绍一种自己做字库的方法,成本2元人民

    本文转载自://www.rationmcu.com/elecjc/356.html


    学完这篇文章,你将会使你的单片机显示系统中加入中文显示的功能。

    1.导言

    和单片机搭配的显示器,有12864、TFT、OLED等。在有些系统中,我们需要显示汉字,可以购买汉字芯片,或者购买带汉字显示的显示器,当然,也可以自己做字库。

    这里我们介绍一种自己做字库的方法,成本2元人民币左右。

    2.汉字显示原理

    看原理需要知道什么是像素:像素是液晶屏的最小单位,看你的手机屏幕或者电脑屏幕,他们实际上是由一个一个的正方形组成的,如果你的电脑或手机屏幕分辨率太高,不容易看到,需要借助放大镜,分辨率低的话,仔细一看就看见了,都是由一个一个的正方形组成的,这里面的一个正方形,就是1个像素。例如,12864屏幕就是128像素*64像素的屏幕,即横着有12864个正方形,竖着有64个正方形。

    12864放大

    上图是12864屏幕的一角,请你仔细看看,是不是一个一个的正方形组成?

    比128*64大的分辨率是320*240,还有800*600,1024*768,1280*720等,总之,分辨率越大,人的肉眼就越但不见它是由一个一个小正方形组成的。所以现在的手机屏幕是越来越高,当你用惯一个分辨率极高的手机,再去用你原来分辨率极低的手机,你就会发现原来的那个手机真是很模糊!

    讲完了像素的概念,下面开始讲汉字显示的原理:

    现在流行的汉字字库有两种,一种是GB2312、一种是GBK。这是两种不同的编码约定。

    • GB2312有六千多个汉字,是一些常用的汉字
    • GBK有2万多个汉字,包含所有的GB2312汉字,包含整个中国的汉字

    假如我们想在液晶显示器上显示一个16*16像素大小的汉字“瑞”,怎么办呢?先看一下“瑞”字在液晶显示器上被放大的效果:

    瑞

    上面的这个瑞即是16*16像素大小的字体,你可以数一下上面的像素点。你可以看一下,在上面“亮”的地方用“写点函数”写成和其它点不同的颜色,不就可以了吗!按照这个思想,我们就需要采用一种有效的办法了。从上面图像的右上角开始扫描,每行有16个点,即可以用两个字节来表示,“暗”的地方用0表示,亮的地方用1表示,那么第一行就可以写成十六进制的0020,以此类推,可以得出第二行,第三行的字节码,如此一来,一个汉字就需要32个字节来表示。搞好了汉字的这些码,在程序中给TFT开个16*16大小的区域,然后开始扫描这些字节,遇到0,写背景色,遇到1,写定义的颜色。汉字显示就是如此了。

    3.为什么显示英文一般不用字库芯片?

    英文的单词都是由26个字母构成了,加上大小写的区别和一些字符,也不过才95个。假如要显示8*16像素大小的字符,每一个字符需要16个字节的字库空间,95个字符即是95*16=570个字节。即占用570个字节的RAM。对于LPC1114的8K字节RAM来说,搓搓有余了。

    4.为什么显示中文需要字库芯片?

    显示中文的话,必须需要每一个字的字模,16*16像素大小的中文,每一个中文都要32个字节。GBK收录了中文两万多个,如果要都能显示,需要700多K字节的空间。

    所以,我们选择了把这些字库放在外部存储器当中,我们选择了2M的FLASH存储芯片W25Q16做为存储媒介。放个700多K的字库足够了,如果你愿意,同时放两种字体的字库都没问题。

    5.如何把GBK字库做成字模?(此部分做字模参考阿莫论坛一帖子,非瑞生原创,特此感谢分享者)

    5.1需要准备的文件和软件

    • 取模软件
    • GBK字库
    • 二进制文件生成工具

    点此下载:GBK字库制作软件和文件

    5.2开始制作

    取模软件

    在工具栏处点“打开”按钮,打开gbk_ziku.txt文件,然后根据自己的需要,设置想要的取模方式,然后点工具栏上的“输出”按钮 并等待其完成,完成后会在取模软件所在路径生成了一个temp.txt文件,修改这个文件名,比如现在我是按照“宋体、点阵数为16、字重为4、取模为为16*16、对齐设置为左上、方向设置为横向取模,高位在左”的方式来取的字模,也就是我平时TFT常用的一种字模,改文件名为st16x16.txt 。

    为了生成的方便,我们在D盘根目录下新建一个文件夹,名称就叫ziku吧,然后,把ziku.exe 和 st16x16.txt复制一份到这个文件夹里。

    打开自己计算机的命令窗口:“开始”->“运行”->“cmd”,如下图所示:

    命令1

    然后用cd命令进入到我们刚刚建的ziku文件夹下,输入命令如下图所示:

    命令2

    输入命令,生成字库文件,如下图所示:

    命令3

    回车,然后程序会在ziku文件夹下生成一个名称固定为ziku.bin的字库文件

    命令4

    为了区分,把这个字库文件修改名称为st16x16.bin 。

    到此,字库已经制作完成。

    6.如何把做好的GBK字库字模存储到W25Q16中?

    硬件:电脑串口—单片机—W25Q16

    程序:单片机与电脑采用串口连接,单片机与W25Q16采用SPI方式连接。所以,我们只需要给单片机写一个接收串口数据再把数据通过SPI口传输到W25Q16中的程序即可。

    下面的视频是瑞生LPC1114开发板下载GBK字库的演示:(支持超清模式观看)

    轻松制作与使用中文字库(第一集) 

    轻松制作与使用中文字库(第二集)

     

    7.单片机如何读取W25Q16中的字模并显示在液晶屏上?

    假设我们的GBK字模是从W25Q16地址中的0x100开始存储的,那么,从0x100地址开始,单片机读取32个字节,就是GBK字库的第一个字“丂”的字模,再读32个字节,就是GBK字库第二个字“丄”的字模。(有人会问,你是怎么知道GBK字库第几个字是什么的?答:你把上文中5.1节提到的文件下载后,打开GBK字库,就看见了。)根据上文中第2步讲的原理,字模中,遇到0就给LCD的1个像素画一个颜色,遇到1就给LCD的下一个像素画不同的颜色,把32个字节都捋一遍,一个汉字就显示在LCD上了。

    如果我们想要显示汉字“瑞”,我们该从W25Q16中的哪个字节开始提取它的字模呢?这时候,就需要知道字符存储编码的原理了。

    字符编码原理:英文字母带各种符号等共有95个,都有自己的ascii码,一个字母或者符号就是一个ascii码。汉字以及汉字的符号是需要2个字节来存储,在keil等主流编译器中,一般都是以GBK编码方式存储。

    GBK编码:每个GBK码由2个字节组成,第一个字节为0X81~0XFE,第二个字节分为两部分,一是0X40~0X7E,二是0X80~0XFE。例如汉字“瑞”的GBK编码为C8F0,第一字节C8,位于0X81~0XFE之间,第二字节F0,位于0X40~0XFE之间。第一个字节代表的意义称为区,那么GBK里面总共有126个区(0XFE-0X81+1=126);第二个字节代表的意义就是每个区内有多少个汉字,算了一下,一共有190个(0XFE-0X80+0X7E-0X40+2=190)。那么,GBK一共存储了126X190=23940个汉字。

    我们仔细看GBK编码第二个字节两部分,0X40~0X7E0X80~0XFE,也就是说它是从0X40~到0XFF,中间的0x7F和最后的0xFF没有用到。但是为了能够线性查找,我们暂且认为这两个字节也存在,就是我们强制把每个区190个汉字当做每个区192个汉字,不过0X7F和0XFF上没有汉字。

    定义GBKH代表第一个字节,GBKL代表第二个字节,字库的偏移量offset,放入W25Q16的字库从0x100地址开始存储,那么获取某个汉字的字模的函数就可以写成:

    voidGet_GBK_DZK(uint8_t *code, uint8_t *dz_data) {    
    uint8_tGBKH,GBKL;                   
    uint32_toffset;            
    GBKH=*code;   
    GBKL=*(code+1);        
    if(GBKH>0XFE||GBKH<0X81)return;   
    GBKH-=0x81;   
    GBKL-=0x40;   
    offset=((uint32_t)192*GBKH+GBKL)*32;   
    W25Q16_Read(dz_data,offset+0x100,32);             
    return; 
    }

    函数中,参数*code带入汉字的两字节编码,*dz_data是一个32个字节的数据,带入函数中,就可以得到任何一个汉字的字模了。例如:

        uint8_t buf[32];    Get_GBK_DZK("瑞", buf);
    展开全文
  • 单片机字库

    2019-07-26 20:45:49
    单片机中常用字库进行oled进行显示。但是怎么显示自己想要的字库呢? 可以先下载http://www.pc6.com/softview/SoftView_101312.html添加链接描述 这个软件打开输入自己要的文字 点击取模格式C51和A51格式,看自己...

    单片机中常用字库进行oled进行显示。但是怎么显示自己想要的字库呢?
    可以先下载http://www.pc6.com/softview/SoftView_101312.html添加链接描述
    这个软件打开输入自己要的文字
    在这里插入图片描述
    点击取模格式有C51和A51格式,看自己需要的格式。
    在这里插入图片描述
    点击参数设计、其他选项、这里要看自己的显示屏如何设置,横向还是纵向、字写需不需要倒序。
    在这里插入图片描述
    点阵就生成咯,直接使用就可以了。

    展开全文
  • 单片机搭配的显示器,12864、TFT、OLED等。在有些系统中,我们需要显示汉字,可以购买汉字芯片,或者购买带汉字显示的显示器,当然,也可以自己做字库。 这里我们介绍一种自己做字库的方法,成本2元人民币左右...

    本文转自:http://www.rationmcu.com/elecjc/356.html

    学完这篇文章,你将会使你的单片机显示系统中加入中文显示的功能。

    1.导言

    和单片机搭配的显示器,有12864、TFT、OLED等。在有些系统中,我们需要显示汉字,可以购买汉字芯片,或者购买带汉字显示的显示器,当然,也可以自己做字库。

    这里我们介绍一种自己做字库的方法,成本2元人民币左右。

    2.汉字显示原理

    看原理需要知道什么是像素:像素是液晶屏的最小单位,看你的手机屏幕或者电脑屏幕,他们实际上是由一个一个的正方形组成的,如果你的电脑或手机屏幕分辨率太高,不容易看到,需要借助放大镜,分辨率低的话,仔细一看就看见了,都是由一个一个的正方形组成的,这里面的一个正方形,就是1个像素。例如,12864屏幕就是128像素*64像素的屏幕,即横着有12864个正方形,竖着有64个正方形。

    12864放大

    上图是12864屏幕的一角,请你仔细看看,是不是一个一个的正方形组成?

    比128*64大的分辨率是320*240,还有800*600,1024*768,1280*720等,总之,分辨率越大,人的肉眼就越但不见它是由一个一个小正方形组成的。所以现在的手机屏幕是越来越高,当你用惯一个分辨率极高的手机,再去用你原来分辨率极低的手机,你就会发现原来的那个手机真是很模糊!

    讲完了像素的概念,下面开始讲汉字显示的原理:

    现在流行的汉字字库有两种,一种是GB2312、一种是GBK。这是两种不同的编码约定。

    • GB2312有六千多个汉字,是一些常用的汉字
    • GBK有2万多个汉字,包含所有的GB2312汉字,包含整个中国的汉字

    假如我们想在液晶显示器上显示一个16*16像素大小的汉字“瑞”,怎么办呢?先看一下“瑞”字在液晶显示器上被放大的效果:

    瑞

    上面的这个瑞即是16*16像素大小的字体,你可以数一下上面的像素点。你可以看一下,在上面“亮”的地方用“写点函数”写成和其它点不同的颜色,不就可以了吗!按照这个思想,我们就需要采用一种有效的办法了。从上面图像的右上角开始扫描,每行有16个点,即可以用两个字节来表示,“暗”的地方用0表示,亮的地方用1表示,那么第一行就可以写成十六进制的00 20,以此类推,可以得出第二行,第三行的字节码,如此一来,一个汉字就需要32个字节来表示。搞好了汉字的这些码,在程序中给TFT开个16*16大小的区域,然后开始扫描这些字节,遇到0,写背景色,遇到1,写定义的颜色。汉字显示就是如此了。

    3.为什么显示英文一般不用字库芯片?

    英文的单词都是由26个字母构成了,加上大小写的区别和一些字符,也不过才95个。假如要显示8*16像素大小的字符,每一个字符需要16个字节的字库空间,95个字符即是95*16=570个字节。即占用570个字节的RAM。对于LPC1114的8K字节RAM来说,搓搓有余了。

    4.为什么显示中文需要字库芯片?

    显示中文的话,必须需要每一个字的字模,16*16像素大小的中文,每一个中文都要32个字节。GBK收录了中文两万多个,如果要都能显示,需要700多K字节的空间。

    所以,我们选择了把这些字库放在外部存储器当中,我们选择了2M的FLASH存储芯片W25Q16做为存储媒介。放个700多K的字库足够了,如果你愿意,同时放两种字体的字库都没问题。

    5.如何把GBK字库做成字模?(此部分做字模参考阿莫论坛一帖子,非瑞生原创,特此感谢分享者)

    5.1需要准备的文件和软件

    • 取模软件
    • GBK字库
    • 二进制文件生成工具

    点此下载:GBK字库制作软件和文件

    5.2开始制作

    取模软件

    在工具栏处点“打开”按钮,打开gbk_ziku.txt文件,然后根据自己的需要,设置想要的取模方式,然后点工具栏上的“输出”按钮 并等待其完成,完成后会在取模软件所在路径生成了一个temp.txt文件,修改这个文件名,比如现在我是按照“宋体、点阵数为16、字重为4、取模为为16*16、对齐设置为左上、方向设置为横向取模,高位在左”的方式来取的字模,也就是我平时TFT常用的一种字模,改文件名为st16x16.txt 。

    为了生成的方便,我们在D盘根目录下新建一个文件夹,名称就叫ziku吧,然后,把ziku.exe 和 st16x16.txt复制一份到这个文件夹里。

    打开自己计算机的命令窗口:“开始”->“运行”->“cmd”,如下图所示:

    命令1

    然后用cd命令进入到我们刚刚建的ziku文件夹下,输入命令如下图所示:

    命令2

    输入命令,生成字库文件,如下图所示:

    命令3

    回车,然后程序会在ziku文件夹下生成一个名称固定为ziku.bin的字库文件

    命令4

    为了区分,把这个字库文件修改名称为st16x16.bin 。

    到此,字库已经制作完成。

    6.如何把做好的GBK字库字模存储到W25Q16中?

    硬件:电脑串口—单片机—W25Q16

    程序:单片机与电脑采用串口连接,单片机与W25Q16采用SPI方式连接。所以,我们只需要给单片机写一个接收串口数据再把数据通过SPI口传输到W25Q16中的程序即可。

    7.单片机如何读取W25Q16中的字模并显示在液晶屏上?

    假设我们的GBK字模是从W25Q16地址中的0x100开始存储的,那么,从0x100地址开始,单片机读取32个字节,就是GBK字库的第一个字“丂”的字模,再读32个字节,就是GBK字库第二个字“丄”的字模。(有人会问,你是怎么知道GBK字库第几个字是什么的?答:你把上文中5.1节提到的文件下载后,打开GBK字库,就看见了。)根据上文中第2步讲的原理,字模中,遇到0就给LCD的1个像素画一个颜色,遇到1就给LCD的下一个像素画不同的颜色,把32个字节都捋一遍,一个汉字就显示在LCD上了。

    如果我们想要显示汉字“瑞”,我们该从W25Q16中的哪个字节开始提取它的字模呢?这时候,就需要知道字符存储编码的原理了。

    字符编码原理:英文字母带各种符号等共有95个,都有自己的ascii码,一个字母或者符号就是一个ascii码。汉字以及汉字的符号是需要2个字节来存储,在keil等主流编译器中,一般都是以GBK编码方式存储。

    GBK编码:每个GBK码由2个字节组成,第一个字节为0X81~0XFE,第二个字节分为两部分,一是0X40~0X7E,二是0X80~0XFE。例如汉字“瑞”的GBK编码为C8 F0,第一字节C8,位于0X81~0XFE之间,第二字节F0,位于0X40~0XFE之间。第一个字节代表的意义称为区,那么GBK里面总共有126个区(0XFE-0X81+1=126);第二个字节代表的意义就是每个区内有多少个汉字,算了一下,一共有190个(0XFE-0X80+0X7E-0X40+2=190)。那么,GBK一共存储了126X190=23940个汉字。

    我们仔细看GBK编码第二个字节两部分,0X40~0X7E 0X80~0XFE,也就是说它是从0X40~到0XFF,中间的0x7F和最后的0xFF没有用到。但是为了能够线性查找,我们暂且认为这两个字节也存在,就是我们强制把每个区190个汉字当做每个区192个汉字,不过0X7F和0XFF上没有汉字。

    定义GBKH代表第一个字节,GBKL代表第二个字节,字库的偏移量offset,放入W25Q16的字库从0x100地址开始存储,那么获取某个汉字的字模的函数就可以写成:

    void Get_GBK_DZK(uint8_t *code, uint8_t *dz_data)
    {
        uint8_t GBKH,GBKL;                 
        uint32_t offset;        
    
        GBKH=*code;
        GBKL=*(code+1);     
        if(GBKH>0XFE||GBKH<0X81)return;
        GBKH-=0x81;
        GBKL-=0x40;
        offset=((uint32_t)192*GBKH+GBKL)*32;
        W25Q16_Read(dz_data,offset+0x100,32);           
        return;
    }

    函数中,参数*code带入汉字的两字节编码,*dz_data是一个32个字节的数据,带入函数中,就可以得到任何一个汉字的字模了。例如:

        uint8_t buf[32];
        Get_GBK_DZK("瑞", buf);
    展开全文
  • *GB2312中文字库下载 单片机+C#代码 *描述 通过串口接收上位机发送的字库数据校验通过后写入外置flash
  • 单片机字库生成器

    2020-07-23 23:32:18
    一个汉字任意点阵字库制作软件,它的主要功能就是把windows用中使用的矢量的ASCII码和汉字转换为点阵的英文点阵字库和汉字点阵字库,可以随意使用您系统中所有可用的字体,并且可以从文档中提取各汉字生成自己的小...
  • 建立单片机汉字字库的传统方法使用硬件字库或者使用UCDOS的点阵字库。这些字库均非矢量字库,大小固定,字体单一,较大的局限性。且使用起来需要进行换算,比较麻烦。而Windows环境下提供了大量矢量字库,不但字...

    1 引 言

      单片机控制的LED、LCD显示屏均涉及到各种字体的汉字显示。建立单片机汉字字库的传统方法有使用硬件字库或者使用UCDOS的点阵字库。这些字库均非矢量字库,大小固定,字体单一,有较大的局限性。且使用起来需要进行换算,比较麻烦。而Windows环境下提供了大量矢量字库,不但字的大小可任意改变,而且字体多种多样,非常丰富,添加新的字库也比较容易。目前越来越多的显示屏需要显示美观多样的文字,因而利用好 Windows环境下丰富的矢量字库资源具有很高的实用价值。但矢量字库不同于点阵字库,且Windows操作系统本身很复杂,对利用其矢量字库带来一些困难。本文介绍一种巧妙的方法,绕过对矢量字库的直接读取,将各种复杂的操作全部交由Windows操作系统自己解决,用户仅需少量程序代码就能轻松使用 Windows环境下所有矢量字库资源。

    2 基本原理

      要使单片机能利用Windows的矢量字库,关键在于如何获得矢量字库的点阵信息。要在Windows环境下直接读取矢量字库获得其点阵信息,必须对Windows及矢量字库本身有深入的了解,操作起来较困难。但矢量字库最终仍是以点阵形式送给显示缓冲区,因而完全可以不直接读取字库,而从显示缓冲区中获得点阵信息,再通过一定的程序转化成单片机容易使用的点阵格式,从而达到目的。

    3 VB编程实现

    3.1 总体思路  

      利用CommonDialog控件,使用Windows环境下的标准字体选择对话框来选择字体。用一个TextBox控件来输入汉字,一个 PictureBox控件贮存屏幕上的汉字点阵信息。调用API函数BitBlt将TextBox中的汉字以位图形式重绘于PictureBox,再使用 Point函数得到其点阵信息,并将其转化成单片机容易使用的格式。

    3.2 具体实现

      新建一个工程,加入一个CommonDialog控件,一个TextBox控件,一个PictureBox控件,两个CommandButton控件。
      添入以下代码:
    '声明API函数BitBlt
    Private Declare Function BitBlt Lib"gdi32"

    (ByValhDestDC As Long,ByValx As Long,
    ByValy As Long,ByValnWidth As Long,ByVal nHeight

    As Long,ByVal hSrcDC As Long,ByVal xSrc As Long,

    ByValySrc As Long,ByValdwRop As Long)As Long'

    '初始化

    Private Sub Form_Load()

    Text1.Top=0:Text1.Left=0

    Text1.MaxLength=2:Text1.BorderStyle=0

    End Sub

    '修改字体

    Private Sub Command1_Click()

    '设置“取消”为True
    CommonDialog1.CancelError=True

    On Error GoTo ErrHandler

    '设置Flags属性
    CommonDialog1.Flags=cdlCFEffects or cdlCFBoth

    '显示“字体”对话框  

    CommonDialog1.ShowFont

    Text1.Font.Name=CommonDialog1.FontName

    Text1.Font.Size=CommonDialog1.FontSize

    Text1.Font.Bold=CommonDialog1.FontBold

    Text1.Font.Italic=CommonDialog1.FontItalic

    Picture1.Font.Size=CommonDialog1.FontSize
    Text1.Width=2*Picture1.TextWidth(Text1.Text)Text1.Height=Picture1.TextHeight(Text1.Text)

    Exit Sub
    ErrHandler:
    '用户按了“取消”按钮[page]

    Exit SubEnd Sub
    '生成字模
    Private Sub Command2_Click()

    Dim Wp()As Byte
    ReDim Wp(Picture1.TextWidth(Text1.Text)*

    Picture1.TextWidth(Text1.Text))As Byte

    Dim Nbyte,Q(7)As Integer

    Dim Cy,Cx As Integer

    Dim Dot As Integer

    Dim ZAs Long
    Dot=0:Nbyte=0

    BrightV=16000000
    Z=BitBlt(Picture1.hDC,0,0,300,300,Form1.hDC,1,1,&HCC0020)Picture1.Refresh
    For Cy=Picture1.TextHeight(Text1.Text)To 0 Step-1For Cx=Picture1.TextWidth(Text1.Text)To 0 Step-1

    Z=Picture1.Point(Cx,Cy)

    '得到该点的颜色信息

    If Z<BrightV Then 
        Q(Dot)=1'该点为黑

    Else

        Q(Dot)=0 '该点为白 
     End If
    If Dot=7 Then

       '将8个点的信息存入一个字节中 
      Wp(Nbyte)=Q(7)*128+Q(6)*64+Q(5)*32+Q(4)

    *16+Q(3)*8+Q(2)*4+Q(1)*2+Q(0)*1 

        Nbyte=Nbyte+1   

    End If 

        Dot=Dot+1 

      If Dot=8 Then Dot=0 
     Next Cx

    Next CyEnd Sub

      本程序一次得到两个汉字的点阵信息,存于字节数组WP中。

      由于大多数LED、LCD均为黑白二进制显示形式,没有灰度等级,而Windows环境,特别是Windows 2000的某些字库显示时有灰度变化,因而必须合理选择BrightV的值,才能使生成的点阵信息与屏幕所见的基本一致。本程序采用从右至左,从下到上的扫描方式生成字模,符合一般LED、LCD的显示扫描方式,有利于单片机的编程。

    4 结束语

      实践证明本文所介绍的方法能方便地得到Windows环境下矢量字库的字模,满足了单片机显示系统的需要。这种方法不但可以用来生成汉字字模,还可以用来生成各种图形点阵信息。只需将各种图片输入PictureBox即可,从而使单片机可以利用Windows中众多的图形制作软件,显示更加丰富多彩的图形画面。

    参考文献

    1 李玉东,李罡,李雷.VisualBasic 6.0中文版控件大全.北京:电子工业出版社,2000

    2 寿建霞.建立单片机系统汉字字库的一种通用方法.微型电脑应用,1999

    展开全文
  • 单片机读写字库

    2020-07-30 23:31:59
    单片机读写字库 并在led显示屏上显示 采用ss25f040芯片作为存储器
  • 用于单片机字库的生成。单片机点阵模块字库的生成。
  • 单片机字库生产软件

    2020-07-29 14:18:46
    做液晶显示字库生成器,功能比较全,使用很方便。找了好几个最终选了这个。
  • 生成的字库优点 可以完全自定义创建自己的字库: 可自由选择任何字体,宋体,楷体,黑体……可自定义字体的大小可自定义需要的字符编码(简体gb2312,gb18030,繁体,韩文,日文……)UNICODE支持价格便宜,买 ...
    此词库被应用于微信点餐系统的打印机中。
    打印输出结果

    生成的字库优点

    可以完全自定义创建自己的字库:
    • 可自由选择任何字体,宋体,楷体,黑体……
    • 可自定义字体的大小
    • 可自定义需要的字符编码(简体gb2312,gb18030,繁体,韩文,日文……)
    • UNICODE支持
    • 价格便宜,买 Flash ROM,自己写进 Flash ROM就可以了。

    创建字体库需要的软件

    Windows系统,安装 Python 2.7 和 PIL 库( Python Image Library),下载 Make ROM Font 工具
    打开 Windows 命令行,进入取下的代码目录,执行: c:\Python27\python.exe make_font.py -s 23 -c
    会在当前目录下产生 cn_font.bin 文件,将此文件烧录到 Flash ROM 中,安装下面的字库格式即可读取。
    • 如果要选择不同的字体,修改 make_chinese_font 中 font_file 指向对应的字体文件;
    • 如果要选择不同的字符编码,修改 make_chinese_font 中 get_glyph_set,添加新的编码;

    字库格式

    	The format of font.bin: [File Header][Glyphs Table][Glyphs Data]
    	File Header: 	BF [2 bytes]
    					VersionNumber [1 byte]
    					FontHeight [ 1 byte]
    					FontWidthMinimum [1 byte]
    					FontWidthMaximum [1 byte]
    					Glyph Count [2 bytes] 
    	Glyphs Table: 	[ data position[2 bytes], width [1 byte] ] x Glyph Count
    	Glyphs Data:	(Glyph data) x Actual Glyph count
    
    
    	GlyphDataSize: (FontWidthMaximum + 7) / 8 x FontHeight / 8
    

    字库使用

    初始化字体

    	/**
    	 * The font info.
    	 */
    	struct FontInfo
    	{
    		u32			offset;
    		u8			height;
    		u8			width_min;
    		u8			width_stride;
    		u8			glyph_data_size;
    		u16			glyph_count;
    	};
    
    	typedef unsigned short WCHAR;
    
    	int init_font(struct FontInfo *fontInfo)
    	{
    		u32 offset = fontInfo->offset;
    
    		// Not font format
    		if (FLASH_read_byte(offset + 0) != 'B' && FLASH_read_byte(offset + 1) != 'F')
    			return 0;
    
    		// Invalid font lib version.
    		if (FLASH_read_byte(offset + FL_OFFSET_VERSION) != FONT_LIB_VERSION)
    			return 0;
    		fontInfo->height = FLASH_read_byte(offset + FL_OFFSET_HEIGHT);
    		fontInfo->width_min = FLASH_read_byte(offset + FL_OFFSET_WIDTH_MIN);
    		u8 width_max = FLASH_read_byte(offset + FL_OFFSET_WIDTH_MAX);
    		fontInfo->width_stride = get_glyph_stride(width_max);
    		fontInfo->glyph_data_size = (((width_max + 7) / 8) * fontInfo->height); //(fontInfo->width_stride + 7) / 8;
    		fontInfo->glyph_count = FLASH_read_u16(offset + FL_OFFSET_GLYPH_COUNT);
    
    		return 1;
    	}
    

    寻址读字体

    在单片机程序中,通过下面的方式寻址读字体:
    	/**
    	 * Get the glyph by its UCS2 character encoding.
    	 *
    	 * If it does not exist, return a special glyph.
    	 */
    	void get_glyph(WCHAR ch, struct Glyph *glyph)
    	{
    		u32 pos = FL_OFFSET_GLYPH_TABLE + FONT_GLYPH_INFO_SIZE * (u32) ch;
    		u16 posHigh = FLASH_read_byte(pos);
    		u16 posLow = FLASH_read_byte(pos + 1);
    		glyph->width = FLASH_read_byte(pos + 2);
    		glyph->data_pos = (posHigh << 8) | posLow;
    	}
    
    	void get_glyph_data(struct FontInfo *fontInfo, struct Glyph *glyph, u8 offset, u8 data[MAX_GLYPH_STRIDE])
    	{
    		u32 FL_OFFSET_GLYPH_DATA = fontInfo->offset + FL_OFFSET_GLYPH_TABLE
    				+ fontInfo->glyph_count * (u32) FONT_GLYPH_INFO_SIZE;
    		u32 addr = FL_OFFSET_GLYPH_DATA + (u32) (glyph->data_pos) * fontInfo->glyph_data_size + offset;
    		FLASH_fast_read(data, addr, get_glyph_stride(glyph->width));
    	}
    


    展开全文
  • 各种字库,可以通过PC等先发给单片机存起来,然后调用,显示在点阵上。
  • 全部常用汉字16x16字库单片机编程用
  •   本文介绍如何把字库文件写入单片机的flash中,然后无需再提取字模,即可实现单片机显示中文字符的功能。 下载字库单片机flash中的指定位置   在上一篇博客中,最后留了一个想法,让单片机自带字库。现在就来...
  • 单片机 字库 stm32 少量汉字
  • 在许多单片机应用系统中,经常要用到汉字,以便进行输出显示,此时需要建立单片机的专用字库,而人工向单片机输入所需汉字是非常费时费力的工作。因此需要从大字库中分离出小字库,自我生成一个专用的小字库。  1. 汉字...
  • 12864中文字库C/H文件

    2020-07-17 17:51:13
    51单片机验证,12864中文字库串口程序
  • C51开发的单片机最小系统配合无字库12864液晶的时钟程序,仿真环境为proteus.具有日期时间显示,闹铃定时,时间/闹铃设置采用菜单形式.希望对单片机初学者有所帮助.
  • 如何用C51在单片机上使用24点阵字库,如何用C51在单片机上使用24点阵字库
  • 单片机+LCD12864带字库

    2020-07-28 23:30:34
    单片机控制LCD12864显示汉字和英文字符,可以拓展换行显示,翻页显示
  • 16X16点阵字库

    2020-07-21 10:00:34
    windows 自带的汉字点阵字库, 省得费时费力寻找了. 版权归微软所有, 免资源积分
1 2 3 4 5 ... 20
收藏数 1,177
精华内容 470
关键字:

单片机字库有多少