标题:[求助]求助,C#如何通过串口写汉字到LED显示屏?有VB源码。
只看楼主
noshow
Rank: 2
等 级:新手上路
威 望:4
帖 子:1127
专家分:0
注 册:2006-4-21
得分:0 

HZK存储原理看懂了就好办了
取字很简单的
关键是取完怎么显示的问题


此号自封于2006年11月30日
2006-10-31 14:48
noshow
Rank: 2
等 级:新手上路
威 望:4
帖 子:1127
专家分:0
注 册:2006-4-21
得分:0 
关于HZK16字库文件的资料...
UCDOS中的HZK16字库是符合GB2312标准的16×16点阵字库,UCWIN GOLD 1.0 中的HZK16.GBK继续保持对HZK16的兼容性,但是另外还支持GBK字符,当然,存取字库的方式自然也有些变化。

HZK16用的很多,字库里的字体也很不错,但是汉字数目太大,常用的汉字有大几千个,加上不常用的和对应的繁体字,总数在2万以上,HZK16的GB2312-80支持的汉字有6763个,符号682个。其中一级汉字有3755个,按声序排列,二级汉字有3008个,按偏旁部首排列(至于排列方法,我倒不关注,因为这主要是汉字输入法所要面临的问题,而不是点阵汉字显示关注的对象)。在很多场合是用不到这么多汉字字模的,比如嵌入式系统的液晶显示屏或是像手机、GBA那样的个人电子通讯工具。有必要利用现有的HZK16和HZK16.GBK文件中的部分字体,把他们提取出来做为己用。就算是需要使用整个GB2312、GBK字符集汉字,对这两个文件的了解也是必不可少的。

对于HZK16字库里的16×16汉字(其实只用到了16×15,即16行15列,最后1列是空白的,但是作为GBK汉字,则使用了最后这一列)来说一共需要256个点来显示一个普通的汉字,那么共需要32个字节才能达到该目的。

首先,一个GB2312汉字是由两个字节编码的,范围为A1A1~FEFE。A1-A9为符号区,B0到F7为汉字区。每一个区有94个字符(当然,这只是编码的许可范围,而不是这些编码都对应有字型,比如符号区就有很多编码空白区域)。所以,当接受到了一个汉字编码譬如“鹿”字,如何在HZK16文件中找到它对应的32个字节的字模数据呢。

计算方法如下:
C2H-A1H=21H (33D区,因为汉字编码是从A1区开始的,所以文件最前面就是从A1区开始)
B9H-A1H=18H (24D位,道理如上所述,这就是所谓的区位码)
21H×5EH+18H=C36H (5EH就是94D,代表一个区有94个字符,C36H就是说这个字符在HZK16里是第C36H个)
C36H×20H=186C0H (20H就是32D,代表一个字符占32个字节,这里得到的186C0H就是“鹿”字在HZK16文件中的偏移地址,从这里开始之后的32个字节就是我们要寻找的字符字模)

此号自封于2006年11月30日
2006-10-31 14:49
redcar
Rank: 2
等 级:论坛游民
帖 子:210
专家分:60
注 册:2006-9-13
得分:0 
AA = Hex(Asc(Mid(ledstring, I, 1)))
bb = (94 * (CLng("&H" & Mid(AA, 1, 2)) - &HA1) + (CLng("&H" & Mid(AA, 3, 2)) - &HA1)) * 32 + 1

这个应该是VB的关键算法吧?如果换成c#要怎么弄呢?
2006-10-31 19:48
noshow
Rank: 2
等 级:新手上路
威 望:4
帖 子:1127
专家分:0
注 册:2006-4-21
得分:0 
以下是引用redcar在2006-10-31 19:48:52的发言:
AA = Hex(Asc(Mid(ledstring, I, 1)))
bb = (94 * (CLng("&H" & Mid(AA, 1, 2)) - &HA1) + (CLng("&H" & Mid(AA, 3, 2)) - &HA1)) * 32 + 1

这个应该是VB的关键算法吧?如果换成c#要怎么弄呢?

不好意思不懂VB

其实汉字就是有高位和低位
就是汉字库里的区位码
高位-161 低位-161 就可以得到
得到的地址读出 2个字节就可以得到该字的汉字码
因为你用的是16*16的 8位一个字节 这样应该是32个字节表示一个字
不过你要搞清楚存储的时候是横着存放还是竖着存放的
很多手机都是16点阵的
你自己看一下就可以看出来的


此号自封于2006年11月30日
2006-11-01 10:44
noshow
Rank: 2
等 级:新手上路
威 望:4
帖 子:1127
专家分:0
注 册:2006-4-21
得分:0 
这个是C里面的核心句子
// 占两个字节, 取其区位号
qh = incode[0] - 0xa0; //0xa0 = 160
wh = incode[1] - 0xa0;
offset = (94*(qh-1)+(wh-1))*32L;

前2行就是算地址 有的减160 有的减161
他在计算位置的时候又减了 1 :qh-1,wh-1
要根据不同语言的开始位置来确定

后面的 offset 就是确定该字存储位置
我记得汉字库是 94*94 存放的
因此就是 qh行wh位 (94*(qh-1)+(wh-1))这个就是字的位置
因为一个字要占用32个字节所以 再 *32
从这里读出后来显示就行了

建议你看一下汉字库GB2312

[此贴子已经被作者于2006-11-1 10:50:26编辑过]


此号自封于2006年11月30日
2006-11-01 10:49
gcx999
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-10-27
得分:0 
2006-11-02 09:31
chenjin145
Rank: 1
等 级:禁止访问
帖 子:3922
专家分:0
注 册:2006-7-12
得分:0 
led顯示屏的源碼拿來冒冒

[url=javascript:alert(1);] [div]fdgfdgfdg\" on\"[/div] [/url]
2006-11-02 10:12



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-99790-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.329903 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved