标题: 求解一段单片机小程序,关于12864(不带字符) [打印本页]
作者: 850787641@qq.co 时间: 2018-9-7 09:29
标题: 求解一段单片机小程序,关于12864(不带字符)
struct //汉字可以随便加
{
uchar index[2];
uchar msk[32];
}
code hzdate[6] = {
"新",
0x20,0x24,0x2C,0x35,0xE6,0x34,0x2C,0x24,0x00,0xFC,0x24,0x24,0xE2,0x22,0x22,0x00,
0x21,0x11,0x4D,0x81,0x7F,0x05,0x59,0x21,0x18,0x07,0x00,0x00,0xFF,0x00,0x00,0x00,
"乡", 0x00,0x00,0x00,0x20,0x30,0x28,0xAC,0xA7,0x62,0x20,0x30,0x1C,0xC8,0x80,0x00,0x00,
0x00,0x40,0x40,0x42,0x47,0x23,0x22,0x22,0x12,0x11,0x09,0x07,0x01,0x00,0x00,0x00,
"安", 0x80,0x90,0x8C,0x84,0x84,0xF4,0xA5,0x86,0x84,0x84,0x84,0x84,0x94,0x8C,0x84,0x00,
0x80,0x80,0x80,0x40,0x47,0x28,0x28,0x10,0x28,0x24,0x43,0xC0,0x40,0x00,0x00,0x00,
"科", 0x10,0x12,0x92,0x72,0xFE,0x51,0x91,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00,
0x04,0x02,0x01,0x00,0xFF,0x00,0x04,0x04,0x04,0x02,0x02,0x02,0xFF,0x01,0x01,0x00,
"电", 0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00,
"子", 0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xE2,0x12,0x0A,0x06,0x02,0x00,0x80,0x00,0x00,
0x01,0x01,0x01,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
};
/**********************字形码位置检索************************/
uint hz(uint v)
{ uchar k;
uint c;
for(k=0;k<6;k++)
{
c=hzdate[k].index[0]<<8|hzdate[k].index[1];
if(v==c) return (k);
}
}
作者: 850787641@qq.co 时间: 2018-9-7 09:30
想问一下
struct //汉字可以随便加
{
uchar index[2];
uchar msk[32];
}
这个数组什么意思?
c=hzdate[k].index[0]<<8|hzdate[k].index[1]; 这句程序是什么意思啊?
求大神赐教
作者: 850787641@qq.co 时间: 2018-9-7 12:36
自己顶一个
作者: 凌净清河 时间: 2018-9-7 20:57
本帖最后由 凌净清河 于 2018-9-7 21:12 编辑
是这样的,struct定义了一个结构体,这个结构体中有两个数组元素index和msk,可以看出,这两个数组都是unsigned char类型的,也就是说,每一个数组中的元素大小为1个字节。
然后程序使用这个结构体定义了一个结构体数组hzdate[6],这个时候要注意为什么6个汉字可以一起写入到结构体中,因为在内存中,这一个结构体里面两个连续的数组空间是挨着的,也就是说,看似定义的两个数组,实际上是一个temp[34]数组,而一次性创建的6个结构体数组又把6个temp[34]的内存空间顺序安排了。
上面这个是理解的基础。然后进行下一步分析。可以看到,每一个汉字在字模表里的存放分为两个部分,第一个部分是汉字本身,而后跟着汉字的字模,因为在计算机中一个汉字占用的是两个字节,而注意到之前定义的index数组是unsigned char类型,所以需要index[2]存放这两个字节的汉字信息,这个时候就把汉字转换成两个unsigned char类型的数值,也就是拆分之后的汉字编码,其中,高8位被存放在index[0]中,低8位被存放在index[1]中,便于后续比对。
而6个汉字的编码和字模就分别存放在结构体数组中的每个元素结构体里了。
我们知道结构体中成员的调用,是结构体.成员名,所以hzdate[k].index[0]指代的是hzdate结构体数组中的第k个元素的index成员中的第1个元素;
我们继续,<<这个符号是将数据(理解成二进制)左移,所以<<8指的是左移8个位,而8位正好是一个字节的大小,|这个符号将index[1]和左移过的index[0]进行位或操作,可以理解为将汉字的高8位和低8位拼接起来了。故hzdate[k].index[0]<<8|hzdate[k].index[1]这句话的意思就是将第k个汉字的字型编码由两个unsigned char类型合并成unsigned int类型,继而赋值给c。
后面的就好理解多了,判断形参v是否等于c,即汉字编码匹配,成功返回汉字在结构体数组中的位置k,就是比对到的那个计数值。
作者: zl2168 时间: 2018-9-8 21:16
本帖最后由 zl2168 于 2018-9-9 17:12 编辑
不要去看这些没头没脑的东东,费时费力一场空。
给你介绍一本书,张志良编著的:《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行,可演示,可观测,
程序语句条条有注解。
先Proteus仿真一下,确认有效。以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行,可演示,可观测,程序语句条条有注解。
作者: HC6800-ES-V2.0 时间: 2018-9-10 08:37
unsigned char Index[2]; // 汉字内码索引,一个汉字占两个字节
unsigned char Msk[32]; // 点阵码数据(16*16有32个数据)
作者: 850787641@qq.co 时间: 2018-9-12 08:52
解释的太详细了,都是一个个手打的,这么多字,讲的非常详细,这下我理解了,太谢谢你了,真的太谢谢你了
作者: 850787641@qq.co 时间: 2018-9-12 08:53
好的,谢谢你啊,一楼讲的的很详细,我看懂了,和你说的是一样,谢谢啊
作者: 850787641@qq.co 时间: 2018-9-13 11:11
我又遇到了一个问题,我开了一个新帖子,能帮帮我吗?
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |