嵌入式系统课程设计基于UCOSII的LCD驱动设计.docx
《嵌入式系统课程设计基于UCOSII的LCD驱动设计.docx》由会员分享,可在线阅读,更多相关《嵌入式系统课程设计基于UCOSII的LCD驱动设计.docx(12页珍藏版)》请在冰豆网上搜索。
![嵌入式系统课程设计基于UCOSII的LCD驱动设计.docx](https://file1.bdocx.com/fileroot1/2022-12/17/751e8df8-1436-459b-9852-89d4afabaf10/751e8df8-1436-459b-9852-89d4afabaf101.gif)
嵌入式系统课程设计基于UCOSII的LCD驱动设计
课程设计报告
题目基于UCOSII的LCD驱动设计
专业通信工程
学号
授课班号
学生姓名
指导教师
摘要
近年来,嵌入式系统的应用已经越来越普及,对人类社会产生了巨大的影响。
μC/OS-II作为一种高可靠性的实时嵌入式操作系统已经被广泛使用在实际中,并且其具有简单易学、便于移植等特点。
本文综述了嵌入式系统发展现况,分析了μC/OS-II内核及其应用在8051单片机上的特点,并介绍了μC/OS-II编写驱动的方法和规则。
本设计以KeilC51为开发环境,通过修改函数使其可重入、修改堆栈设计等步骤,将μC/OS-II移植到了89C51单片机上,并编写了单片机上的LED模块、键盘模块及串行通讯模块的驱动,验证了移植μC/OS-II的正确性。
LCD是嵌入式操作系统的重要组成部分,是系统和用户之间进行交互和信息交换的媒介,它实现信息的内部形式与人类可以接受形式之间的转换。
用户可以只通过LCD监测系统内部运行状态,然后作出相应的处理。
因而具有良好的人机界面的嵌入式操作系统能过很好的完成系统开发、生产生活的需要!
关键词:
μC/OS-II;8051单片机;移植;驱动程序
绪言
1.ucos-II的简介及特点
(1)简介
μC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,作者是Micrium公司总裁JeanJ.Labrosse。
由于μC/OS-II的绝大部分代码是用ANSIC写的,因此可以较为方便的移植到多种微处理器,微控制器和数字处理芯片中(目前已经移植到超过100种以上的微处理器应用中)。
同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。
μC/OS-II已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO-178B标准,虽然这一特性对用户的需求并不一定实用,但却可在一定程度上
证明该系统的稳定和安全性。
(2)特点
1、公开源代码:
源代码完全公开;
2、可移植性强:
和处理器硬件相关的部分是用汇编些的,绝大部分是用C语言写的,可移植性很强;可以移植到8、16、32、64位处理器上运行;
3、可固化:
可固化到产品中,称为嵌入式产品的一部分;
4、可裁剪:
应用程序可以只使用需要的系统服务。
5、抢占式内核:
意味着操作系统总是运行优先级最高的就绪任务,
6、多任务:
ucosii可以管理64个任务,提供给用户用的是56个,系统保留8个任务。
7、任务栈:
每个任务有自己单独的栈;
8、系统服务:
ucosii提供很多系统服务,如邮箱、消息、信号量、时间相关函数。
9、中断管理:
可以使暂时执行的任务暂时挂起,如果高优先级的任务被中断唤醒,则去执行更高优先级的任务。
二、课题目标及总体方案
首先学习了解LCD的驱动程序,然后在移植好的UCOSII项目中添加LCD的驱动程序,最后能够在uCOSII下,编写LCD应用任务的简单编程实例,来检验LCD驱动程序的完好度。
本实验实例为在LCD屏上显示跑马灯,同时模拟CPU板上D7、D8灯的交替闪烁,闪烁周期为跑马灯周期。
1.LCD驱动程序组成
LCD驱动程序的文件夹Gui(如图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是供其他文件或自身调用的头文件。
2.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文件中编写。
3.应用程序
本实验实例为在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界面显示如下:
四、总结
实验结果显示出预期的LCD界面,LCD屏幕显示预定图案(如图2)。
屏幕上D7、D8随CPU板上的D7,D8两灯同步闪烁,而且跑马灯每转一周,两个等交替闪烁一次。
说明LCD驱动即添加到内核中没有问题,系统工作正常。
五、心得体会
课程设计终于完成了,小组的成员终于松了一口气。
一开始的时候。
遇到了很多问题,上课时老师说ARM汇编中,所有标号必须在一行的顶格书写,其后面不要添加“:
”,而所有指令均不能顶格书写。
ARM汇编对标识符的大小写敏感,书写标号及指令时字母大小写要一致。
在ARM汇编中,ARM指令、伪指令、寄存器名等可以全部大写或者全部小写,但不要大小写混合使用。
注释使用“;”号,注释的内容由“;”号起到此行结束,注释可以在一行的顶格书写。
可是实际中我们在编程序时,总是忘了这个忘了那个。
我说嘛,这程序明明没问题怎么老是编译错误,经过老师的指导问题顺利解决。
可是烧到实验箱里的时候发现烧不进去。
后来小组其他成员查资料才知道烧之前要先用软件检测一下芯片是否存在。
结果发现原来是数据线坏了。
经过‘九九八十一难’,终于搞好。
课程设计让我认识到个人的力量是渺小的,依靠一个人的努力也是不够的,许多事情只有靠大家精诚合作,一起思考讨论,分工协作,才能完成。
大家之间要默契配合,相互理解,阐述各自对问题不同看法、不同理解的相互交流是发现问题学的新知的良好契机。
课程设计很快就结束了,我觉得最大的收获就是能够理论联系实际,把书本上的知识活学活用道实际中来解决一些实际问题,这样才能发挥用途。
独立思考解决问题,并能够接受他人意见来修正完善自己的想法,最终付诸于实现。
六、参考文献
[1]王永,何立民.嵌入式系统原理与设计[M].浙江:
浙江大学出版社.
[2]JEANJ.LABROSSEμC/OS-II―源码公开的实时嵌入式操作系统.北京:
中国电力出版社,2001
[3]王田苗.嵌入式系统设计与实例开发.北京:
清华大学出版社,2002
[4]毛德操,胡希明.嵌入式系统[M].杭州:
浙江大学出版社,2003:
325334.
[5]JeanJ.Labrosse嵌入式实时操作系统μC/OS-Ⅱ第2版[M].北京:
北京航空航天大学出版社.
七、附录
源程序:
#include"..\inc\config.h"
#defineSTACKSIZE256
OS_STK_DATAstk;
externGUI_FONTCHINESE_FONT12;
externGUI_FONTCHINESE_FONT16;
externGUI_FONTGUI_Font8x16;
OS_EVENT*Send_D7light_Sem;
OS_EVENT*Send_LCD_Sem;
/*
*************************************************************************************************************
**分配各任务的堆栈容量**
*************************************************************************************************************
*/
OS_STKStack_Task_1[STACKSIZE];
OS_STKStack_Task_2[STACKSIZE*3];
/*
*************************************************************************************************************
-函数名称:
Task_3(void*pdata)
-函数说明:
GUI任务,优先级为56
-输入参数:
pdata
-输出参数:
无
*************************************************************************************************************
*/
voidTask_2(void*pdata)
{
INT8Uerr,flag=0;
Set_Color(GUI_WHITE);//LCD背景颜色
Fill_Rect(0,0,319,239);//背景颜色填充(0,0)至(319.239)的矩形
//画刷填充矩形
Set_Color(GUI_BLUE);//LCD方框颜色
Fill_Rect(0,0,319,2);//填充4条边
Fill_Rect(0,0,2,239);
Fill_Rect(0,237,319,239);
Fill_Rect(317,0,319,239);
Set_Color(GUI_WHITE);//小组成员姓名学号显示
Set_Font(&CHINESE_FONT16);
Disp_String(CN_start"河海大学常州校区"CN_end,5,10);
Set_Color(GUI_WHITE);//小组成员姓名学号显示
Set_Font(&CHINESE_FONT16);
Disp_String(CN_start"嵌入式课设"CN_end,5,30);
Set_Color(GUI_WHITE);
Set_Font(&CHINESE_FONT16);
Disp_String(CN_start"指导老师:
许老师"CN_end,5,50);
Set_Color(GUI_WHITE);
Set_Font(&CHINESE_FONT16);
Disp_String(CN_start"课题:
液晶驱动"CN_end,5,70);
Set_Color(GUI_WHITE);//小组成员姓名学号显示
Set_Font(&CHINESE_FONT16);
Disp_String(CN_start"小组成员:
"CN_end,160,5);
Set_Color(GUI_WHITE);
Set_Font(&CHINESE_FONT16);
Disp_String(CN_start"徐维响"CN_end,160,25);
Set_Color(GUI_WHITE);
Set_Font(&CHINESE_FONT16);
Disp_String(CN_start"徐帅东"CN_end,160,45);
Set_Color(GUI_WHITE);
Set_Font(&CHINESE_FONT16);
Disp_String(CN_start"周斌"CN_end,160,65);
Set_Color(GUI_WHITE);
Set_Font(&GUI_Font8x16);
Disp_String("0962310229",230,25);
Set_Color(GUI_WHITE);
Set_Font(&GUI_Font8x16);
Disp_String("0962310228",230,45);
Set_Color(GUI_WHITE);
Set_Font(&GUI_Font8x16);
Disp_String("0962310231",230,65);
Set_Color(GUI_WHITE);//设定字体颜色
Set_Font(&GUI_Font8x16);//设定字体类型
Disp_String("D7",5,175);//D7位置
Disp_String("D8",5,115);//D8位置
for(;;)//闪烁
{
OSSemPend(Send_D7light_Sem,0,&err);
if(flag==0)//0状态
{
Set_Color(GUI_GREEN);//圆1颜色
Fill_Circle(50,120,20);
//圆1位置
Set_Color(GUI_RED);
//圆2颜色
Fill_Circle(50,180,20);//圆2位置
flag=1;//转换为1状态
}
else//其他状态(即1状态)
{
Set_Color(GUI_RED);//圆1颜色
Fill_Circle(50,120,20);
Set_Color(GUI_GREEN);//圆2颜色
Fill_Circle(50,180,20);
flag=0;//转换为0状态
}
OSSemPost(Send_LCD_Sem);
}
}
/*
*************************************************************************************************************
-函数名称:
Task_START
-函数说明:
系统启动后运行的第一个任务,,点亮D7熄灭D8
-输入参数:
pdata
-输出参数:
无
*************************************************************************************************************
*/
voidTask_1(void*pdata)
{
INT32Uflag=0;
INT8Uerr;
Rtc_Tick_Init();//打开时钟节拍,让操作系统跑起来
for(;;)
{
inti;
OSSemPend(Send_LCD_Sem,0,&err);
if(flag==0)
{
for(i=0;i<500000;i++);
rPCONB=0x7cf;
rPDATB=0x7ef;
flag=1;
}
else
{
for(i=0;i<500000;i++);
rPCONB=0x7cf;
rPDATB=0x7df;
flag=0;
}
OSSemPost(Send_D7light_Sem);
}
}
/*
*************************************************************************************************************
-函数名称:
Main(void)
-函数说明:
系统的主程序入口
-输入参数:
无
-输出参数:
无
*************************************************************************************************************
*/
voidMain(void)
{
Target_Init();//ARMII实验系统的初始化,包括CPU板
GUI_Init();
OSInit();//操作系统的初始化
Send_D7light_Sem=OSSemCreate(0);
Send_LCD_Sem=OSSemCreate(0);
OSSemPend;
OSSemPost(Send_D7light_Sem);//创建信号量
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],56);//创建任务二
OSStart();
}