OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8031|回复: 13

看显示汉字实验有点晕,求帮助

[复制链接]

23

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2012-10-24
在线时间
0 小时
发表于 2012-11-29 10:03:22 | 显示全部楼层 |阅读模式
看了原子的显示汉字实验,有点地方不明白。
    SD卡把GBK字库和Unicode转GBK文件都转到SPIflash里面去了。存储的方式是GBK码。
              而编程时,数组存储中文字符串  例如   u8 temp[]={"你好呀"};    这里面的  你好吗  三个字是以什么码存储的呢?
        对于 void Show_Font(u8 x,u8 y,u8 *font,u8 size,u8 mode)  这个函数,是显示一个汉字的。
   这个函数的参数  *font   就是汉字的数据,可是这个参数表示的是GBK码的,应该不能把  temp 这个数组直接套进去用吧。事实上我也试了,显示出乱码。这样的话,怎么才能用 Show_Font 这个函数来显示 temp数组里面的汉字呢?不可能一遍遍的百度一个汉字的GBK内码,然后在写到一个数组中,再套用Show_Font函数吧?  
          而原子程序里面又有个Unicode码转GBK码的程序  void UniToGB(u8 *pbuf)。temp数组里面的 中文字符串 是不是就是Unicode码呢?
     如果是Unicode码的话,那就是要先调用  void UniToGB(temp) 这个函数,先把temp中的中文转换成GBK码
          然后再调用 Show_Font(0,0,temp,16,0)  这个函数,在 0,0坐标上显示中文吗?
       可是我这么实用,同样也显示异常。到底应该怎么,才能显示自己想显示的中文呢?

   感觉纠结我的地方就是各种码之间的转换情况,还有 编程时,数组中的  中文字符串 是以什么码的形式存储的,因为知道是什么码的形式存储的之后,就可以通过这个码转换GBK码,来使用 Show_Font这个函数了。
        自我感觉temp里面的中文是ascii码存储的,不知道对不对,唉......
 


               说的有点混乱啊,希望各位能花点时间看看,帮我解决下这个问题。头都弄晕了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

23

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2012-10-24
在线时间
0 小时
 楼主| 发表于 2012-11-29 10:27:31 | 显示全部楼层
还有一点的是,显示  中文字符串  的话
   用 void Show_Str(u8 x,u8 y,u8*str,u8 size,u8 mode) 这个函数也是不正常的
     例如   void Show_Str(10,10,"我爱你STM32",16,0)   这个函数
       液晶屏上只显示 STM32  ,而  我爱你  三个字是乱码。可是我想让这3个汉字显示正常应该怎么弄?(我知道需要转码,但是也要知道它是什么码,才能转成GBK码嘛)
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2012-11-29 13:19:45 | 显示全部楼层
SD卡把GBK字库和Unicode转GBK文件都转到SPIflash里面去了。存储的方式是GBK码。——按GBK排序的位图。所以根据GBK内码可以很快的找到该字对应的位图。

而编程时,数组存储中文字符串  例如   u8 temp[]={"你好呀"};    这里面的  你好吗  三个字是以什么码存储的呢?——看你文件的保存格式。一般是GBK内码。这程序要是拿到香港、日本、linux的电脑上去编译,估计也就要出错的。

对于 void Show_Font(u8 x,u8 y,u8 *font,u8 size,u8 mode)  这个函数,是显示一个汉字的。——根据位图数据,在屏幕上描点。

业余程序玩家。
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2012-11-29 13:22:01 | 显示全部楼层
回复【2楼】颓废ю小寶:

还有一点的是,显示  中文字符串  的话
   用 void Show_Str(u8 x,u8 y,u8*str,u8 size,u8 mode) 这个函数也是不正常的
     例如   void Show_Str(10,10,"我爱你STM32",16,0)   这个函数
       液晶屏上只显示 STM32  ,而  我爱你  三个字是乱码。可是我想让这3个汉字显示正常应该怎么弄?(我知道需要转码,但是也要知道它是什么码,才能转成GBK码嘛)

---------------------------------
你的字库读取模块工作不正常
业余程序玩家。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-29 13:24:12 | 显示全部楼层
你得搞懂2个概念:1,汉字内码,2,汉字点阵。
这里,常用的简体中文汉字内码(中文操作系统),一般都是以GBK码保存,比如你电脑上的记事本,保存就是这种格式的内码,这种内码每2个字节代表一个汉字。
汉字点阵,则是真正的汉字描述了,他记录了汉字显示的信息,比如一个16*16的汉字,所需要的点阵大小就是16*16这么多,需要16*2=32个字节,才能保存一个汉字。那么对于32*32的汉字,则需要32*4=128个字节才能保存一个汉字,所以汉字越大,其点阵描述所需要占用的字节就越多。
具体到单片机里面,汉字内码,可以保存在单片机的flash,但是汉字点阵,就不太方便保存在flash了,因为占用空间太大,所以一般都是将点阵放到外部flash或者sd卡,一个12*12的gbk字库点阵数据,有560KB之多,所以存单片机不现实。
至于UNICODE码,则是一个更为通用的编码,它包含全世界几乎所有的文字内码,这个比较复杂,你自己百度了解。
然后,单片机为什么用到unicode码?
这是因为FAT文件系统,如果你不用文件系统,unicode码是可以不用的。
因为文件系统保存的长文件名是以unicode码保存的,所以如果你要显示文件名,就必须先将unicode码转为gbk码,然后根据gbk码,找到对应的汉字点阵,再显示,这样才能完成正常的文件名显示。

希望以上对你有帮助,另外,汉字显示请看我们的汉字显示实验,你的不能显示,八成是没字库(汉字点阵数据)。没字库当然就没法显示了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2012-10-24
在线时间
0 小时
 楼主| 发表于 2012-11-29 15:28:21 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
嗯,你说的都很详细,我自己解决了,发现问题的原因是忘记把字体初始化的程序写到主函数中了,OMG滴   
    不过你说的Unicode和系统文件很有帮助,我也正要研究下FATFS显示中文名呢
       
 
            谢谢你之外再谢谢楼上那位睾丸
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-29 17:31:04 | 显示全部楼层
3楼很蛋疼...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2012-11-30 09:43:09 | 显示全部楼层
回复【7楼】正点原子:

3楼很蛋疼...

---------------------------------
哎,心中一万只草尼马在狂奔啊。
业余程序玩家。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-30 10:19:45 | 显示全部楼层
回复【8楼】ofourme:
---------------------------------
理解。楼主估计是打错字了,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-11-7
在线时间
0 小时
发表于 2013-11-14 08:49:59 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2014-1-14 22:58:03 | 显示全部楼层
回复【3楼】ofourme:
---------------------------------
好人!
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
发表于 2014-1-14 23:03:46 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2014-1-14 23:06:02 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
谢谢!
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
发表于 2015-1-24 13:45:30 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
顶,顶,顶,顶,
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-26 13:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表