郑州轻工业学院
课 程 设 计 任 务 书
题目 基于ucgui的点菜系统设计
专业、班级 电子信息科学与技术09-1班 学号
姓名
主要
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
、基本要求、主要参考文献等:
1. 课程说明
随着信息化技术的不断发展,电子菜单开始出现在一些高档餐厅,与传统菜单相比,电子菜单可以节省制作成本和人力成本,并能实现无线下单。可以随需变更菜品信息,灵活进行菜品促销,帮助饭店有效提升品牌形象和服务水平,增加菜品销量,提高营业收益。其强大的后台管理功能,让饭店管理者运筹帷幄,省心省力。
本次课程设计利用GUI函数制作一个简单的电子菜单,实现基本的查阅、点菜、菜价计算、付账等功能,旨在熟悉掌握C语言和对系统函数的灵活运用。
2、主要内容
(1)掌握LCD显示图形的方法,掌握LCD显示字符的方法。
(2) 了解汉字库的组织方式,汉字显示的原理,学习LCD的显示原理和控制
办法
鲁班奖评选办法下载鲁班奖评选办法下载鲁班奖评选办法下载企业年金办法下载企业年金办法下载
。
(3) 完成点菜系统的点菜,菜价计算,账单打印功能。
3、基本要求
(1) 编写图形显示函数,在LCD上显示图形
(2) 编写HZK16读取函数,在LCD上显示汉字
(3) 菜单程序设计,实现菜单的选择操作。
4.功能说明
此菜单共有16道菜,在首界面显示4道菜的信息,报告菜名、价格、份数,还可以增加、减少或退选某道菜,相应地其份数会发生改变。通过点击上下翻页三角键,可以查看其余12道菜(可循环),选中某道菜之后,菜名会变红色,起提示作用。点击“OK”键,说明点菜结束,进入第二界面。
第二界面有菜单的简单显示,包括菜名、价格和份数,还有合计花费。另外,增加了“修改”和“重选”两个功能键,点击“修改”键,系统会跳转到第一界面,对点菜情况进行修改;点击“重选”键,会出现一个提示画面:真的要重选吗,点击“确定”,则系统跳回第一界面,重新点菜;点击“取消”,提示画面消失。若点击“详细菜单”键,系统跳转到第三界面。
第三界面罗列了每道菜的菜名、价格、份数,还有花费情况,如果顾客没有异议,点击“确认付账”后,会出现一个提示画面:谢谢光临,欢迎下次再来,系统将在 秒后跳回主菜单。计时3秒钟。如果点击“返回”键,则系统回到第二界面。
5.程序及其注释
#include "GUI.h"
#include "GUI_Protected.h"
#include
#include
#include
#define countof(Array) (sizeof(Array)/sizeof(Array[0]))
const GUI_POINT aPoints0[]={
{0,-15},
{30,15},
{-30,15}
};
const GUI_POINT aPoints1[]={
{-30,-15},
{30,-15},
{0,15}
};
int s,ms,ms1,ss;
int number[17]={0};//份数
int change=0;//界面变换标志位
int cnt=0;
int flag=0;//第二界面重选标志位
int time=0;//time用来控制显示第一界面静止的部分
int flag21=0;//第二界面切换到第一界面标志位
int time1=0;//控制显示第二界面静止的部分
int time2=0;//控制显示第二界面重选确认窗口
int time3=0;//控制显示第三界面静止的部分
int flag3=0;//控制显示第三界面确认付账
int flag31=0;
int cancel=0;//第二界面重选取消标志位
GUI_PID_STATE TouchState;
char menu[17][100]={"麻婆豆腐","辣子鸡丁","东坡肘子","豆瓣鲫鱼","口袋豆腐","酸菜干鱼","夫妻肺片",
"蚂蚁上树","叫化香鸡","茄汁鱼卷","鱼香肉丝","干煸冬笋","魔芋烧鸭","锅贴鱼片","麻辣肉丁","鱼香茄饼"};//菜名
int price[17]={12,16,30,28,10,25,35,8,50,14,20,8,46,32,16,15};//菜价
int count_time()
{
ms=(GUI_GetTime()-ms1)/100;
ms%=10;
if(ms==9)
{
ss++;
GUI_Delay(100);
}
s=3-ss;
return s;
}
int count_number(int x)//计算位数
{
int y=0;
if(x==0) return 1;
while(x>0)
{x=x/10;
y++;
}
return y;
}
void display1()//第一界面显示函数
{
int i;
GUI_SetBkColor(GUI_YELLOW);
if(time==0)
{
time=1;
GUI_SetFont(&GUI_FontHZ24);//声明字库
GUI_SetColor(GUI_RED);
GUI_DispStringHCenterAt("欢迎光临二毛菜馆",150,10);
GUI_SetFont(&GUI_FontHZ16);//声明字库
GUI_DispStringHCenterAt("菜名",30,40);
GUI_DispStringHCenterAt("价格",115,40);
GUI_DispStringHCenterAt("选项",195,40);
GUI_DispStringHCenterAt("份数",290,40);
GUI_SetColor(GUI_BLACK);
GUI_SetColor(GUI_BLUE);
LCD_L0_FillRect(141,59,174,76);
LCD_L0_FillRect(141,89,174,106);
LCD_L0_FillRect(141,119,174,136);
LCD_L0_FillRect(141,149,174,166);
GUI_SetBkColor(GUI_BLUE);
GUI_SetColor(GUI_WHITE);
GUI_DispStringHCenterAt("增加",158,60);
GUI_DispStringHCenterAt("增加",158,90);
GUI_DispStringHCenterAt("增加",158,120);
GUI_DispStringHCenterAt("增加",158,150);
LCD_L0_FillRect(181,59,214,76);
LCD_L0_FillRect(181,89,214,106);
LCD_L0_FillRect(181,119,214,136);
LCD_L0_FillRect(181,149,214,166);
GUI_DispStringHCenterAt("减少",198,60);
GUI_DispStringHCenterAt("减少",198,90);
GUI_DispStringHCenterAt("减少",198,120);
GUI_DispStringHCenterAt("减少",198,150);
LCD_L0_FillRect(221,59,254,76);
LCD_L0_FillRect(221,89,254,106);
LCD_L0_FillRect(221,119,254,136);
LCD_L0_FillRect(221,149,254,166);
GUI_DispStringHCenterAt("退选",238,60);
GUI_DispStringHCenterAt("退选",238,90);
GUI_DispStringHCenterAt("退选",238,120);
GUI_DispStringHCenterAt("退选",238,150);
GUI_SetColor(GUI_BLUE);
LCD_L0_FillRect(271,59,300,76);
LCD_L0_FillRect(271,89,300,106);
LCD_L0_FillRect(271,119,300,136);
LCD_L0_FillRect(271,149,300,166);
GUI_SetBkColor(GUI_BLUE);
GUI_SetColor(GUI_WHITE);
GUI_DispStringAt("份",298,60);
GUI_DispStringAt("份",298,90);
GUI_DispStringAt("份",298,120);
GUI_DispStringAt("份",298,150);
GUI_SetBkColor(GUI_BLUE);
GUI_SetColor(GUI_BLUE);
LCD_L0_FillRect(260,180,310,220);
GUI_FillPolygon(aPoints0,countof(aPoints0),40,205);
GUI_FillPolygon(aPoints1,countof(aPoints1),110,205);
GUI_SetBkColor(GUI_BLUE);
GUI_SetColor(GUI_WHITE);
GUI_DispStringHCenterAt("OK",295,190);
GUI_SetFont(&GUI_FontHZ24);//声明字库
GUI_SetBkColor(GUI_YELLOW);
GUI_SetColor(GUI_BLACK);
GUI_DispStringHCenterAt("第",180,190);
GUI_DispStringHCenterAt("页",235,190);
}
GUI_SetFont(&GUI_FontHZ24);//声明字库
GUI_SetColor(GUI_BLACK);
GUI_DispDecAt(cnt+1,200,190,1);
GUI_SetFont(&GUI_FontHZ16);//声明字库
GUI_SetColor(GUI_YELLOW);
for(i=0;i<4;i++)
{
GUI_SetColor(GUI_BLACK);
if(number[cnt*4+i]>0)
GUI_SetColor(GUI_RED);
GUI_DispStringHCenterAt(menu[cnt*4+i],40,60+30*i);//显示菜名
GUI_SetColor(GUI_BLACK);
GUI_DispDecAt(price[cnt*4+i],105,60+30*i,2);//显示价格
GUI_SetBkColor(GUI_BLUE);
GUI_SetColor(GUI_WHITE);
GUI_DispDecAt(number[cnt*4+i],275,60+30*i,2);//显示份数
GUI_SetBkColor(GUI_YELLOW);
}
if(GUI_TOUCH_GetState(&TouchState))
{
if((TouchState.x>10)&&(TouchState.x<70)&&(TouchState.y>190)&&(TouchState.y<220))//上一页
{
cnt--;
if(cnt<0)
cnt=3;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>80)&&(TouchState.x<140)&&(TouchState.y>190)&&(TouchState.y<220))//下一页
{
cnt++;
if(cnt>3)
cnt=0;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>260)&&(TouchState.x<310)&&(TouchState.y>180)&&(TouchState.y<220))//OK
{
change=1;
time1=0;
time2=0;
cancel=0;
GUI_SetBkColor(GUI_YELLOW);
GUI_Clear();
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>141)&&(TouchState.x<174)&&(TouchState.y>59)&&(TouchState.y<76))//增加1
{
number[cnt*4]++;
if(number[cnt*4]>99)
number[cnt*4]=99;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>141)&&(TouchState.x<174)&&(TouchState.y>89)&&(TouchState.y<106))//增加2
{
number[cnt*4+1]++;
if(number[cnt*4+1]>99)
number[cnt*4+1]=99;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>141)&&(TouchState.x<174)&&(TouchState.y>119)&&(TouchState.y<136))//增加3
{
number[cnt*4+2]++;
if(number[cnt*4+2]>99)
number[cnt*4+2]=99;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>141)&&(TouchState.x<174)&&(TouchState.y>149)&&(TouchState.y<166))//增加4
{
number[cnt*4+3]++;
if(number[cnt*4+3]>99)
number[cnt*4+3]=99;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>181)&&(TouchState.x<241)&&(TouchState.y>59)&&(TouchState.y<76))//减少1
{
number[cnt*4]--;
if(number[cnt*4]<0)
number[cnt*4]=0;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>181)&&(TouchState.x<241)&&(TouchState.y>89)&&(TouchState.y<106))//减少2
{
number[cnt*4+1]--;
if(number[cnt*4+1]<0)
number[cnt*4+1]=0;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>181)&&(TouchState.x<241)&&(TouchState.y>119)&&(TouchState.y<136))//减少3
{
number[cnt*4+2]--;
if(number[cnt*4+2]<0)
number[cnt*4+2]=0;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>181)&&(TouchState.x<241)&&(TouchState.y>149)&&(TouchState.y<166))//减少4
{
number[cnt*4+3]--;
if(number[cnt*4+3]<0)
number[cnt*4+3]=0;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>221)&&(TouchState.x<254)&&(TouchState.y>59)&&(TouchState.y<76))//退选1
{
number[cnt*4]=0;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>221)&&(TouchState.x<254)&&(TouchState.y>89)&&(TouchState.y<106))//退选2
{
number[cnt*4+1]=0;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>221)&&(TouchState.x<254)&&(TouchState.y>119)&&(TouchState.y<136))//退选3
{
number[cnt*4+2]=0;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>221)&&(TouchState.x<254)&&(TouchState.y>149)&&(TouchState.y<166))//退选4
{
number[cnt*4+3]=0;
while(GUI_TOUCH_GetState(&TouchState));
}
}
}
void display2()//第二界面显示函数
{
int i,sum=0,r,count=0;
for(i=0;i<16;i++)
sum+=price[i]*number[i];
if(time1==0)
{
time1=1;
GUI_SetColor(GUI_BLUE);
LCD_L0_FillRect(170,10,230,40);
LCD_L0_FillRect(250,10,310,40);
LCD_L0_FillRect(160,210,280,240);
LCD_L0_FillRect(20,210,140,240);
GUI_SetFont(&GUI_FontHZ16);//声明字库
GUI_SetBkColor(GUI_BLUE);
GUI_SetColor(GUI_WHITE);
GUI_DispStringHCenterAt("修改",200,20);
GUI_DispStringHCenterAt("重选",280,20);
GUI_DispStringHCenterAt("合计",180,215);
GUI_DispStringHCenterAt("详细菜单",80,215);
GUI_DispDecAt(sum,215,215,count_number(sum));
GUI_DispStringHCenterAt("元",270,215);
GUI_SetFont(&GUI_FontHZ24);//声明字库
GUI_SetBkColor(GUI_YELLOW);
GUI_SetColor(GUI_BLACK);
GUI_DispStringHCenterAt("您",20,20);
GUI_DispStringHCenterAt("的",60,20);
GUI_DispStringHCenterAt("帐",100,20);
GUI_DispStringHCenterAt("单",140,20);
}
if(cancel==0)
{
cancel=1;
r=40;
for(i=0;i<16;i++)
{
GUI_SetFont(&GUI_FontHZ16);//声明字库
GUI_SetBkColor(GUI_YELLOW);
GUI_SetColor(GUI_BLACK);
if(number[i]>0)
{
if(50+count*20>190)
{ r=190;count=0;}//换列显示
GUI_DispStringHCenterAt(menu[i],r,50+count*20);//显示菜单
GUI_DispDecAt(number[i],r+40,50+count*20,2);
GUI_DispStringHCenterAt("*",r+70,50+count*20);
GUI_DispDecAt(price[i],r+75,50+count*20,2);
count++;
}
}
}
if(flag==1)
{
if(time2==0)
{
time2=1;
GUI_SetColor(GUI_RED);
LCD_L0_FillRect(50,80,280,200);
GUI_SetColor(GUI_BLACK);
LCD_L0_FillRect(90,140,150,180);
LCD_L0_FillRect(170,140,230,180);
GUI_SetBkColor(GUI_RED);
GUI_SetColor(GUI_WHITE);
GUI_SetFont(&GUI_FontHZ24);//声明字库
GUI_DispStringHCenterAt("真的要重选吗",160,110);
GUI_SetBkColor(GUI_BLACK);
GUI_DispStringHCenterAt("确定",120,150);
GUI_DispStringHCenterAt("取消",200,150);
}
if(GUI_TOUCH_GetState(&TouchState))
{
if((TouchState.x>90)&&(TouchState.x<150)&&(TouchState.y>140)&&(TouchState.y<180))//确定
{
change=0;
GUI_SetBkColor(GUI_YELLOW);
GUI_Clear();
time=0;
flag=0;
for(i=0;i<16;i++)
number[i]=0;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>170)&&(TouchState.x<230)&&(TouchState.y>140)&&(TouchState.y<180))//取消
{
change=1;
flag=0;
time2=0;
GUI_SetColor(GUI_YELLOW);
LCD_L0_FillRect(50,80,280,200);
r=40;
for(i=0;i<16;i++)
{
GUI_SetFont(&GUI_FontHZ16);//声明字库
GUI_SetBkColor(GUI_YELLOW);
GUI_SetColor(GUI_BLACK);
if(number[i]>0)
{
if(50+count*20>190)
{ r=190;count=0;}//换列显示
GUI_DispStringHCenterAt(menu[i],r,50+count*20);//显示菜单
GUI_DispDecAt(number[i],r+40,50+count*20,2);
GUI_DispStringHCenterAt("*",r+70,50+count*20);
GUI_DispDecAt(price[i],r+75,50+count*20,2);
count++;
}
}
while(GUI_TOUCH_GetState(&TouchState));
}
}
}
if(GUI_TOUCH_GetState(&TouchState))
{
if((TouchState.x>170)&&(TouchState.x<230)&&(TouchState.y>10)&&(TouchState.y<40))//修改
{
change=0;
GUI_SetBkColor(GUI_YELLOW);
GUI_Clear();
time=0;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>250)&&(TouchState.x<310)&&(TouchState.y>10)&&(TouchState.y<40))//重选
{
flag=1;
time2=0;
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>20)&&(TouchState.x<140)&&(TouchState.y>210)&&(TouchState.y<240))//详细菜单
{
change=2;
GUI_SetBkColor(GUI_YELLOW);
GUI_Clear();
time3=0;
while(GUI_TOUCH_GetState(&TouchState));
}
}
}
void display3()//第三界面显示函数
{
int r,count=0,i,sum;
if(time3==0)
{
time3=1;
GUI_SetColor(GUI_BLUE);
LCD_L0_FillRect(20,200,140,240);
LCD_L0_FillRect(180,200,300,240);
GUI_SetFont(&GUI_FontHZ16);//声明字库
GUI_SetBkColor(GUI_BLUE);
GUI_SetColor(GUI_WHITE);
GUI_DispStringHCenterAt("确认付账",80,215);
GUI_DispStringHCenterAt("返回",240,215);
r=30;
for(i=0;i<16;i++)
{
GUI_SetFont(&GUI_FontHZ12);//声明字库
GUI_SetBkColor(GUI_YELLOW);
GUI_SetColor(GUI_BLACK);
if(number[i]>0)
{
sum=number[i]*price[i];
if(50+count*20>190)
{ r=190;count=0;}//换列显示
GUI_DispStringHCenterAt(menu[i],r,10+count*20);
GUI_DispDecAt(number[i],r+30,10+count*20,2);
GUI_DispStringHCenterAt("*",r+55,10+count*20);
GUI_DispDecAt(price[i],r+60,10+count*20,2);
GUI_DispStringHCenterAt("=",r+90,10+count*20);
GUI_DispDecAt(sum,r+100,10+count*20,count_number(sum));
count++;
}
}
}
if(flag3==1)
{
flag3=0;
GUI_SetColor(GUI_GREEN);
LCD_L0_FillRect(40,20,280,180);
GUI_SetBkColor(GUI_GREEN);
GUI_SetColor(GUI_RED);
GUI_SetFont(&GUI_FontHZ24);//声明字库
GUI_DispStringHCenterAt("谢谢光临",155,30);
GUI_DispStringHCenterAt("欢迎下次再来",155,70);
GUI_DispStringAt("系统将在",80,110);
GUI_DispStringAt("秒后",215,110);
GUI_DispStringAt("跳回主菜单",90,150);
}
if(flag31==1)
{
if(count_time()>0)
{
GUI_DispDecAt(count_time(),190,110,1);
}
else if(count_time()==0)
{
GUI_DispDecAt(count_time(),190,110,1);
change=0;
time=0;
flag31=0;
ss=0;
for(i=0;i<16;i++)
number[i]=0;
GUI_SetBkColor(GUI_YELLOW);
GUI_Clear();
}
}
if(GUI_TOUCH_GetState(&TouchState))
{
if((TouchState.x>20)&&(TouchState.x<140)&&(TouchState.y>200)&&(TouchState.y<240))//确认付账
{
flag3=1;
flag31=1;
ss=0;
ms1=GUI_GetTime();
while(GUI_TOUCH_GetState(&TouchState));
}
if((TouchState.x>180)&&(TouchState.x<300)&&(TouchState.y>200)&&(TouchState.y<240))//返回
{
change=1;
time1=0;
time2=0;
cancel=0;
GUI_SetBkColor(GUI_YELLOW);
GUI_Clear();
while(GUI_TOUCH_GetState(&TouchState));
}
}
}
void MainTask(void) {
int count=0;
GUI_Init();
GUI_SetBkColor(GUI_YELLOW);
GUI_Clear();
while(1)
{
if(change==0)
{
display1();//显示第一界面
GUI_Delay(100);
}
else if(change==1)
{
display2();//显示第二界面
}
else if(change==2)
display3();//显示第三界面
}
}
6.课程设计心得
通过本次课程设计,我切身感受到嵌入式系统的强大,而我所掌握的知识不及九牛一毛,一开始写程序的时候,比较中规中矩,仅仅完成了基本功能,而且对于一些按键的设计也有些瑕疵。后来,跟同学交流和上网查找资料,在原来的基础上,做了一些改进:界面
规划
污水管网监理规划下载职业规划大学生职业规划个人职业规划职业规划论文
得更加合理了,上下翻页键由原来的方框形设计成了三角形,这样界面显得更加人性化;另外,还增加了一些新的功能,如界面自动跳转功能等。在设计的过程中,当然出现了很多的问题,甚至有时候,不知道怎么去解决,但我还是一直坚持了下来,培养了我的耐性和严谨性,同时通过查阅资料,进一步锻炼了我的自学能力,让我学到了很多新的知识。
我觉得这个课程设计有两个关键点,一是设法使界面不闪,我们知道,当界面不停刷新的时候,会出现“闪动”现象,影响美观。那么怎么解决呢?我的方法是,找出静止的部分和动态的部分,对于前者,只需显示一次;对于后者,不停刷新显示,并且尽量设置更多的静态部分。当然,这样一来,程序势必会变得麻烦一些,可以看到,在程序里,我设置了不下于10个标志位,用来控制界面的显示;另一个关键点就是界面的来回切换,也就是把三个界面灵活地结合起来,这就考查编者对于细节的把握,因为每个界面的变量都不一样,有着不同的含义,当从一个界面跳转到另一个界面时,相应界面的控制变量需重新设计,并且对于不同操作引起的界面跳转,对控制变量的设计是不一样的,这在程序中都有所体现。
7、主要参考文献
【1】马忠梅,马广云,徐英惠,田泽.ARM嵌入式处理器结构与应用基础.北京:北京航天航空大学出版社,2002
【2】田泽.嵌入式系统开发与应用实验教程.北京航空航天大学出版社,2004
【3】周立功.ARM微控制器基础与实战[M].北京航天航空大学出版社,2003
完 成 期 限: 一个星期
指导教师签名: 张涛
课程负责人签名: 张涛