课程设计报告基于ARM的嵌入式电子点菜系统班级:学号:姓名:教师评语:教师签名:2012年10月课程设计题目基于ARM的嵌入式电子点菜系统主要内容综合运用液晶屏、触摸屏、键盘、绘图API、图形控件和消息循环等知识,基于ARM处理器编写一段实用的电子点菜器程序。采用的工具方法运行环境:博创UP-3000实验台编译软件:MetrowerksCodeWorriorforARMDeveloperSuitev1.2芯片:三星S3C44B0X01芯片编译语言:C/C++进度安排1~4周:编译代码5~7周:运行实现8周:测试参考资料《基于ARM的嵌入式系统设计实验与实践教程》-1-1.题目基于ARM的嵌入式电子点菜系统2.系统简介在基于ARM的嵌入式环境下,本电子点菜系统可实现的功能有:支持触摸屏图形选菜以及记录菜单等功能。界面美观,功能合理,基本达到了实验要求的内容。3.系统设计3.1设计背景随着我国的餐饮企业的蓬勃发展,餐饮行业成为国内最早的一个完全市场化的行业,个体民营占绝对优势和主导的行业,市场竞争非常充分,在广大的餐饮企业的经营者的不懈努力下,餐饮行业取得了非常突出的发展和进步。3.2设计意义传统的点菜方式由人工来传递菜单,不仅浪费时间、效率低下;一旦生意火热,单据多,信息量大时,分单、传菜等环节很容易出现错误,从而直接影响服务质量。导致企业造成不必要的损失。而本文介绍的电子点菜系统,大大降低人力资源成本,加快各环节之间的数据流通,对企业软环境的档次有较大提高。在以特色服务吸引客户的同时,有效提高餐饮机构的服务质量和工作效率,为餐饮业创造更多利润。3.3总体设计-2-目标板初始化绘制初始界面等待系统消息判断消息类型菜单处理程序键盘消息菜单处理程序触摸屏消息结束界面显示图1实验程序流程图3.4代码编译及注释本实验要求实现部分:(1)、MainTask中按键消息获取,处理(2)、按键处理函数OnKey()函数(3)、创建串口处理任务Serial_Receive_Task(void*Id)(4)、实现串口消息换取,处理(在LCD或数码管上显示)函数OnReceive(charnRdata)初始化操作:voidinitOSGUI()//初始化操作系统的图形界面{initOSMessage();initOSList();initOSDC();initOSCtrl();initOSFile();}/////////////////////////////////////////////////////-3-//Mainfunction.//////////////////////////////////////////////////////intmain(void){ARMTargetInit();//开发板初始化OSInit();//操作系统初始化uHALr_ResetMMU();//复位MMULCD_Init();//初始化LCD模块LCD_printf(LCDinitializationisOK\n);//向液晶屏输出数据LCD_printf(320x240TextMode\n);initOSGUI();//初始化图形界面LoadFont();//调Unicode字库LoadConfigSys();//使用config.sys文件配置系统设置LCD_printf(CreatetaskonuCOS-II...\n);OSTaskCreate(Main_Task,(void*)0,(OS_STK*)&Main_Stack[STACKSIZE*8-1],Main_Task_Prio);//创建系统任务3.4.1触摸功能设计实现设计思想是让LCD显示屏每页显示六道菜,触摸实现点菜确认,所以在触摸屏上安排了九个区间的触摸功能用以下代码完成触摸区域。recta.left=0;recta.top=0;recta.right=320;recta.bottom=30;//定义触摸区域大小pTouch_Position=&Touch_Position;prect=▭precta=&recta;prectb=&rectb;prectc=&rectc;prectd=&rectd;precte=&recte;prectf=&rectf;如上,定义上下左右四个区间的大小来完成触摸区域,六道菜六个触摸区域区域大小根据图片大小而定。触摸区域完成后,就是实现触摸点菜功能了,在这里,我们用到了消息循环,即InitInterface();Uart_Printf(这是01号桌);在进入点菜界面之前有一个欢迎界面,需要通过按键进入点菜界面,这里使用for循环用来判断。for(;;){pMsg=WaitMessage(0);//等待消息-4-switch(pMsg-Message){caseOSM_KEY:这里的caseOSM_KEY表示按键事件,后面用了一个judge函数来进行判断if(judge==0){num=0;state=0;statea=0;stateb=0;statec=0;stated=0;statee=0;statef=0;if(onKey(pMsg-WParam,pMsg-LParam)){judge=1;pdc=CreateDC();ShowBmp(pdc,bmpnamelogo1,70,1);ShowBmp(pdc,bmpnamelogo2,200,1);ShowBmp(pdc,bmpnamelogo3,70,80);ShowBmp(pdc,bmpnamelogo4,200,80);ShowBmp(pdc,bmpnamelogo5,70,160);ShowBmp(pdc,bmpnamelogo6,200,160);OSTimeDly(100);judge==1表示发生了这个事件,进入点菜界面。进入点菜界面后,可以看见每排2道菜,一共六道菜,这是用到了消息循环,同时用用了一次ifjudge来进行点菜判断,同时定义IsInRect2(prect1,pTouch_Position)函数来判断prect1指向的区域是否有触摸动作,有则同样跳转到菜单画面,caseOSM_TOUCH_SCREEN:表示触摸屏动作后系统需响应的进程。if(judge==1){if(IsInRect2(precta,pTouch_Position)){if(statea==0){ShowBmp(pdc,dj_Pict,20,5);statea=1;Uart_Printf(01号桌点了小鸡炖蘑菇\t);sysnumber=sysnumber+price[0];Int2Unicode(sysnumber,str);SetTextCtrlText(pTextCtrl,str,TRUE);num=sysnumber;}Else{-5-FillRect(pdc,20,5,40,25,GRAPH_MODE_NORMAL,COLOR_WHITE);DrawRectFrame(pdc,20,5,40,25);statea=0;Uart_Printf(01号桌取消您点了小鸡炖蘑菇\t);sysnumber=sysnumber-price[0];Int2Unicode(sysnumber,str);SetTextCtrlText(pTextCtrl,str,TRUE);num=sysnumber;}}elseif(IsInRect2(prectb,pTouch_Position))···DeleteMessage(pMsg);//删除消息,释放资源OSTimeDly(200);}DestoryDC(pdc);}用消息循环来实现点菜和取消点菜的过程,点一下图片为点菜,再点一下就取消了点菜。3.4.2菜单记录的设计实现在最开始初始化完成之后,创建了文本框在点菜界面右下角用来记录菜单,具体代码如下:pTextCtrl=CreateTextCtrl(101,&rect,FONTSIZE_MIDDLE,CTRL_STYLE_FRAME,NULL,NULL);SetTextCtrlText(pTextCtrl,str,TRUE);//设置文本框内容在定义图片之前设置了每道菜的单价:intprice[6]={50,50,80,280,180,80};之后每点一道菜,系统自动判断类别并进行菜单记录,增删菜价。SetTextCtrlText(pTextCtrl,str,TRUE);4.系统实现(1)在ADS1.2中,新建一个项目menu,把操作系统所需要的头文件(*.h)和库文件(*.alf)加入工程中。(2)在创建的Main.c文件中,在Main_Task任务中添加代码,初始化一些变量包括:创建绘图用的DC(createDC)并在绘图完成后删除它(DestoryDC);启动消息循环,等待键盘扫描任务和触摸屏任务发来的消息,并调用相应的函数进行处理。(3)创建界面函数e.c并添加代码,主要定义InitInterface()函数,进行界面初始化-6-并显示图像,包括创建列表框控件InitCtrl()和显示初始图片。InitPicture()。(4)编译通过后,下载到试验台中运行。(5)附(系统源代码Main.c):#include..\ucos-ii\includes.h/*uC/OSinterface*/#include..\ucos-ii\add\osaddition.h#include..\inc\drv.h#include..\inc\drv\zlg7289.h#includestring.h#include..\inc\template.h#include..\inc\experiment.h#include..\inc\OSFile.h#include..\inc\drv\Ustring.h#includemath.h#include..\UCOS-II\uhal\uart.h//#include..\inc\exio.hexternintZlg7289SIOBand;externintZlg7289SIOCtrl;intnum=0;#pragmaimport(__use_no_semihosting_swi)//ensurenofunctionsthatusesemihosting///******************任务定义***************///OS_STKMain_Stack[STACKSIZE*8]={0,};//Main_Test_Task堆栈voidMain_Task(void*Id);//Main_Test_Task#defineMain_Task_Prio13OS_STKDynamic_Display_Task_Stack[STACKSIZE*8]={0,};voidDynamic_Display_Task(void*Id);#defineDynamic_Display_Task_Prio52/**************已经定义的OS任务*************tcp监控任务11以太网物理层监控任务8触摸屏任务9键盘任务10lcd刷新任务59系统任务1*****************************************************////*****************事件定义*****************///OS_EVENT*Nand_Rw_Sem;//Nand_Flash读写控制权旗语//andyoucanuseitasfolloeing://Nand_Rw_Sem=OSSemCreate(1);//创建Nand-Flash读写控制权旗语,初值为1满足互斥条件////OSSemPend(Nand_Rw_Sem,0,&err);//OSSemPost(Nand_Rw_Sem);-7-OS_EVENT*Uart_Rw_Sem;//Uart读写控制权旗语//andyoucanuseitasfolloei