查看: 104|回复: 0

关于单片机的字库设计

[复制链接]

主题

好友

1091

积分

进士

  • TA的每日心情
    开心
    2018-5-29 13:21
  • 签到天数: 78 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2014-10-25 21:20:26 |显示全部楼层
    当需要液晶显示的时候,汉字的显示一直不是那么方便(在没有*字库的情况下)。
    如果纯粹取模的话,就要考虑自作一个字库需要花费的时间和占用的flash资源。对于UCOS
    来说,就像楼主使用的破开发板,只有256Kflash,一个16*16 GB点阵字库就要占用200K+,
    自然是不可能放入用户源码的。于是乎,楼主开始使用*字库,关于*字库碰到的一些问题
    在这里给大家简单说说,有用的话的就给楼主赞一个,哈哈哈
        1.关于GB2312,自己百度https://baike.baidu.com/view/443268.htm?from_id=483170&type=
    syn&fromtitle=GB2312&fr=aladdin 也有GBK等的介绍
        2.字库一般选用flash器件,采用SPI协议通信,通常4兆的片子足够使用常用字库的存储。
        3,自制字库,最后会放上楼主曾用过的资源。纤细过程(加一些格式,好看得清楚,哈哈哈):
    第一步,当然需要你将你所用的SPIflasn的初始化以及读写函数写好(我使用的W25X16,2M,传输
    速率最大74MHZ,很快的;
    写函数:void W25X_Write_Bytes(uint32_t addr,u8* pBuffer, u16 nBytes) 注:W25X16写时,
    需要先擦除。
    读函数:void W25X_Read_Bytes(uint32_t addr, u8* pBuffer, u16 nBytes)
    第二步,编写串口传输函数,采用串口中断的方式,波特率设置为115200(测试没有问题),
    接收外部输入的一个字节后立马将其写入SPI FLASH。与之前两个字符表示一个字节的方法速
    度提升
    一倍。
    代码:
    u8 result;
    u32 pAddr=0;
    void USART1_IRQHandler(void)
    {
         if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)     
         {
                result = USART_ReceiveData(USART1);     
                W25X_Write_Bytes(pAddr++,&result,1);
                USART_ClearITPendingBit(USART1, USART_IT_RXNE);   // 清除串口接受中断
         }
    }
    第三步,设置一个按键进行擦除操作,通过串口或者LCD进行交互,以提示是否擦除完成。
    可以进行写FLASH。
    第四步,制作中文字库,GB3212库包含6768个简体中文,首先打开“取点阵.exe”软件,
    然后在软件中打开“字符库.txt”文件。

    然后选择取模方式,可以设置字体样式、大小和方向设置等。注意“方向设置“选项,
    这里为了对应工程中的显示程序,选择——横向取模,高位在坐。其它选项只要适
    当修改显示程序就可以。

    然后点击“输出“按钮,将在该目录下得到字模数组文件(temp.txt)。
    第五步,整理字库文件。上一步得到的字模数组文件还不能直接使用,
    需要进行整理以适合串口发送,去除各种注释符和标点字符,只保留
    两位字符组成的十六进制格式。接着将“temp.txt”改名为“HzLib.txt”,
    然后运行“整理字库.exe”,此时将得到整理好的字库“OutHzLib.txt”然
    后就可以直接将该字库通过串口发送到MCU了。

    第六步,串口发送数据。推荐用附件中的串口调试软件,因为有些软
    件在对于文件发送这个功能做得似乎有些问题。本人也测试了两款串
    口调试软件,均不能得到结果,如果有其它好的也可以,反正只要达
    到目的就行。设置串口参数,然后在发送区设置中勾选“按十六进制
    发送”,点击“启动文件数据原”选项,选择制作好的字库“OutHzLib.txt”,
    不要点击“文件载入”。

    第七步,打开串口,将板子接通电源,首先对Flash进行擦除操作,
    提示擦除结束后,点击串口发送,然后就慢慢等着字库写入FLASH。
    测试在波特率为115200下,取模大小为16*16,耗时为70s,似乎
    也不太久,如果取模越大,耗时就越长。写好字模后,就可以在工
    程中调用字库进行中文显示了(取GBK内码操作见工程)。另外如
    果flash容量够大的话,还可以写入其它字体样式和大小的字库,做
    一个专属的字库芯片。
        4.X宝一个片子,经济实惠,随拿随用。
        做好了字库,就剩下怎样使用了
        1.建议使用总线型SPI,速率绝对有保障。具体代码看各自的板子了。
        2.如果使用软件SPI,送一段:
    #define MOSI_H GPIO_SetBits(GPIOA, GPIO_Pin_5) #define MOSI_L GPIO_ResetBits(GPIOA, GPIO_Pin_5) #define SCLK_H GPIO_SetBits(GPIOA, GPIO_Pin_7) #define SCLK_L GPIO_ResetBits(GPIOA, GPIO_Pin_7) #define MISO_H GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)  void spi_init(void) {         CE_25_1;         MOSI_H;         MISO_H;          SCLK_H; }  unsigned char SPI_SendByte(unsigned char dt) {         u8 i;         u8 temp=0;         for(i=8;i>0;i--)         {                 if(dt&0x80)MOSI_H;                 else MOSI_L;                 SCLK_L;                 SCLK_H;                                 temp<<=1;                 dt<<=1;                 if(MISO_H) temp++;                                  }         return temp; }       其实对于论坛的大多数大牛,这点东西可能都不会看,不过总用人会碰到这样的问题。 在一步步深入嵌入式的过程中,希望会对需要的朋友一点帮助。
    回复

    使用道具 举报

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

    关闭

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

    手机版|电路城

    GMT+8, 2019-7-20 01:37 , Processed in 0.143553 second(s), 14 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz!

    返回顶部