课程设计报告
电子点菜系统
班级:20090613 学号:2009061313 姓名:任欧
2012年10月
1. 题目
基于ARM的电子点菜系统
2.系统简介
随着我国的餐饮企业的蓬勃发展,餐饮行业成为国内最早的一个完全市场化的行业,个体民营占绝对优势和主导的行业,市场竞争非常充分,在广大的餐饮企业的经营者的不懈努力下,餐饮行业取得了非常突出的发展和进步。传统的点菜方式由人工来传递菜单,不仅浪费时间、效率低下;一旦生意火热,单据多,信息量大时,分单、传菜等环节很容易出现错误,从而直接影响服务质量。导致企业造成不必要的损失。而本文介绍的电子点菜系统,大大降低人力资源成本,加快各环节之间的数据流通,对企业软环境的档次有较大提高。在以特色服务吸引客户的同时,有效提高餐饮机构的服务质量和工作效率,为餐饮业创造更多利润。本系统就是通过无线连接达到了点菜的效果,在电脑终端显示顾客点的菜,省时省力。随着我国的餐饮企业的蓬勃发展,餐饮行业成为国内最早的一个完全市场化的行业,个体民营占绝对优势和主导的行业,市场竞争非常充分,在广大的餐饮企业的经营者的不懈努力下,餐饮行业取得了非常突出的发展和进步。
传统的点菜方式由人工来传递菜单,不仅浪费时间、效率低下;一旦生意火热,单据多,信息量大时,分单、传菜等环节很容易出现错误,从而直接影响服务质量。导致企业造成不必要的损失。
而本文介绍的电子点菜系统,大大降低人力资源成本,加快各环节之间的数据流通,对企业软环境的档次有较大提高。在以特色服务吸引客户的同时,有效提高餐饮机构的服务质量和工作效率,为餐饮业创造更多利润。
3.系统设计
本实验要求实现部分:
1 按键处理函数OnKey()函数
2 创建串口处理任务Serial_Receive_Task(void *Id)
3 实现串口消息换取,处理(在LCD或数码管上显示)函数OnReceive(char nRdata)
3.1系统运行流程图 3.2 消息运行的流程图
1菜单记录的设计实现
在最开始初始化完成之后,创建了文本框在点菜界面右下角用来记录菜单,具体代码如下:
pTextCtrl=CreateTextCtrl(101, &rect, FONTSIZE_MIDDLE, CTRL_STYLE_FRAME, NULL, NULL);
SetTextCtrlText(pTextCtrl, str,TRUE);//设置文本框内容 在定义图片之前设置了每道菜的单价: int price[6]={50,50,80,280,180,80};
之后每点一道菜,系统自动判断类别并进行菜单记录,增删菜价。 SetTextCtrlText(pTextCtrl, str,TRUE); 2初始化操作
void initOSGUI()//初始化操作系统的图形界面
{
initOSMessage();
initOSList();
initOSDC();
initOSCtrl();
initOSFile();
}
/////////////////////////////////////////////////////
// Main function. //
////////////////////////////////////////////////////
int main(void)
{
ARMTargetInit(); //开发板初始化
OSInit(); //操作系统初始化
uHALr_ResetMMU();//复位MMU
LCD_Init(); //初始化LCD模块
LCD_printf("LCD initialization is OK\n");//向液晶屏输出数据
LCD_printf("320 x 240 Text Mode\n");
initOSGUI();//初始化图形界面
LoadFont();//调Unicode字库
LoadConfigSys();//使用config.sys文件配置系统设置
LCD_printf("Create task on uCOS-II...\n");
OSTaskCreate(Main_Task,(void*)0,(OS_STK*)&Main_Stack[STACKSIZE*8-1],
Main_Task_Prio);// 创建系统任务
设计思想是让LCD 显示屏每页显示六道菜,触摸实现点菜确认,所以在触摸屏上安
排了九个区间的触摸功能用以下代码完成触摸区域。
recta.left=0;
recta.top=0;
recta.right=320;
recta.bottom=30;
//定义触摸区域大小
pTouch_Position=&Touch_Position;
prect=▭
precta=&recta;
p rectb=&rectb;
prectc=&rectc;
prectd=&rectd;
precte=&recte;
prectf=&rectf;
如上,定义上下左右四个区间的大小来完成触摸区域,六道菜六个触摸区域
区域大小根据图片大小而定。
触摸区域完成后,就是实现触摸点菜功能了,在这里,我们用到了消息循环,即在进入点菜界面之前有一个欢迎界面,需要通过按键进入点菜界面,这里使用for循环用来判断。
for(;;){
pMsg=WaitMessage(0); //等待消息
switch(pMsg->Message){
case OSM_KEY:
这里的case OSM_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);
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;
}
}
else if(IsInRect2(prectb, pTouch_Position))
DeleteMessage(pMsg);//删除消息,释放资源
OSTimeDly(200);
}
DestoryDC(pdc);
}
用消息循环来实现点菜和取消点菜的过程,点一下图片为点菜,再点一下就取消了点菜。judge==1表示发生了这个事件,进入点菜界面。
进入点菜界面后,可以看见每排2道菜,一共六道菜,这是用到了消息循环,同时用用了一次if judge来进行点菜判断,同时定义IsInRect2(prect1,pTouch_Position)函数来判断prect1指向的区域是否有触摸动作,有则同样跳转到菜单画面,case OSM_TOUCH_SCREEN:表示触摸屏动作后系统需响应的进程。
4.系统实现
在本次系统实现的过程中,所要做到的就是实现触摸屏点菜和键盘点菜功能,并且实现计算所点菜的总价格,在LED灯上显示所点菜的总价格。
1 初始化界面
///*****************事件定义*****************///
OS_EVENT *Nand_Rw_Sem; //Nand_Flash读写控制权旗语
//and you can use it as folloeing:
// Nand_Rw_Sem=OSSemCreate(1); //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//
// OSSemPend(Nand_Rw_Sem,0,&err);
// OSSemPost(Nand_Rw_Sem);
OS_EVENT *Uart_Rw_Sem; //Uart读写控制权旗语
//and you can use it as folloeing:
// Uart_Rw_Sem=OSSemCreate(1); //创建Uart读写控制权旗语,初值为1满足互斥条件//
// OSSemPend(Uart_Rw_Sem,0,&err);
// OSSemPost(Uart_Rw_Sem);
//////////////////////////////////////////////////////////
int main(void)
{
ARMTargetInit(); //开发板初始化
OSInit(); //操作系统初始化
uHALr_ResetMMU();//复位MMU
LCD_Init(); //初始化LCD模块
LCD_printf("LCD initialization is OK\n");//向液晶屏输出数据
LCD_printf("320 x 240 Text Mode\n");
initOSGUI();//初始化图形界面
LoadFont();//调Unicode字库
LoadConfigSys();//使用config.sys文件配置系统设置
LCD_printf("Create task on uCOS-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("Starting uCOS-II...\n");
LCD_printf("Entering graph mode...\n");
LCD_ChangeMode(DspGraMode);//变LCD显示模式为文本模式
InitRtc();//初始化系统时钟
Nand_Rw_Sem=OSSemCreate(1); //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//
OSStart();//操作系统任务调度开始
//不会执行到这里
return 0;
}
/*char
*KeyTable[]={"NumLock","/","*","-","7","8","9","+","4","5","6","1","2","3","Enter","0","."} ;
void onKey(int nkey, int fnkey)
{
PDC pdc;//创建绘图设备上下文结构
U16 ch[10];
ClearScreen();//清屏
pdc=CreateDC();//创建绘图设备上下文
Uart_Printf("key=%s\n", KeyTable[nkey]);
strChar2Unicode(ch, KeyTable[nkey]);
2主函数
Uart_Printf("这是01号桌");
//消息循环
for(;;){
pMsg=WaitMessage(0); //等待消息
switch(pMsg->Message){
case OSM_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))
{
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);
SetRect(&rect, 180,205,260,225); //设置PID参数轴1P的文本框
pTextCtrl=CreateTextCtrl(101, &rect, FONTSIZE_MIDDLE, CTRL_STYLE_FRAME, NULL, NULL);//创建文本框
Int2Unicode(sysnumber,str);//将整形数据转换为Unicode数据
//SetWndCtrlFocus(NULL, ID_MainTextCtrl);//将焦点移到文本框中
SetTextCtrlText(pTextCtrl, str,TRUE);//设置文本框内容
//EXIO_8255A_CTRL=0x80;
//EXIO_8255A_PORTC=0xff;
OSTaskCreate(Dynamic_Display_Task, (void *)0,
(OS_ST*)&Dynamic_Display_Task_Stack[STACKSIZE*8-1],
3触摸屏控制点菜的代码实现
Dynamic_Display_Task_Prio);// 1
}}
else if(judge==1)
{//Uart_Printf("%d",pMsg->WParam);
switch(pMsg->WParam){
case 15: 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;
}
break;
case 11: if(stateb==0)
{
ShowBmp(pdc,dj_Pict, 20,37);
stateb=1;
Uart_Printf("01号桌点了酸菜炖粉条\t");
sysnumber=sysnumber+price[1];
Int2Unicode(sysnumber,str);
SetTextCtrlText(pTextCtrl, str,TRUE);
num=sysnumber;
}
else
{
FillRect( pdc, 20,37,40,57, GRAPH_MODE_NORMAL, COLOR_WHITE);
DrawRectFrame(pdc, 20, 37, 40, 57);
stateb=0;
Uart_Printf("01号桌取消了酸菜炖粉条\t");
sysnumber=sysnumber-price[1];
Int2Unicode(sysnumber,str);
SetTextCtrlText(pTextCtrl, str,TRUE);
num=sysnumber;
}
break;
case 14:ClearScreen();
ShowBmp(pdc,dj_Pict1, 60,40);
judge=2;
OSTimeDly(1500);
ClearScreen();
ShowBmp(pdc,dj_Pict2, 0,0);
judge=0;
sysnumber=0;
break;
default:
break;
}
}
break;
4键盘控制点菜的代码实现
case OSM_LISTCTRL2_SELCHANGE:
onListCtrl2SelChange(pMsg->WParam,pMsg->LParam);
break;
case OSM_MENU_SELCHANGE:
onMenuSelChange(pMsg->WParam,pMsg->LParam);
break;
case OSM_TOUCH_SCREEN://OSM_TOUCH_SCREEN: Touch_Position.x=pMsg->WParam&0xffff;
Touch_Position.y=pMsg->WParam>>16;
if(judge==1)
{
if(IsInRect2(precta, pTouch_Position))
{
if(statec==0)
{
ShowBmp(pdc,dj_Pict, 20,69);
statec=1;
Uart_Printf("01号桌点了红烧狮子头\t");
sysnumber=sysnumber+price[2];
Int2Unicode(sysnumber,str);
SetTextCtrlText(pTextCtrl, str,TRUE);
num=sysnumber;
}
else
{
FillRect( pdc, 20,69,40,89, GRAPH_MODE_NORMAL, COLOR_WHITE);
DrawRectFrame(pdc, 20, 69, 40, 89);
statec=0;
Uart_Printf("01号桌取消了红烧狮子头\t");
sysnumber=sysnumber-price[2];
Int2Unicode(sysnumber,str);
SetTextCtrlText(pTextCtrl, str,TRUE);
num=sysnumber;
}
}
else if(IsInRect2(prectd, pTouch_Position))
{
if(stated==0)
{
ShowBmp(pdc,dj_Pict, 20,101);
stated=1;
Uart_Printf("01号桌点了烤乳猪\t");
sysnumber=sysnumber+price[3];
Int2Unicode(sysnumber,str);
SetTextCtrlText(pTextCtrl, str,TRUE);
num=sysnumber;
}
else
{
FillRect( pdc, 20,101,40,121, GRAPH_MODE_NORMAL, COLOR_WHITE);
DrawRectFrame(pdc, 20, 101, 40, 121);
stated=0;
Uart_Printf("01号桌取消了烤乳猪\t");
sysnumber=sysnumber-price[3];
Int2Unicode(sysnumber,str);
SetTextCtrlText(pTextCtrl, str,TRUE);
num=sysnumber;
}
}
default:
OSOnSysMessage(pMsg);
break;
}
DeleteMessage(pMsg);//删除消息,释放资源
OSTimeDly(200);
}
DestoryDC(pdc);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Dynamic_Display_Task(void *Id)
{
U32 key;
for(;;)
{ key=num;
//PDC pdc;//创建绘图设备上下文结构
5. 总结
在本次嵌入式课程设计课程中,我们学习了基本的关于嵌入式的原理及动手操作内容,并且运用平时所学,最后在此次课程设计中设计出来我们的电子点菜系统,是关于基于ARM的嵌入式电子点菜系统,本系统在硬件实现以及软件编译实现过程中相对复杂,通过参考了基于ARM的嵌入式系统设计实验与实践教程,然后再结合自己的设计和改进可以实现,通过在做课程设计的过程中,遇到了一些难以解决的问题和难题,我们通过询问同学和老师的帮助,慢慢的得以解决。
虽然没有大的问题,但是不断有小的问题产生,他们藏匿在系统的各个细小的环节当中,让你的系统总是不能如你所愿的完美实现。我们在实现这个系统的过程中就遇见了不少问题,比如触摸屏的问题由于本系统最基本的功能要求实现触摸屏触摸点菜的功能,要求实验台的触摸屏功能完好。但是我们所在的俩个实验室将近四十个实验台没有几个触摸屏功能是好的,大多数触摸灵敏度不够或者过于灵敏。我们在书记主要功能即触摸点菜功能时参考了教科书以及自己的设计进行了这部分的代码编译,但是在触摸屏上检测的时候,效果很不理想,触摸点菜功能时好时坏。我们对代码进行了许多改进和完善,并且还用坐标的方式进行了检测,发现在用单个的横纵坐标来实现触摸功能的时候触摸功能是好的,但是一转化为包含图片区域空间时触摸功能就又不好用了,换了几个实验台依然如此。当然我们也不是很确定是不是触摸屏的问题,鉴于进度慢慢落后,我们就放弃了继续查找原因并改进,希望老师能予以理解。通过我们的努力和多方面寻找原因,最后也不能说完全解决了问题,但是基本上达到了我们的要求。本次课程设计实验不仅增强了我们的嵌入式硬件设计能力,两人一组的协同合作也增强了团队意识,
还提升了编码水平,达到了一定的效果,完成了最初做此课程设计的电子点菜系统的初衷。
嵌入式技术是与实践紧密相结合的一门技术,把我们学的知识理论通过实验应用到实践中去,这样我们才能真正掌握它们,并能运用它们。这个点菜系统的开发,让我们掌握了硬件设计、嵌入式Linux 操作系统编译、linux驱动开发、嵌入式数据库图形界面开发等。本文的点菜系统除了应用于学校的食堂,还可以应用于饭店,具有很好的市场前景。系统还存在着一些不足,没有加上无线网卡,在以后的实验开发中会将无线加入到系统中。
6. 参考文献
[1]武俊鹏、张国印、姚爱红、赵国东.基于ARM的嵌入式系统设计实验与实践教程.清华大学出版社.2011.
[2]王琳,余震虹,李鑫等.基于ARM 的嵌入式电子点菜系统的设计[J].微计算机信息.2009.