基于uCOSⅡ的LCD驱动编写.docx
《基于uCOSⅡ的LCD驱动编写.docx》由会员分享,可在线阅读,更多相关《基于uCOSⅡ的LCD驱动编写.docx(11页珍藏版)》请在冰豆网上搜索。
基于uCOSⅡ的LCD驱动编写
天津电子信息职业技术学院
课程设计
课题名称基于uCOSⅡ的LCD驱动编写
姓名王浩
学号35
班级电信S10-1
专业电子信息工程
成绩
完成日期2012-06-01
基于uCOSII的LCD驱动编写
摘要
LCD是嵌入式操作系统的重要组成部分,是系统和用户之间进行交互和信息交换的媒介,它实现信息的内部形式与人类可以接受形式之间的转换。
用户可以只通过LCD监测系统内部运行状态,然后作出相应的处理。
因而具有良好的人机界面的嵌入式操作系统能过很好的完成系统开发、生产生活的需要。
S3C44B0X中具有内置的LCD控制器,它能将显示缓存(在SDRAM存储器中)中的LCD图像数据传输到外部的LCD驱动电路上的逻辑功能。
它支持单色、4级、16级灰度LCD显示,以及256彩色LCD显示。
在显示灰度时,它采用时间抖动算法(time-basedditheringalgorithm)和帧率控制(FrameRateControl)方法,在显示彩色时,它采用RGB的格式,即RED、GREEN、BLUE,三色混合调色。
通过软件编程,可以实现233或332的RGB调色的格式。
对于不同尺寸的LCD显示器,它们会有不同的垂直和水平象素点、不同的数据宽度、不同的接口时间及刷新率,通过对LCD控制器中的相应寄存器写入不同的值,来配置不同的LCD显示板。
LCD能够正常工作得益于软硬件的协同工作,S3C44B0X集成了LCD的控制器,即不带驱动电路的LCD显示模块,驱动程序需要根据用户需要来自行添加。
uC/OS是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统,在具体应用中稳定可靠,并且支持uIPTCP/IP协议栈、ucGUI等,可扩展性强,功能强大。
因此,在uC/OSII下写的LCD驱动具有较好的实时性和稳定性,功能强大。
关键词:
嵌入式系统;LCD显示;驱动电路;
一、系统设计
1.课题目标及总体方案
首先学习了解LCD的驱动程序,然后在移植好的UCOSII项目中添加LCD的驱动程序,最后能够在uCOSII下,编写LCD应用任务的简单编程实例,来检验LCD驱动程序的完好度。
本实验实例为在LCD屏上显示跑马灯,同时模拟CPU板上D7、D8灯的交替闪烁,闪烁周期为跑马灯周期。
2.LCD驱动程序组成
LCD驱动程序的文件夹Gui(如图1所示),其中,包括四个文件夹:
图1
Font中存放的是字体文件,存放四个文件,Font_Cn12.c为调用汉字库12X12汉字的引用文件;Font_Cn16.c为调用汉字库16X16汉字的引用文件;Font8X16为调用ASCII码的源文件,它的大小为8X16;Gchar.c为显示字符的源程序库。
Glib中存放绘图的中层和上层的函数,上层函数是直接供用户调用的API,。
Glib文件夹内存放两个文件,Glib.c是图形显示库的源代码,它主要实现LCD的中层和上层供用户调用的API函数,Glib.h则是供其他文件或自身调用的头文件。
Init中存放GUI初始化的函数,Init文件夹内存放两个文件,data.h是数据类型重定义的文件,GUI_Init.c是GUI系统的初始化文件。
Lcddriver中存放的是LCD的底层驱动函数,以及对LCD控制器的初始化函数。
Lcddriver文件内存放两个文件,Lcddriver.c包括LCD的底层读写内存用来绘图的函数,以及初始化LCD控制寄存器的初始化硬件的函数。
Lcddrive是供其他文件或自身调用的头文件。
3.UCOSII操作系统下添加LCD驱动程序
在UCOSII操作系统下添加LCD驱动程序,也就是把整个GUI文件夹加入该项目里。
同时,还要在Application\INC目录下的config.h文件中,加入GUI程序的头文件,#include"..\..\Gui\Glib\Glib.h",这是为了在应用中方便调用画图的API函数。
如果,要在LCD上显示英文或汉字,还要在Application\SRC\Main.c中声明引用的是externGUI_FONTCHINESE_FONT12;等外部定义过的字体。
这样,编译就能通过,就把LCD的驱动程序以及小型的GUI图形库,加载到了UCOSII操作系统上了。
在UCOSII操作系统下,要单独开辟一个GUI任务,进行画图,一般这个任务的优先级很低,一般它仅比空闲任务的优先级高,这样做是为了可以使更多的任务等级显示在屏上。
在Application/SRC下的MAIN.C文件,有GUI的应用任务,绘图的API函数即放在这里,或者作一个应用函数的文件,在此任务里调用。
所有的对LCD显示操作内容要在MAIN.C文件中编写。
4.应用程序
本实验实例为在LCD屏上显示跑马灯,同时模拟CPU板上D7、D8灯的交替闪烁,闪烁周期为跑马灯周期。
来检验LCD驱动程序是否能正常工作。
实验流程图如下:
程序开始先进行各项初始化,包括开发板、GUI初始化、系统初始化,然后配置LCD屏幕设置,运行时先调用跑马灯延时程序Timedelay(),跑马灯运行一周后,置开发板上D7、D8灯亮灭,通过信号传递置LCD屏幕上模拟D7D8灯亮灭,接着调用Timedelay()函数,循环任务。
二、实验结果测试
测试方法:
1在移植好的UCOSII项目中添加LCD的驱动程序。
(方法参见第一章第二节)
2在main.c文件中编写程序(源程序见附录),先使用画图函数绘出包含跑马灯,模拟D7、D8两灯在内的LCD界,用函数timedelay()控制跑马灯运行,timedelay()亦是延时函数。
D7、D8两灯每交替闪说一次,调用一次timedelay()延时函数。
3连接电脑和试验箱,编译程序,无错误,把程序下载到S3C44B0X,观察结果。
4观察现象,有问题检查修改MAIN.C文件。
LCD界面显示如下:
图2
三、总结
实验结果显示出预期的LCD界面,LCD屏幕显示预定图案(如图2)。
屏幕上D7、D8随CPU板上的D7,D8两灯同步闪烁,而且跑马灯每转一周,两个等交替闪烁一次。
说明LCD驱动即添加到内核中没有问题,系统工作正常。
四、心得体会
课程设计完成了,在这个过程中我学到了很多东西。
我对嵌入式系统有了更加深入的了解,对书本上的知识也有了更加深刻的理解,对以前有些含糊不理解的地方也有了新的认识。
学会使用嵌入式系统实现问题解决的一般过程,在UCOSII下,LCD驱动程序的结构,以及LCD驱动程序怎样添加道内核中去,也能够使用嵌入式系统设计制作一些简单实例。
这次课程设计给我们理论联系实际的机会,书本上的东西很抽象,通过这次课程设计,能够把自己的想法和设计实现是一件很开心的事情,而依靠自己独立思考发现并解决一个问题也更是一件开心的事情。
课程设计中也遇到了许多问题,比如:
老师给的参考程序并不能是LCD屏幕和CPU实验板上的灯同步闪烁,最后多次检查并和同学讨论才发现问题所在,问题程序代码如下:
for(i=0;i<100000;i++);
rPCONB=0x7cf;
rPDATB=0x7ef;
for(i=0;i<100000;i++);//***问题所在****
{处理函数}
当设置CPU板D7、D8灯亮灭后,又通过for(i=0;i<100000;i++);延时一段时间,才去修改LCD屏幕上的LCD两个灯,当去掉第二行延时代码时,LCD屏幕模拟的灯泡和CPU实验板上的D7、D8等同步闪烁。
课程设计让我认识到个人的力量是渺小的,依靠一个人的努力也是不够的,许多事情只有靠大家精诚合作,一起思考讨论,分工协作,才能完成。
大家之间要默契配合,相互理解,阐述各自对问题不同看法、不同理解的相互交流是发现问题学的新知的良好契机。
课程设计很快就结束了,我觉得最大的收获就是能够理论联系实际,把书本上的知识活学活用道实际中来解决一些实际问题,这样才能发挥用途。
独立思考解决问题,并能够接受他人意见来修正完善自己的想法,最终付诸于实现。
五、参考文献
[1]王永,何立民.嵌入式系统原理与设计[M].浙江:
浙江大学出版社.
[2]JeanJ.Labrosse著;邵贝贝等译.嵌入式实时操作系统μC/OS-Ⅱ第2版[M].北京:
北京航空航天大学出版社.
六、附录
1.主函数
voidMain(void)
{
Target_Init();//ARMII实验系统的初始化,包括CPU板
GUI_Init();
OSInit();//操作系统的初始化
Send_D7light_Sem=OSSemCreate(0);//创建信号量
Send_LCD_Sem=OSSemCreate(0);
OSTaskCreate(Task_1,(void*)0,(OS_STK*)&Stack_Task_1[STACKSIZE-1],5);
OSTaskCreate(Task_2,(void*)0,(OS_STK*)&Stack_Task_2[STACKSIZE*3-1],6);
OSSemPost(Send_LCD_Sem);
OSStart();
}
2.跑马灯闪烁程序(即延时程序)
voidtimedelay()
{
INT32Ui,k;
for(i=0;i<8;i++)
{
k=i%8;
switch(k)
{
case0:
Set_Color(GUI_RED);
Fill_Circle(220,80,20);//跑马灯1亮
Set_Color(GUI_GREEN);
Fill_Circle(262,98,20);//跑马灯2灭
Fill_Circle(280,140,20);//跑马灯3灭
Fill_Circle(262,182,20);//跑马灯4灭
Fill_Circle(220,200,20);//跑马灯5灭
Fill_Circle(178,182,20);//跑马灯6灭
Fill_Circle(160,140,20);//跑马灯7灭
Fill_Circle(178,98,20);//跑马灯8灭
break;
case1:
{处理函数1};//省略,类似case0处理函数
case2:
{处理函数2};//省略,类似case0处理函数
case3:
{处理函数3};//省略,类似case0处理函数
case4:
{处理函数4};//省略,类似case0处理函数
case5:
{处理函数5};//省略,类似case0处理函数
case6:
{处理函数6};//省略,类似case0处理函数
case7:
{处理函数7};//省略,类似case0处理函数
}
}
}
3.控制CPU板上D7、D8和LCD模拟灯同步闪烁部分程序
for(;;)
{
OSSemPend(Send_D7light_Sem,0,&err);
if(flag==0)
{
Set_Color(GUI_RED);
Fill_Circle(60,160,20);///LCD模拟D7亮Set_Color(GUI_BLACK);
Fill_Circle(60,100,20);
flag=1;
}
else
{
Set_Color(GUI_BLACK);
Fill_Circle(60,160,20);//LCD模拟D8亮
Set_Color(GUI_RED);
Fill_Circle(60,100,20);
flag=0;
}
OSSemPost(Send_LCD_Sem);
}
voidTask_1(void*pdata)
{
INT8Uerr;
INT32Uflag=0;
Rtc_Tick_Init();//打开时钟节拍,让操作系统跑起来
for(;;)
{
OSSemPend(Send_LCD_Sem,0,&err);
if(flag==0)
{
timedelay();//调用延时
rPCONB=0x7cf;
rPDATB=0x7ef;//CPU板上D7亮
flag=1;
}
else
{
timedelay();//调用延时
rPCONB=0x7cf;
rPDATB=0x7df;//CPU板上D8亮
flag=0;
}
OSSemPost(Send_D7light_Sem);
}
}