打印

MSP-EXP430F5529显示汉字(使用字库)(转)

[复制链接]
2033|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cgd|  楼主 | 2014-6-2 18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 cgd 于 2014-6-2 19:01 编辑

一般不带字库的LCD屏显示汉字无疑是首先获得汉字的字模数据,然后根据字模在液晶上显示出来。
通常有两种方法,一种方法是把字模放在源程序中,也就是存在单片机的flash中(通常情况下);此种方法的优点是不需要额外的器件,缺点是存储数据量有限,生成字模数组比较麻烦,且不灵活。
另一种方法就是把字模数据(字库)存在大容量存储器中(SD卡,flash等),在需要显示的时候去存储器中查找。此方法优点是灵活性强,通常可以显示任意字符。缺点是需要大容量存储器,硬件成本高。

由于MSP-EXP430F5529评估板具有SD卡存储器,所以采用第二种方法来做个显示示例。
我们常用的简体字符集为GB2312字符集,附编码表:
附字库:
见附件。
汉字编码对应字库中起始地址的关系为:
offset =(字模所占字节数)*((HighByte-0xA1)*0x5E + (LowByte-0xA1));

示例代码(在MSP-EXP430F5529自带例程中添加):
  • ...
  •     f_mount(0, &fatfs);
  •     Dogs102x6_chineseDraw(0, 0, "床前明月光,");
  •     Dogs102x6_chineseDraw(1, 0, "疑是地上霜。");
  •     Dogs102x6_chineseDraw(2, 0, "举头望明月,");
  •     Dogs102x6_chineseDraw(3, 0, "低头思故乡。");
  •     while(1);
  • ...

复制代码

  • <P>void convert_buffer32(unsigned char *buffer);</P>
  • <P>void Dogs102x6_chineseDraw(int raw, int col, unsigned char* buffer)
  • {
  •     //打开字库文件
  •     FRESULT rc;
  •     FIL zkFile;
  •     DWORD offset=0, hi, lo;
  •     UINT len;
  •     unsigned i;
  •     unsigned char font[32];
  •     raw *= 2;
  •     rc = f_open (&zkFile, "st16.DZK", FA_READ);
  •     if (rc != FR_OK)
  •         return;
  •     while (*buffer)
  •     {
  •         hi = (DWORD)*buffer++;
  •         lo = (DWORD)*buffer++;
  •         if (hi < 0xA1U || lo < 0xA1U)
  •             break;
  •         offset = ((hi-0xA1U)*0x5EU+(lo-0xA1U))*(16*16/8);
  •         rc = f_lseek (&zkFile, offset);
  •         if (rc != FR_OK)
  •             break;
  •         rc = f_read (&zkFile, font, 32, &len);
  •         if (rc != FR_OK || len != 32)
  •             break;
  •         convert_buffer32(font);
  •         Dogs102x6_setAddress(raw, col);
  •         Dogs102x6_writeData(&font[0], 16);
  •         Dogs102x6_setAddress(raw+1, col);
  •         Dogs102x6_writeData(&font[16], 16);
  •         col+=16;
  •     }
  •     rc = f_close(&zkFile);
  •     if (rc != FR_OK)
  •         while(1);
  • }</P>
  • <P>
  • /*
  •                 [MSB .......... LSB]
  • byte[0][1]
  • byte[2][3]
  • byte[4][5]
  • byte[6][7]
  • byte[8][9]
  • byte[10][11]
  • .
  • .
  • .
  • .
  • */
  • void convert_buffer32(unsigned char *buffer)
  • {
  •     unsigned char temp[32];
  •     unsigned char shift;
  •     int i, j;
  •     for(i=0; i<32; i++) temp = 0;
  •     shift = 0x80;
  •     for(i=0; i<8; i++)
  •     {
  •         for(j=0; j<16; j+=2)
  •         {
  •             temp <<= 1;
  •             if (buffer[j]&shift)
  •                 temp |= 0x01;
  •             temp[8+i] <<= 1;
  •             if (buffer[j+1]&shift)
  •                 temp[8+i] |= 0x01;
  •             temp[16+i] <<= 1;
  •             if (buffer[16+j]&shift)
  •                 temp[16+i] |= 0x01;
  •             temp[24+i] <<= 1;
  •             if (buffer[16+j+1]&shift)
  •                 temp[24+i] |= 0x01;
  •         }
  •         shift >>= 1;
  •     }
  •     memcpy(buffer, temp, 32);
  • }</P>


复制代码

附图片一张:

图片.png (1.52 MB )

图片.png

字库显示程序.zip

1.53 MB

字库.rar

950.77 KB

相关帖子

沙发
cgd|  楼主 | 2014-6-2 18:58 | 只看该作者
字库文件st16.DZK拷贝在SD卡的根目录即可。

使用特权

评论回复
板凳
dirtwillfly| | 2014-6-2 20:05 | 只看该作者
谢谢分享

使用特权

评论回复
地板
hxfxt| | 2014-6-2 21:49 | 只看该作者
似曾相识的**!

使用特权

评论回复
5
Thinox| | 2014-9-3 09:55 | 只看该作者
还有带字库的OLED显示屏

0.96‘ OLED模块使用说明.pdf

371.77 KB

可选择带字库

使用特权

评论回复
6
数码小叶| | 2014-9-4 14:23 | 只看该作者
谢谢分享,学习学习。。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

cgd
个人签名:

80

主题

7495

帖子

16

粉丝