NuEduTNLCD显示驱动学习报告Word文档下载推荐.docx
《NuEduTNLCD显示驱动学习报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《NuEduTNLCD显示驱动学习报告Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
2.3Zone0区域循环显示的代码-9-
第三章LCD显示原理以及区域循环显示代码的改进(以Zone2为例)-10-
3.1NuEdu-TNLCDV1.0
型号LCD的显示原理-10-
3.2Zone2区域循环显示代码的改进-18-
第一章官方例程中LCD_SetAllPixels()函数的一个BUG
为了查看LCD能够显示的所有字符,用LCD_SetAllPixels
(1);
语句进行屏幕全显,可是显示结果如下:
很明显,显示内容有缺失。
在main.c程序中的LCD_SetAllPixels
(1);
上点击右键,选中“GoToDefinitionof‘LCD_SetAllPixels’”,此时自动跳转到lcd.c中查看函数LCD_SetAllPixels();
的原型。
Lcd.c中提供的代码片段:
此时再点击右键,选中“GoToDefinitionofMEM_0”,自动跳转到Nano100Series.h中查看到相关定义如下:
很明显,lcd.c中少了对LCD->
MEM_9的赋值。
此时,我们在lcd.c中补充一句LCD->
MEM_9=u32SetValue;
如下图所示:
修改后,保存,编译,运行。
开发板上显示结果如下:
第二章三大显示区域(Zone2、Zone1、Zone0)的划分
2.1Zone2区域循环显示的代码
Zone2对应的显示区域如下图红色圈圈标注部分:
Zone2单独显示:
在官方提供代码的StartKit工程(我的电脑上,该工程所在路径是C:
\Nuvoton\BSPLibrary\Nano100BSeriesBSP_CMSIS_V3.00.000_NuEdu\SampleCode\NuEdu\Smpl_Basic01_StartKit\KEIL\Smpl_Basic01_StartKit.uvproj)中,对主程序main.c进行修改:
首先,定义一个变量disp_cnt用于循环计数,以显示Zone2的每一个字符
下面是循环显示Zone2每一个字符的代码:
至于代码为什么要这样写,以及对这段代码该如何优化,以增强其可读性,我们会在后面的第三章进行讲解
2.2Zone1区域循环显示的代码
Zone1单独显示:
2.3Zone0区域循环显示的代码
Zone0单独显示:
第三章LCD显示原理以及区域循环显示代码的改进(以Zone2为例)
型号LCD的显示原理
前面2.1节已经提到过,Zone2对应的显示区域如下图所示:
这仅仅是一个结论,下面我们从官方提供的代码出发,看看为什么Zone2对应以上的显示区域。
下面的讨论都是针对官方例程中的Smpl_Basic01_StartKit.uvproj工程进行的。
在我的电脑中,该工程文件所在的路径是C:
\Nuvoton\BSPLibrary\Nano100BSeriesBSP_CMSIS_V3.00.000_NuEdu\SampleCode\NuEdu\Smpl_Basic01_StartKit\KEIL\Smpl_Basic01_StartKit.uvproj
为了探究LCD显示原理,首先打开Smpl_Basic01_StartKit.uvproj工程,不做任何改动,编译运行。
经过一番滚动显示之后,最终稳定下来的显示结果如下图所示:
在上图中,我们注意到,nuvoTon字样的LOGO一直在显示。
对照main.c程序中的main()函数,不难发现:
1.滚动显示的***NUVOTONNANO130***作为字符串参数被传递给textticker()函数
2.不断闪烁的NUVOTON字样作为字符串参数被传递给LCDLIB_Printf()函数,接着通过调用LCD_EnableBlink()、LCD_DisableBlink()来实现闪烁的使能和失能,通过调用CLK_SysTickDelay()这个系统延时函数来控制NUVOTON字样在屏幕上闪烁的频率
3.通过调用showTime()函数实现屏幕右上方的时钟显示功能
除此之外,我们明没有看到main()函数中有“nuvoTon”字样的字符串参数被传递给某一个函数,但是该字样从系统复位后就一直显示或者闪烁。
因此,我们可以从此处入手,结合第一章给出的LCD屏幕全显图片,探究LCD显示原理。
在LCD通电的状态下,不管屏幕显示什么,把视线调整到几乎和LCD屏平行的状态,从下边斜角的方向去观察LCD屏幕,不难发现第二排的nuvoTon和welcome的背光状态本身就是这些字符。
这跟一般的LCD显示屏显示原理有些不一样。
常规的LCD显示屏是采用点阵显示的原理,字符、数字、英文的显示都是靠点阵中某些行列上像素的组合而得到的。
而新塘这款开发板自带的LCD上就带有独立的nuvoTon和Welcome字符,也就是说这些字符是新塘官方定制的,已经固化到LCD的硬件里面去了,我们在使用的时候要么不点亮nuvoTon这个LOGO,要点亮就是七个英文字母一起点亮。
而且不能对“nuvoTon”中的任一字符通过软件的方式作更改。
这样一来,我们还是把焦点集中到“nuvoTon”上,结合main()函数中的语句,看它的显示原理。
LCD设备初始化之后,字符串***NUVOTONNANO130***滚动显示之前,有两个语句:
LCDLIB_SetSymbol(2,27,1);
CLK_SysTickDelay(335000);
后一条明显是系统延时语句,暂时不管它。
在第一条语句上单击右键,选择GoToDefinitionOf‘LCDLIB_SetSymbol’,自动跳转到LCDLIB.c文件中函数LCDLIB_SetSymbol()的定义处。
这一段代码就是探究LCD显示原理的关键代码。
下面来对它进行逐步分析。
先把LCDLIB_SetSymbol(2,27,1);
中的参数代入到函数定义中去,得到以下的等效语句:
bit=*(Zone[2]+27*2+1);
com=*(Zone[2]+27*2+0);
LCD_SetPixel(com,bit,1);
这里又涉及到Zone[]数组的定义和函数LCD_SetPixel()的定义,仍然用老办法,右键单击,选择“GoToDefinitionOf”查看数组和函数定义:
Zone[]数组一共有三个元素:
zone[0]=(char*)(Zone0)
zone[1]=(char*)(Zone1)
zone[2]=(char*)(Zone2)
每个元素都是指向char类型的指针,也就是说Zone0、Zone1、Zone2都被强制转换为指针(也就是地址)类型。
上面两个赋值语句表明bit和com两个变量是取Zone[2]表示的地址进行偏移后所指向存储单元的值。
这里只需关注zone[2]=(char*)(Zone2),继续GoToDefinitionOfZone2:
Zone2数组的定义中,有两个常量:
sub_Zone2和Zone2_Digit_Segnum,依旧用GoToDefinitionOf这个强大的功能,可以找到相应的取值:
如此一来,我们就可以把Zone2[]数组(数组名也代表数组所占存储空间首地址)的定义简写为:
constcharZone2[1][33][2]={/*具体赋值在此省略*/};
到此,再返回到前面的LCDLIB_SetSymbol(2,27,1);
语句,不难发现参数中的2代表Zone2,参数中的27表示地址偏移,结合constcharZone2[sub_Zone2][Zone2_Digit_SegNum][2]的定义,找到注释/*27*/所在的那一行:
注释里面有“LOGO”字样,这样我们便可以确信:
所代表的意思是:
显示Zone2中的LOGO,也就是“nuvoTon”字样。
参数中的1是开关,表示开启显示功能。
如此一来,我们便可以对main()函数进行修改,在LCD初始化之后,只添加一句LCDLIB_SetSymbol(2,27,1);
然后把其他的语句全部删除。
然后保存,编译运行,查看实验效果。
修改后的main()函数代码如下:
编译运行后的显示效果:
接下来我们对main()中LCDLIB_SetSymbol(2,27,1);
语句进行修改,调整其参数,观察效果。
因为主要是观察Zone2区域,所以LCDLIB_SetSymbol()函数第二个参数可以是0~32中的任意值。
我们可以在一个for循环中逐一点亮Zone2区域中的每一个小的显示块,为了更清晰地看到显示效果,我们可以加入系统延时函数CLK_SysTickDelay()。
修改好的main()函数代码如下:
编译运行,屏幕上会不断循环显示Zone2区域所对应的内容。
如果想要循环显示Zone1和Zone0区域对应的内容,对上面的for循环和各函数的参数进行调整即可,具体参考第二章。
以上就是3.1节的全部内容,这些内容是第二章给出代码的详细分析。
当然,这块LCD的显示功能还不仅止于此。
比如,我们还可以分析LCDLIB_Panel.c中的以下代码,编程演示Zone0和Zone1两个区域的TextDisplay功能。
由于时间和精力的限制,这里就不详细展开。
如果感兴趣,可以自己研究。
3.2Zone2区域循环显示代码的改进
3.1节已经给出了Zone2区域循环显示代码的详细解释,由于代码中for循环及一些函数的参数全部是数字,降低了代码的可读性和程序的可移植性。
为了使整体上的代码风格保持一致性,有必要对三个区域的区域循环显示代码进行改进。
改进后的代码如下:
其中的disp_zone()函数是自己在main.c中定义的函数。
disp_zone()的代码如下:
除此之外,还需删掉LCDLIB_Panel.c中的以下六行代码
然后新建一个disp_zone_LRJ.h头文件,头文件的内容即是以上六行代码。
将新建好而且增加了六行代码的disp_zone_LRJ.h头文件复制到以下路径:
C:
\Nuvoton\BSPLibrary\Nano100BSeriesBSP_CMSIS_V3.00.000_NuEdu\Library\StdDriver\inc
然后分别在main.c和LCDLIB_Panel.c开头几行增加一行代码:
#include"
disp_zone_LRJ.h"
这样,代码就优化好了,编译运行,即可看到LCD屏幕循环显示Zone2、Zone1、Zone0三个区域。
显示完成后,屏幕全亮全灭闪烁三次,然后进入下一轮的循环显示。