NuEduTNLCD显示驱动学习报告Word文档下载推荐.docx

上传人:b****5 文档编号:15841979 上传时间:2022-11-16 格式:DOCX 页数:16 大小:2.57MB
下载 相关 举报
NuEduTNLCD显示驱动学习报告Word文档下载推荐.docx_第1页
第1页 / 共16页
NuEduTNLCD显示驱动学习报告Word文档下载推荐.docx_第2页
第2页 / 共16页
NuEduTNLCD显示驱动学习报告Word文档下载推荐.docx_第3页
第3页 / 共16页
NuEduTNLCD显示驱动学习报告Word文档下载推荐.docx_第4页
第4页 / 共16页
NuEduTNLCD显示驱动学习报告Word文档下载推荐.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

NuEduTNLCD显示驱动学习报告Word文档下载推荐.docx

《NuEduTNLCD显示驱动学习报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《NuEduTNLCD显示驱动学习报告Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。

NuEduTNLCD显示驱动学习报告Word文档下载推荐.docx

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三个区域。

显示完成后,屏幕全亮全灭闪烁三次,然后进入下一轮的循环显示。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 金融投资

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1