实验二LCD显示控制

上传人:日度 文档编号:164178831 上传时间:2021-01-27 格式:DOC 页数:12 大小:52.50KB
返回 下载 相关 举报
实验二LCD显示控制_第1页
第1页 / 共12页
实验二LCD显示控制_第2页
第2页 / 共12页
实验二LCD显示控制_第3页
第3页 / 共12页
实验二LCD显示控制_第4页
第4页 / 共12页
实验二LCD显示控制_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《实验二LCD显示控制》由会员分享,可在线阅读,更多相关《实验二LCD显示控制(12页珍藏版)》请在金锄头文库上搜索。

1、实验二 LCD显示控制一、实验目的通过本次实验进一步熟悉MagicARM2410 GPIO、UART、RTC的工作原理;学习LCD的工作原理,并能编程控制。二、实验要求在实验一的基础上,研读LCD显示源代码,作适当修改,实现下列功能:1、系统启动时,在LCD上显示下列信息:(1)、年月日及当前时间(拓展:能自行设置时);(2)、个人的班级姓名学号(拓展:汉字显示)。2、使用实验箱上小键盘输入一个(x,y)坐标,以此坐标作为图片的顶点位置,显示一幅个人照片或图片。3、LCD同步显示超级终端上的信息。三、实验原理(1)ZLG7290ZLG7290的核心是一块ZLG7290B芯片,它采用I2C接口,

2、能直接驱动8位共阴式数码管,同时可扫描管理多达64只按键,实现人机对话的功能资源十分丰富。除具有自动消除抖动功能外,它还具有段闪烁、段点亮、段熄灭、功能键、连击键计数等强大功能,并可提供10种数字和21种字母的译码显示功能,用户可以直接向显示缓存写入显示数据,而且无需外接元件即可直接驱动数码管,还可扩展驱动电压和电流。用户按下某个键时,ZLG7290的INT引脚会产生一个低电平的中断请求信号,读取键值后,中断信号就会自动撤销。正常情况下,微控制器只需要判断INT引脚就可以得到键盘输入的信息。微控制器可通过两种方式得到用户的键盘输入信息。其一是中断方式,该方式的优点是抗干扰能力强,缺点是要占用微

3、控制器的一个外部中断源。其二是查询方式,即通过不断查询INT引脚来判断是否有键按下,该方式可以节省微控制器的一根IO口线,但是代价是I2C总线处于频繁的活动状态,消耗电流多并且不利于抗干扰。(2)LCD工作原理LCD 显示字符法一其实每一字符就是一幅图像,字符的大小对应于图像的大小,字符的笔画对应于图像的内容。那么如何把字符转换为图像呢?简单的方法是使用“字模提取”之类的软件,它能够把任意的字符转换为一个字节型的数组,数组元素中的每一位代表LCD上的一个像素点,当为1时,表示该位置为字符的一个笔画,需要上色,而为0时,表示不是笔画,不需要上色。例如,一个字符想要在1616的面积上显示,即该字符

4、的宽和高各为16个像素,因为每一个像素用一位来表示,因此用字模提取软件生成的字节型数组,一共有1616832个字节。在字模提取的过程中,还要注意取模的顺序,顺序不同,得到的数组就不同,一般来说是从字符的左上角开始,从左向右,从上到下取模,这样程序编写上会方便一些。相同字体大小的中文字符和ASCII码字符的宽度还有所不同,一般ASCII码字符的宽度是中文字符宽度的一半,所以显示中文字符的程序和显示ASCII码字符的程序还略有不同。 当把一个字符取模变成一个数组后,只要对该数组中每个元素的每一位依次进行判断,对值为1的位和值为0的位进行不同的上色处理,即可完成一个字符的绘制。法二如果要在程序中显示

5、大量的中文字符,是不是要把这些字符都取模啊?回答是肯定的,但前人已经为我们完成了这一步,做成了数据库,并且进行了编码,只要按照编码规则调用该库文件,就可以检索到相要的字符。下面就来说说编码规则:每个汉字是由两个字节表示的,前一个字节表示的区号,后一个字节表示的位号,那么汉字在汉字库中的位置为:94(区号1)(位号1)。94表示的是每个区里一共有94个汉字,减1表示的是数组是从0开始,而区号和位号是从1开始的。具体到汉字在某一数据库中的位置,还需要乘以一个汉字字模所占的字节数,即94(区号1)(位号1)一个汉字字模所占字节数。如一个字模大小为1616的宋体数据库,库里每个汉字所占的字节为1616

6、832,则每个汉字在该宋体数据库中的位置为:94(区号1)(位号1)32。ASCII码的字符调用比汉字字符要简单,只要把它乘以字模所占字节数即可找到该字符所在字库的位置,如816的ASCII字库,ASCII码在该字库的位置为ASCII16。如果中文字符和ASCII码混合在一样,如何区分它们呢?其实也很简单,ASCII码的最高位是0,而中文的最高位是1,因此当读取到的一个字节的最高位是0,则该字节为ASCII码,它的下一个字节与这个字节无关;当取得到的字节的最高位是1,则表示的是中文字符,并且该字节与它的下一个字节组合在一起表示完整的一个汉字。 编码规则介绍完了,那么如何打开字库呢?我们可以利用

7、前人已做好的字库,然后像访问一般文件一样打开它。另一种方法是把字库变换成一个超大的数组,那么我们就可以像操作数组一样读取字库了。void Main(void) unsigned char String=我的名字是:Newtton ; int length = sizeof(String); int k,xx; unsigned char qh,wh; const unsigned char *mould;LCD_Init(); rLCDCON1|=1; Brush_Background(0xffffff);for(k=0,xx=0;k= GUI_LCM_XMAX) return(0); if(

8、y = GUI_LCM_YMAX) return(0); / 刷新显示 p_buffer = (uint16 *)FrameBuffer; / 设置填充显示缓冲区的地址 p_buffer = p_buffer + y*GUI_LCM_XMAX + x; / 计算显示点对应显示缓冲区的位置 *p_buffer = color; / 写入数据 return(1);/填充矩形框:两个坐标确定以矩形框void GUI_RectangleFill(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color) uint32 i; / 先找出矩形左上角与

9、右下角的两个点,保存在(x0,y0),(x1,y1) if(x0 x1) / 若x0x1,则x0与x1交换 i = x0; x0 = x1; x1 = i; if(y0 y1) / 若y0y1,则y0与y1交换 i = y0; y0 = y1; y1 = i; / 判断是否只是直线 if(y0 = y1) GUI_HLine(x0, y0, x1, color); return; if(x0 = x1) GUI_RLine(x0, y0, y1, color); return; while(y0 = GUI_LCM_XMAX) | (y = GUI_LCM_YMAX) ) return(1); if(x+w) GUI_LCM_XMAX) return(1); if(y+h) GUI_LCM_YMAX) return(1); / 更新显示数据 for(i=0; ih; i+)/ 输出h行数据 / 输出一行(w)数据 p_buffer = (uint16 *)FrameBuffer; p_buffer = p_buffer + y*GUI_LCM_XMAX + x; for(j=0; jw; j+) *p_buffer+ = *buffer+; / 输出数据 /

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号