零死角玩转stm32-高级篇5、3.2寸液晶显示(中英文+图片).pdf
- 文档编号:3214672
- 上传时间:2022-11-20
- 格式:PDF
- 页数:30
- 大小:1.20MB
零死角玩转stm32-高级篇5、3.2寸液晶显示(中英文+图片).pdf
《零死角玩转stm32-高级篇5、3.2寸液晶显示(中英文+图片).pdf》由会员分享,可在线阅读,更多相关《零死角玩转stm32-高级篇5、3.2寸液晶显示(中英文+图片).pdf(30页珍藏版)》请在冰豆网上搜索。
-第2页-00、友情提示友情提示零死角玩转零死角玩转STM32系列教程由初级篇初级篇、中级篇中级篇、高级篇高级篇、系统篇系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。
M3的世界,与野火同行,乐意惬无边。
另外,野火团队历时一年精心打造的STM32库开发实战指南库开发实战指南将于今年10月份由机械工业出版社机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。
内容上会给你带来更多的惊喜。
是一本学习STM32必备的工具书。
敬请期待!
-第3页-55、液晶显示(中、英液晶显示(中、英、PicPic)5.1实验简介实验简介在液晶触摸画板中,我们已经成功地实现了驱动LCD和触摸屏,并制作了触摸画板小应用,但是若要显示文字或图片文件,则还需要利用文件系统,读取保存在SD卡中的字库文件、图片文件。
5.2什么是字模什么是字模我们知道其实液晶屏就是一个由像素点组成的点阵,若要显示文字,则需要很多像素点的共同构成。
见下错误!
未找到引用源。
错误!
未找到引用源。
,图中是两个由16*16的点阵显示的两个汉字。
如果我们规定:
每个汉字都由这样16*16的点阵来显示,把笔迹经过的像素点以“1”表示,没有笔迹的点以“0”表示,每个像素点的状态以一个二进制位来记录,用16*16/8=32个字节就可以把这个字记录下来。
这32个字节数据就称为该文字的字模,还有其它常用字模是24*24、32*32的。
16*16的“字”的字模数据为:
1./*字*/2.unsignedcharcodeBmp003=3.4./*-5.;源文件/文字:
字6.;宽高(像素):
16167.;字模格式/大小:
单色点阵液晶字模,横向取模,字节正序/32字节8.-*/9.Bit7Bit0Bit7Bit0每个字16x2Byte-第4页-10.0x02,0x00,0x01,0x00,0x3F,0xFC,0x20,0x04,0x40,0x08,0x1F,0xE0,0x00,0x40,0x00,0x80,11.0xFF,0xFF,0x7F,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,12.;在这样的字模中,以两个字节表示一行像素点,16行构成一个字模。
如果使用LCD的画点函数,按位来扫描这些字模数据,把为1的位以黑色来显示(也可以使用其它颜色),即可把整个点阵还原出来,显示在液晶屏上。
5.3制作字模制作字模我们采用“字模III-增强版v3.91”软件来制作中文字库,步骤如下:
1.打开字模软件2.点击“自动批量生成字库”按钮选项。
软件界面左下角将出现一下几个按钮选项:
-第5页-3.点击选择“二级汉字库”按钮。
在“输入批量字符”框里面将会列出二级汉字的所有汉字,其中共收录了6768个汉字字符,非特殊情况下都能够满足大家的要求,如图:
4.点击“字库智能生成”按钮,弹出“字库批量参数确认”对话框。
我们在“源字体”选项里面做如下设置,需要注意的是大小问题,因为我们本次的设计目标是实现16*16的汉字,所以在此选择小四字体。
-第6页-设置好之后如下:
5.点击“开始转换进程”按钮.就会在安装目录下或者你设置好的目录下生成.c后缀的字库文件。
6.对于LCD显示来说,只要能够在指定的位置描写制定颜色的点,那么就能够很好地根据汉字字模信息来描写汉字。
在此,为了能够更好的清楚字模的取向和高低位的排列顺序,我们可以现先在pc测试我们刚才制作好的库文件。
在这里我们取“当”字符的数据来测试。
VC6.0测试源码如下,该代码实现了把字模中为1的点都用数字“8”来表示:
1.#include2.3.unsignedcharcc=4./*当字符*/5.0x00,0x80,0x10,0x90,0x08,0x98,0x0C,0x90,0x08,0xA0,0x00,0x80,0x3F,0xFC,0x00,0x04,6.0x00,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x04,0x3F,0xFC,0x00,0x04,0x00,0x007.;8.9.voidmain()10.11.inti,j;12.unsignedcharkk;13.for(i=0;i16;i+)-第7页-14.15.for(j=0;j8;j+)16.17.kk=cc2*ij;/左移J位18.19.if(kk&0x80)/如果最高位为120.21.printf(8);22.23.else24.25.printf();26.27.28.29.for(j=0;j8;j+)30.31.32.kk=cc2*i+1(320-16)22.23./*换行*/24.x=0;25.y+=16;26.27.28.if(y(240-16)29.30./*重新归零*/31.y=0;-第19页-32.x=0;33.34.LCD_Char_CH(x,y,str,Color,bkColor);35.str+=2;36.x+=16;37.38.该函数其实没做到什么工作,对超出屏幕范围的显示坐标进行换行处理,并把字符串中的汉字一个一个提取出来调用单字符显示函数LCD_Char_CH()显示出来,LCD_Char_CH()函数的源码如下:
1./*2.*函数名:
LCD_Char_CH3.*描述:
显示单个汉字字符4.*输入:
x:
0(319-16)5.*y:
0(239-16)6.*str:
中文字符串首址7.*Color:
字符颜色8.*bkColor:
背景颜色9.*输出:
无10.*举例:
LCD_Char_CH(200,100,好,0,0);11.*注意:
如果输入大于1的汉字字符串,显示将会截断,只显示最前面一个汉字12.*/13.voidLCD_Char_CH(u16x,u16y,constu8*str,u16Color,u16bkColor)14.15.16.#ifndefNO_CHNISEST_DISPLAY/*如果汉字显示功能没有关闭*/17.u8i,j;18.u8buffer32;19.u16tmp_char=0;20.21.22.GetGBKCode_from_sd(buffer,str);/*取字模数据*/23.24.for(i=0;i16;i+)25.26.tmp_char=bufferi*2;27.tmp_char=(tmp_char8);28.tmp_char|=buffer2*i+1;29.for(j=0;j15-j)&0x01=0x01)32.33.LCD_ColorPoint(x+j,y+i,Color);34.35.else36.37.LCD_ColorPoint(x+j,y+i,bkColor);38.39.40.41.42.#endif43.-第20页-函数中的条件编译#ifndefNO_CHNISEST_DISPLAY,是用于开关汉字显示功能的,若定义了NO_CHNISEST_DISPLAY,则本函数为空,关闭了显示汉字的功能。
在LCD_Char_CH()这个函数中,首先调用GetGBKCode_from_sd()从SD卡中读出我们需要显示在LCD上的指定汉字的字模数据。
接着在2240行的代码就根据字模数据来描写,把字模中为1的数据位,在LCD屏中的像素点中使用画点函数LCD_ColorPoint()显示特定的颜色。
思路和前面VC测试部分用数字“8”来显示“当”字是一样的。
5.5.4.1查找字模查找字模读者现在可能在想,字库里面保存着大量的汉字字幕信息,现在输入GetGBKCode_from_sd(buffer,str)就能够拷贝出这个字符的字模数据,是怎样定位字模信息所在的位置的呢?
换句话说,假如现在要显示“吾”字,是怎样根据这个字来确定“吾”字符在字库中的保存位置的呢?
其实这里面有一定的映射关系,那就是接下来要说的汉字“区码”和“位码”。
在前面生成的HZLIB.bin文件,实际是按国标GB2312生成的二级汉字库。
在国标GB231280中规定,所有的国标汉字及符号在字库中的存储形式是:
分配在一个94行、94列的阵列中,阵列的每一行称为一个“区”,共有01区到94区;每一列称为一个“位”,共有01位到94位,阵列中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉伯数字就是它们的“区位码”。
区位码的前两位是它的区号,后两位是它的位号。
我们生成的汉字库就是这样按区位码排列的阵列,通过区位码,就能查找出该字的字模。
汉字的机内码是指在计算机中表示一个汉字的编码。
为避免与ASCII码混淆。
用机内码的两个字节表示一个汉字,这两个字节分别称为高位字节和低位字节。
高位字节=区码+20H+80H(或区码+A0H)低位字节=位码+20H+80H(或位码+AOH)因此,我们就可以通过汉字的机内码,运算得出汉字在字库中的区位码,由区位码查找出该汉字的字模。
-第21页-下面以vc6.0的测试源码来说明机内码、区位码的关系:
1.#include2.voidmain()3.4.unsignedchar*s,*e=A,*c=古;5.unsignedcharhigh_byte,lower_byte;/内码高字节,内码低字节6.printf(字母%s的ASCII码=,e);7.s=e;8.9.while(*s!
=0)/C的字符串以0为结束符*10.11.printf(%3d,*s);12.s+;13.14.printf(n汉字内码(10进制)%s=,c);15.16.s=c;17.while(*s!
=0)18.19.printf(%3d,*s);20.s+;21.22.23.printf(n汉字内码(16进制)%s=,c);24.25.s=c;26.while(*s!
=0)27.28.printf(%0X,*s);29.s+;30.31.32.33.s=c;34.high_byte=*s;35.36.s+;37.lower_byte=*s;38.39.printf(nn汉字%s对应的n内码高字节:
%dn内码低字节:
%dn,c,high_byte,lower_byte);40.printf(nn汉字%s对应的n区码为:
%d-160=%dn位码为:
%d-160=%dn,c,high_byte,high_byte-160,lower_byte,lower_byte-160);41.42.printf(nn汉字%s在区位码表中的位置为%d%dn,c,high_byte-160,lower_byte-160);43.printf(汉字区位码表可参考网站:
http:
/对应的汉字刚好就是%snn,high_byte-160,lower_byte-160,c);45.46.测试结果如下:
-第22页-打开汉字区位码表在线查询网站:
http:
/查询“古”汉字的区位码刚好如计算所得,为。
上面的测试结果说明了每一个汉字的内码具体作用。
回到本实验工程中获取字模函数GetGBKCode_from_sd()中,它的具体定义如下:
1./*2.*函数名:
GetGBKCode_from_sd3.*描述:
从sd卡上的字库文件中拷贝指定汉字的字模数据4.*输入:
pBuffer-数据保存地址5.*c-汉字字符低字节码6.*输出:
0(成功)7.*-1(失败)8.*/9.1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 死角 stm32 高级 3.2 液晶显示 中英文 图片