嵌入式课程设计报告基于lcd的电子时钟.doc
河海大学计算机及信息工程学院(常州)课程设计报告 题 目 基于LCD的电子时钟 专业学号 电子信息工程 0962610222 授课班号 277701 学生姓名 王宁 指导教师 梁瑞宇 完成时间 课程设计(报告)任务书(理 工 科 类)、课程设计(报告)题目: 基于LCD的电子时钟实验 、课程设计(论文)工作内容一、课程设计目标 1、培养综合运用知识和独立开展实践创新的能力;2、培养学生将理论知识与实际应用结合在一起;3、培养学生的自我学习能力和解决问题的能力;4、培养学生的协作意识和团队合作能力;5、培养学生的总结经验的能力。二、研究方法及手段应用1、问题解决模块化,将任务分成若干模块,分模块调试和完成任务;2、查阅网上的相关素材,查阅相关论文资料,进行比较、研究;3、在独立思考的基础上,请教老师,和同组同学讨论、学习;4、反复调试、总结经验、排除差错;5、连接PC和EL-ARM-830实验箱,完成整个实验环境搭建;6、运用Code Warrior for ARM编译软件编译汇编语言和进行调试;7、使用H-JTAG下载至硬件进行观察、调试。三、课程设计预期效果1、在液晶屏上显示表盘,和时间点和时、分、秒针;2、在液晶屏上显示时、分、秒、年、月、日;3、在液晶屏上实现指针的动态图像;4、可以实现自己设定的初始时间。学生姓名: 王宁 专业年级: 09电子信息工程 目录前言4第一章系统设计5第一节课题目标及总体方案5第二节相关组件说明5第三节项目设计模块描述及流程图7883. 表盘下日期的显示模块9 10第二章结果与显示11结果显示11心得体会12参考文献13附 录13前 言近年来,随着计算机技术及集成电路技术的发展,嵌入式技术日渐普及,在通讯、网络、工控、医疗、电子等领域发挥着越来越重要的作用。嵌入式系统无疑成为当前最热门最有发展前途的IT应用领域之一。实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。RTC具有计时准确、耗电低和体积小等特点,特别适用于在各种嵌入式系统忠记录事件发生的时间和相关信息,尤其是在通信工程、电力自动化、工业控制等自动化程度较高领域的无人职守环境。随着集成电路技术的不断发展,RTC器件的新品也不断推出。这些新品不仅具有准确的RTC,还有大容量的存储器、温度传感器和A/D数据采集通道等,已成为集RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统。关键字:嵌入式系统、实时时钟RTC第一章系统设计第一节课题目标及总体方案随着嵌入式技术的发展,我们身边充斥着各类各样的嵌入式电子产品。实时时钟(RTC)就是一种在现代电子设备中应用非常普遍,可以帮助人们实时、准确的掌握时间的器件,如 、PDA及一些智能仪表都提供了时钟显示。我们本次课题的目标就是要基于S3C44BOX芯片设计出一个实时时钟,编写汇编语言可以通过Code Warrior for ARM软件调试,然后下载至实验箱内进行观察。在试验箱中的LCD液晶屏幕上显示出时钟的圆盘和动态的指针,并在时钟下方显示出当前的年份和日期。另外,我们将要实现的系统分为几个模块实现,每个模块间相对独立而又相互联系,在主函数中进行调用。 第二节相关组件说明一、LCD显示原理S3C44B0X 中具有内置的LCD 控制器,它能将显示缓存(在SDRAM存储器中)中的LCD图像数据传输到外部的LCD驱动电路上的逻辑功能。它支持单色、4级、16级灰度LCD显示,以及256彩色LCD显示。在显示灰度时,它采用时间抖动算法(time-based dithering algorithm)和帧率控制 (Frame Rate Control)方法,在显示彩色时,它采用RGB的格式,即RED、GREEN、BLUE,三色混合调色。通过软件编程,可以实现233或332的RGB调色的格式。对于不同尺寸的LCD显示器,它们会有不同的垂直和水平象素点、不同的数据宽度、不同的接口时间及刷新率,通过对LCD 控制器中的相应寄存器写入不同的值,来配置不同的LCD 显示板。本次课设的显示模式设置为8bit单扫描模式。二、项目文件说明本实验使用实验教学系统的CPU板,液晶显示器(LCD),在LCD下方,有一个可调电阻,标号为VR2,它用来调整LCD的对比度及亮度。在LCD的右下方,有一个黄头的按键,它用来开关LCD,它的标号为LCD_ON/OFF。该项目添加了包含LCD驱动程序的文件夹Gui,其中,包括四个文件夹,Font中存放的是字体文件,Glib中存放绘图的中层和上层的函数,上层函数是直接供用户调用的API,Init中存放GUI初始化的函数,Lcddriver中存放的是LCD的底层驱动函数。以及对LCD控制器的初始化函数。把LCD驱动程序加入的过程,也就是把整个GUI文件夹加入该项目里,同时,还要在ApplicationINC目录下的config.h文件中,加入GUI程序的头文件,#include "."extern GUI_FONT CHINESE_FONT12;等外部定义过的字体。图1第三节项目设计模块描述及流程图1.模块描述:我先进行了整个系统的规划,将整个系统分为四大模块:第一,主函数模块;第二,时钟表盘的构建模块,包括:设置液晶全屏背景色、绘制时钟表盘形状并着色、绘制表盘内12个点的形状并着色以及绘制表盘内指针的形状并着色;第三,表盘下日期的显示模块,包括:定位表盘下时间和日期的坐标和日期显示函数的编写;第四,任务运行模块。2.流程图:一、主函数模块二、时钟表盘的构建模块(1)绘制时钟表盘形状并着色(2)绘制表盘内12个点的形状并着色(3)绘制表盘内指针的形状并着色(以秒针为例)三、表盘下日期的显示模块(1)定位表盘下时间和日期的坐标(仍以秒计时为例)(2)日期显示函数的编写四、任务运行模块第二章结果与显示结果显示1.经过多次的调试和排查,以及总结,使用编译器编译,编译器提示编译文件正确,没有出现任何错误,没有出现任何警告,而且编译出文件容量很小,下载迅速,符合软件设计要求。2.下面的图片是从实验箱上的LCD屏幕上显示的图像拍下来的,也就是我本次课程设计的成果。从图片显示上可以看出,所有预计实现的功能和界面都实现了。表盘显示在相对中央的地方,整个屏幕以白色为基调,表盘底色为灰色,指针为红、绿、黄三种颜色,点数为绿色,表盘下方显示当前时间、日期,同时界面很漂亮,色彩对比很鲜明。 图2效果显示图心得体会说实话, 刚开始拿到课设题目的时候感觉毫无头绪,即使在查阅了大量相关资料的基础上。后来,手上有了一份参考程序,打开一看,顿时懵了。当时想如果纯粹靠我自己或者和同学讨论,恐怕很难完成这次课设吧。于是,实验室刚开放,我就立刻去调试程序,通过观察试验箱上显示的结果来理解程序。一个模块一个模块对应的理解下去之后,思路开始清晰起来。每当遇到一行程序不懂或者有疑问时,比如这行程序起什么作用、可不可以删掉或者可不可以换个位置,我都通过程序的相关改动结合实验结果的观察将这些疑问解决掉了。同时,同学的帮助也给了我很多的启发,非常感谢他们。但不得不承认,关于C/OS-II操作系统方面理解的很不透彻。验收时,我只是把时钟界面的构建部分理解了,没有过多的加深对操作系统C/OS-II的学习,所以验收时对于老师的提问也是磕磕绊绊。因而,在编写这份报告前,我又认真地上网搜索了C/OS-II操作系统的简介,尤其是它的优点和任务调度方面。在写这份报告时,我也许还没能完全弄懂C/OS-II操作系统,但我相信,只要努力过,总会有收获。参考文献 吴学智,基于ARM的嵌入式系统设计与开发 人民邮电出版社,2007金建设,嵌入式系统基础实验大连理工大学出版社,2009王晓薇,嵌入式硬件基础实验与习题解答电子工业出版社,2009附录1. 软件清单:1)Code Warrior for ARM编译软件;2)AXD Debugger 调试软件;3)H-JTAG软件;2. 硬件:PC和EL-ARM-830实验箱;程序清单:#include ".incconfig.h"#define x_line 160#define y_line 80extern GUI_FONT CHINESE_FONT12;extern GUI_FONT CHINESE_FONT16;extern GUI_FONT GUI_Font8x16;I8 Hour3,Min3,Sec3;I8 hour = 9, min = 0, sec = 0,ms;I8 YEA13,YEA23,MON3,DAY3;int yea1 = 20,yea2=12, mon = 5, day = 18;I8 XH13,XH23,XH33,XH43,XH53,XH63,XH73;int xh1=9,xh2=62,xh3=61;int xh4=02,xh5=19,xh6=22,xh7=23;/SpaceXS61、SpacYS61分别表示秒针的横坐标、纵坐标/SpaceXM61、SpaceXM61分别表示分针的横坐标、纵坐标/SpaceXH13、SpacYH13 分别表示时针的横坐标、纵坐标int SpaceXS61=160,165,170,175,180,185,189,193,197,201,205,206,207,208,209,210,209,208,207,206,205,201,197,193,189,185,180,175,170,165,160,155,150,145,140,135,131,127,123,119,115,114,113,112,111,110,111,112,113,114,115,119,123,127,131,135,140,145,150,155,160, , SpaceYS61=30,31,32,33,34, 35,39,43,47,51, 55,60,65,70,75, 80,85,90,95,100, 105,109,113,117,121, 125,126,127,128,129, 130,129,128,127,126, 125,121,117,113,109, 105,100,95,90,85, 80,75,70,65,60, 55,51,47,43,39, 35,34,33,32,31,30, SpaceXM61=160,164,168,172,176,180,183,186,189,192, 195,196,197,198,199,200,199,198,197,196, 195,192,189,186,183,180,176,172,168,164, 160,156,152,148,144,140,137,134,131,128, 125,124,123,122,121,120,121,122,123,124, 125,128,131,134,137,140,144,148,152,156, 160 , SpaceYM61=40,41,42,43,44,45,48,51,54,57, 60,64,68,72,76,80,84,88,92,96, 100,103,106,109,112,115,116,117,118,119, 120,119,118,117,116,115,112,109,106,103, 100,96,92,88,84,80,76,72,68,64, 60,57,54,51,48,45,44,43,42,41, 40 , SpaceXH13=160,175,185,190,185,175,160,145,135,130,135,145,160, SpaceYH13=50,55,65,80,95,105,110,105,95,80,65,55,50,/当前要显示的时间的3个指针的坐标取地址。 *Placex=&SpaceXS0,*Placey=&SpaceYS0,*Placexm=&SpaceXM0,*Placeym=&SpaceYM0, *Placexh=&SpaceXH9,*Placeyh=&SpaceYH9;/显示学号函数 void Display_xh1(char xx1,char yy1);void Display_xh2(char xx2,char yy2);void Display_xh3(char xx3,char yy3);/show s and m and hvoid Shows() Set_Color(GUI_GRAY); /擦除上一秒的 Draw_Line(x_line,y_line,*Placex,*Placey); Placex=Placex+1; Placey=Placey+1; Set_Color(GUI_YELLOW); /显示下一秒的 Draw_Line(x_line,y_line,*Placex,*Placey); Set_Color(GUI_RED); /显示下一分的 Draw_Line(x_line,y_line,*Placexm,*Placeym); Set_Color(GUI_GREEN); /显示下一时的 Draw_Line(x_line,y_line,*Placexh,*Placeyh); if(Placex=&SpaceXS60&&Placey=&SpaceYS60) Placex=&SpaceXS0; Placey=&SpaceYS0; /show munite and hourvoid Showm() Set_Color(GUI_GRAY); /擦除上一分的 Draw_Line(x_line,y_line,*Placexm,*Placeym); Placexm=Placexm+1; Placeym=Placeym+1; Set_Color(GUI_RED); /显示下一分的 Draw_Line(x_line,y_line,*Placexm,*Placeym); Set_Color(GUI_GREEN); /显示下一时的 Draw_Line(x_line,y_line,*Placexh,*Placeyh); if(Placexm=&SpaceXM60&&Placeym=&SpaceYM60) Placexm=&SpaceXM0; Placeym=&SpaceYM0; /show hourvoid Showh() Set_Color(GUI_GRAY); /擦除上一时的 Draw_Line(x_line,y_line,*Placexh,*Placeyh); Placexh=Placexh+1; Placeyh=Placeyh+1; Set_Color(GUI_GREEN); /显示下一时的 Draw_Line(x_line,y_line,*Placexh,*Placeyh); if(Placexh=&SpaceXH12&&Placeyh=&SpaceYH12) Placexh=&SpaceXH0; Placeyh=&SpaceYH0; void Shouw_Cricle() / 整 点Set_Color(GUI_GREEN); Fill_Circle (160, 30,2); / 12点(x,y,r) Fill_Circle (135, 35,2); / 11 点(x,y,r) Fill_Circle (115, 55,2); / 10 点(x,y,r) Fill_Circle (110, 80,2); / 9 点(x,y,r) Fill_Circle (115, 105,2); / 8 点(x,y,r) Fill_Circle (135, 125,2); / 7 点(x,y,r) Fill_Circle (160, 130,2); / 6 点(x,y,r) Fill_Circle (185, 125,2); / 5 点(x,y,r) Fill_Circle (205, 105,2); / 4 点(x,y,r) Fill_Circle (210, 80,2); / 3 点(x,y,r) Fill_Circle (205, 55,2); / 2点(x,y,r) Fill_Circle (185, 35,2); / 1点(x,y,r)/表盘背景色void Show_ht()Set_Color(GUI_GRAY); Fill_Circle (160,80,54);void Delay(int time);void ChangeForm(char Time,char time) Time0 = time / 10 + 48; Time1 = time % 10 + 48; Time2 = '0'void Display_Time(char x,char y) ChangeForm(Hour, hour); ChangeForm(Min, min); ChangeForm(Sec, sec); ChangeForm(MON, mon); ChangeForm(DAY, day); ChangeForm(YEA1, yea1); ChangeForm(YEA2, yea2); /Disp_String(const I8 *s, I16 x, I16 y),s:char ,x:x_label position y:y_label position Disp_String (Hour,x,160); Disp_String (":",x + 18,160); Disp_String (Min,x + 28,160); Disp_String (":",x + 46,160); Disp_String (Sec,x + 56,160); Disp_String (YEA1,x -5, 180); Disp_String (YEA2,x +11,180); Disp_String (".",x + 27,180); Disp_String (MON,x + 35,180); /40 Disp_String (".",x + 51,180); /56 Disp_String (DAY,x + 59,180);/64void Display_xh1(char xx1,char yy1) ChangeForm(XH1, xh1); ChangeForm(XH2, xh2); ChangeForm(XH3, xh3); ChangeForm(XH4, xh4); ChangeForm(XH5, xh5); Disp_String (XH1,xx1,yy1); Disp_String (XH2,xx1+16,yy1); Disp_String (XH3,xx1+32,yy1); Disp_String (XH4,xx1+48,yy1); Disp_String (XH5,xx1+64,yy1); void Display_xh2(char xx2,char yy2) ChangeForm(XH1, xh1); ChangeForm(XH2, xh2); ChangeForm(XH3, xh3); ChangeForm(XH4, xh4); ChangeForm(XH6, xh6); Disp_String (XH1,xx2,yy2); Disp_String (XH2,xx2+16,yy2); Disp_String (XH3,xx2+32,yy2); Disp_String (XH4,xx2+48,yy2); Disp_String (XH6,xx2+64,yy2); void Display_xh3(char xx3,char yy3) ChangeForm(XH1, xh1); ChangeForm(XH2, xh2); ChangeForm(XH3, xh3); ChangeForm(XH4, xh4); ChangeForm(XH7, xh7); Disp_String (XH1,xx3,yy3); Disp_String (XH2,xx3+16,yy3); Disp_String (XH3,xx3+32,yy3); Disp_String (XH4,xx3+48,yy3); Disp_String (XH7,xx3+64,yy3); void Show_Color()Set_Color( GUI_WHITE );/填充矩形函数 Fill_Rect(0,0,319,239); Set_Color(GUI_RED); Set_BkColor (GUI_WHITE); Fill_Rect(0,0,319,2); Fill_Rect(0,0,2,239); Fill_Rect(0,237,319,239); Fill_Rect(317,0,319,239); Set_Color(GUI_RED); Set_Font(&CHINESE_FONT16); /*- 函数名称 : StartTheSystem(void)- 函数说明 : 启动系统- 输入参数 : 无- 输出参数 : 无*/void StartTheSystem(void) for(;) /*全屏颜色设计*/ /*时 钟 位 置*/ Show_Color(); Show_ht(); /*点 的 坐 标*/ Shouw_Cricle(); /*设定背景颜色API*/ Set_Color(GUI_RED); /显示 Draw_Line(x_line,y_line,*Placex,*Placey); Set_Font(&GUI_Font8x16); Display_Time(130, 160);/时间 Set_Font(&CHINESE_FONT16); Disp_String(CN_start"实时时钟"CN_end,68,5); Set_Font(&CHINESE_FONT16); Disp_String(CN_start"嵌入式课程设计"CN_end, 138, 5); Set_Font(&CHINESE_FONT16); Disp_String(CN_start"庞荣"CN_end, 285, 100); Set_Font(&CHINESE_FONT16); Disp_String(CN_start"王宁"CN_end, 285, 120); Set_Font(&CHINESE_FONT16); Disp_String(CN_start"王尊志"CN_end, 268, 140); /显示 Set_Color(GUI_BLACK); /Dowhile循环实现时钟的计时 do Delay(1200); sec+; Shows(); Shouw_Cricle(); if (sec >= 60) sec = 0; min+; Showm(); if (min >= 60) min = 0; hour+; Showh(); if (hour >= 24) hour = 0; day+; if(day >=32) day = 1; mon+; if(mon >= 13) mon = 1; yea1+; Set_Font(&GUI_Font8x16); Display_Time(130, 160);/时间 日期 Display_xh1(0,100); Display_xh2(0,120); Display_xh3(0,140);while(1);/*/*主 函 数*/*/void Main(void) Target_Init(); / ARMII实验系统的初始化,包括CPU板/ ARMII实验系统的初始化,包括CPU板 GUI_Init(); /GUI的图形初始化 Rtc_Tick_Init(); /打开时钟节拍,让操作系统跑起来 StartTheSystem(); /启动系统