061316 叶尔多斯 嵌入式系统课程设计报告.docx
《061316 叶尔多斯 嵌入式系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《061316 叶尔多斯 嵌入式系统课程设计报告.docx(28页珍藏版)》请在冰豆网上搜索。
061316叶尔多斯嵌入式系统课程设计报告
课程设计报告
基于ARM的嵌入式电子点菜系统
班级:
090613
学号:
2009061316
姓名:
叶尔多斯·海拉提
教师评语:
教师签名:
2012年10月
课程设计题目
基于ARM的嵌入式电子点菜系统
主要内容
综合运用液晶屏、触摸屏、键盘、绘图API、图形控件和消息
循环等知识,基于ARM处理器编写一段实用的电子点菜器程序。
采用的工具方法
运行环境:
博创UP-3000实验台
编译软件:
MetrowerksCodeWorriorforARMDeveloperSuitev1.2
芯片:
三星S3C44B0X01芯片
编译语言:
C/C++
进度安排
1~4周:
编译代码
5~7周:
运行实现
8周:
测试
参考资料
《基于ARM的嵌入式系统设计实验与实践教程》
1.题目
基于ARM的嵌入式电子点菜系统
2.系统简介
在基于ARM的嵌入式环境下,本电子点菜系统可实现的功能有:
支持触摸屏图形选菜以及记录菜单等功能。
界面美观,功能合理,基本达到了实验要求的内容。
3.系统设计
3.1设计背景
随着我国的餐饮企业的蓬勃发展,餐饮行业成为国内最早的一个完全市场化的行业,个体民营占绝对优势和主导的行业,市场竞争非常充分,在广大的餐饮企业的经营者的不懈努力下,餐饮行业取得了非常突出的发展和进步。
3.2设计意义
传统的点菜方式由人工来传递菜单,不仅浪费时间、效率低下;一旦生意火热,单据多,信息量大时,分单、传菜等环节很容易出现错误,从而直接影响服务质量。
导致企业造成不必要的损失。
而本文介绍的电子点菜系统,大大降低人力资源成本,加快各环节之间的数据流通,对企业软环境的档次有较大提高。
在以特色服务吸引客户的同时,有效提高餐饮机构的服务质量和工作效率,为餐饮业创造更多利润。
3.3总体设计
图1实验程序流程图
3.4代码编译及注释
本实验要求实现部分:
(1)、MainTask中按键消息获取,处理
(2)、按键处理函数OnKey()函数
(3)、创建串口处理任务Serial_Receive_Task(void*Id)
(4)、实现串口消息换取,处理(在LCD或数码管上显示)函数OnReceive(charnRdata)
初始化操作:
voidinitOSGUI()//初始化操作系统的图形界面
{
initOSMessage();
initOSList();
initOSDC();
initOSCtrl();
initOSFile();
}
/////////////////////////////////////////////////////
//Mainfunction.//
////////////////////////////////////////////////////
intmain(void)
{
ARMTargetInit();//开发板初始化
OSInit();//操作系统初始化
uHALr_ResetMMU();//复位MMU
LCD_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);//等待消息
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
{
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()函数,进行界面初始化并显示图像,包括创建列表框控件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"
#include
#include"..\inc\template.h"
#include"..\inc\experiment.h"
#include"..\inc\OSFile.h"
#include"..\inc\drv\Ustring.h"
#include
#include"..\UCOS-II\uhal\uart.h"
//#include"..\inc\exio.h"
externintZlg7289SIOBand;
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_Prio13
OS_STKDynamic_Display_Task_Stack[STACKSIZE*8]={0,};
voidDynamic_Display_Task(void*Id);
#defineDynamic_Display_Task_Prio52
/**************已经定义的OS任务*************
tcp监控任务11
以太网物理层监控任务8
触摸屏任务9
键盘任务10
lcd刷新任务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);
OS_EVENT*Uart_Rw_Sem;//Uart读写控制权旗语
//andyoucanuseitasfolloeing:
//Uart_Rw_Sem=OSSemCreate
(1);//创建Uart读写控制权旗语,初值为1满足互斥条件//
//OSSemPend(Uart_Rw_Sem,0,&err);
//OSSemPost(Uart_Rw_Sem);
//////////////////////////////////////////////////////////
voidinitOSGUI()//初始化操作系统的图形界面
{
initOSMessage();
initOSList();
initOSDC();
initOSCtrl();
initOSFile();
}
/////////////////////////////////////////////////////
//Mainfunction.//
////////////////////////////////////////////////////
intmain(void)
{
ARMTargetInit();//开发板初始化
OSInit();//操作系统初始化
uHALr_ResetMMU();//复位MMU
LCD_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);//创建系统任务
////////////////////////////////////////////////////
//创建串口任务
//OSTaskCreate(Dynamic_Display_Task,(void*)0,(OS_STK*)&Dynamic_Display_Task_Stack[STACKSIZE*8-1],Dynamic_Display_Task_Prio);
////////////////////////////////////////////////////
OSAddTask_Init();//创建系统附加任务
LCD_printf("StartinguCOS-II...\n");
LCD_printf("Enteringgraphmode...\n");
LCD_ChangeMode(DspGraMode);//变LCD显示模式为文本模式
InitRtc();//初始化系统时钟
Nand_Rw_Sem=OSSemCreate
(1);//创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//
OSStart();//操作系统任务调度开始
//不会执行到这里
return0;
}
/*char*KeyTable[]={"NumLock","/","*","-","7","8","9","+","4","5","6","1","2","3","Enter","0","."};
voidonKey(intnkey,intfnkey)
{
PDCpdc;//创建绘图设备上下文结构
U16ch[10];
ClearScreen();//清屏
pdc=CreateDC();//创建绘图设备上下文
Uart_Printf("key=%s\n",KeyTable[nkey]);
strChar2Unicode(ch,KeyTable[nkey]);
//将数据转化成Unicode转化函数参考\\INC\\DRV\\ustring.h
SetPenColor(pdc,RGB(255,0,0));
LCD_printf(KeyTable[nkey]);
LCD_printf("\n");
//TextOut(pdc,100,100,ch,TRUE,FONTSIZE_MIDDLE);
//文本模式下显示文字
DestoryDC(pdc);//删除绘图设备上下文
}
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
voidMain_Task(void*Id)//Main_Test_Task
{
POSMSGpMsg=0;
intjudge=0;
intsysnumber=0;
inti=0;
intj=0;
U16str[20];
PDCpdc;
intprice[6]={50,50,80,280,180,80};
chardj_Pict[12]={'1','2','8','_','3','7','','','B','M','P',0};
chardj_Pict1[12]={'1','2','8','_','3','5','','','B','M','P',0};
chardj_Pict2[12]={'1','2','8','_','3','6','','','B','M','P',0};
charbmpnamelogo1[12]={'0','0','0','_','0','1','','','B','M','P',0};
charbmpnamelogo2[12]={'0','0','0','_','0','2','','','B','M','P',0};
charbmpnamelogo3[12]={'0','0','0','_','0','3','','','B','M','P',0};
charbmpnamelogo4[12]={'0','0','0','_','0','4','','','B','M','P',0};
charbmpnamelogo5[12]={'0','0','0','_','0','5','','','B','M','P',0};
charbmpnamelogo6[12]={'0','0','0','_','0','6','','','B','M','P',0};
intstate,statea,stateb,statec,stated,statee,statef;
structPOINTTouch_Position,*pTouch_Position;
structRECTrect,recta,rectb,rectc,rectd,recte,rectf;
structRECT*prect,*precta,*prectb,*prectc,*prectd,*precte,*prectf;
PTextCtrlpTextCtrl;
state=0;
statea=0;
stateb=0;
statec=0;
stated=0;
statee=0;
statef=0;
recta.left=0;
recta.top=0;
recta.right=320;
recta.bottom=30;
rectb.left=0;
rectb.top=32;
rectb.right=320;
rectb.bottom=62;
rectc.left=0;
rectc.top=64;
rectc.right=320;
rectc.bottom=94;
rectd.left=0;
rectd.top=96;
rectd.right=320;
rectd.bottom=126;
recte.left=0;
recte.top=128;
recte.right=320;
recte.bottom=158;
rectf.left=0;
rectf.top=160;
rectf.right=320;
rectf.bottom=190;
rect.left=80;
rect.top=200;
rect.right=300;
rect.bottom=240;
pTouch_Position=&Touch_Position;
prect=▭
precta=&recta;
prectb=&rectb;
prectc=&rectc;
prectd=&rectd;
precte=&recte;
prectf=&rectf;
ClearScreen();
InitInterface();
Uart_Printf("这是01号桌");
//消息循环
for(;;){
pMsg=WaitMessage(0);//等待消息
switch(pMsg->Message){
caseOSM_KEY:
//Uart_Printf("%d",pMsg->WParam);
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))
{