基于单片机的简易酒店点菜系统Word下载.docx
《基于单片机的简易酒店点菜系统Word下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的简易酒店点菜系统Word下载.docx(31页珍藏版)》请在冰豆网上搜索。
程序中我定义了P3.0,P3.4,P3.7分别为“上移”,“确定”,“下移”三个功能按键。
按键引脚的一端接单片机,一端接低电平,当单片机接收到某个端口的低电平是就表示拿个按键已经按下。
否则表示按键没按下,为了更好的实现按键的准确性我加入了消抖程序与松手检测程序。
按键判断程序如下:
voidkeyscan()//按键判断
{
if(qd==0)
{
delay(5);
{
while(!
qd);
n=1;
}
}
if(sy==0)
delay(5);
sy);
m++;
if(m>
7)
m=0;
if(xy==0)
xy);
m--;
if(m==255)
m=7;
}
2.3LCD显示模块
2.3.1LCD12864功能介绍
AMPIRE128x64管脚一共18个(见图五),CS1左半屏片选端,CS2右半屏片选端;
VCC、GND就是电源、接地引脚,V0液晶显示驱动电压,RS数据指令选择信号,H为数据,L为指令,也叫D/I,即DATA和INSTRUCTIONS这两个单词的缩写。
R/W读写选择信号。
E为LCD使能端,R/W为L时,E信号下降沿锁存DB7-DB0;
R/W为H时,E为H,DDRAM数据读到DB7-DB0,如果只写不读的话可以接地处理。
DB0-DB7数据传输端口。
RST为复位信号,-VOUT为液晶显示驱动电压。
2.3.2LCD12864指令说明
AMPIRE128x64共有7个指令,下面分别加以说明:
显示开关:
0x3e关;
0x3f开(R/W=0,RS=0)。
显示起始行:
0xc0+i,i取值0至63(R/W=0,RS=0)。
设置DDRAM页地址(X地址):
0xb8+i,i取值0至7(R/W=0,RS=0),设置Y地址:
0x40+i,i取值0至63(R/W=0,RS=0)。
写数据:
将数据线上的数据DB7-DB0写到DDRAM。
Y地址指针自动加1(R/W=0,RS=1)。
读数据:
将DDRAM中的数据读入1数据线DB7-DB0。
Y地址指针自动加1(R/W=1,RS=1)。
指令表如表一所示
表一LCD12864指令表
2.3.3LCD驱动程序
驱动程序如下:
voidCheckState()
{uchardat;
//状态信息(判断是否忙)
RS=0;
//数据\指令选择,D/I(RS)=“L”,表示DB7∽DB0为显示指令数据
RW=1;
//R/W=“H”,E=“H”数据被读到DB7∽DB0
do{DATA=0x00;
EN=1;
//EN下降沿
dat=DATA;
EN=0;
dat=0x80&
dat;
仅当第7位为0时才可操作(判别busy信号)
}while(!
(dat==0x00));
/*写命令到LCD中*/
SendmandToLCD(uchar)
{CheckState();
//状态检查,LCD是否忙
//向LCD发送命令。
RS=0写指令,RS=1写数据
RW=0;
//R/W=“L”,E=“H→L”数据被写到IR或DR
DATA=;
//:
命令
//EN下降沿
/*设置页0xb8是页的首地址*/
voidSetpage(ucharpage)
{page=0xb8|page;
//10111xxx0<
=page<
=7设定页地址--X0-7,8行为一页64/8=8,共8页
SendmandToLCD(page);
/*设定显示开始行,0xc0是行的首地址*/
voidSetStartLine(ucharstartline)
{startline=0xc0|startline;
//11000000
SendmandToLCD(startline);
//设置从哪行开始:
0--63,一般从0行开始显示
/*设定列地址--Y0-63,0x40是列的首地址*/
voidSetColumn(ucharcolumn)
{column=column&
0x3f;
//column最大值为64,越出0=<
column<
=63
column=0x40|column;
//01xxxxxx
SendmandToLCD(column);
/*开关显示,0x3f是开显示,0x3e是关显示*/
voidSetOnOff(ucharonoff)
{onoff=0x3e|onoff;
//0011111x,onoff只能为0或者1
SendmandToLCD(onoff);
/*写显示数据*/
voidWriteByte(uchardat)
RS=1;
//RS=0写指令,RS=1写数据
////R/W=“L”,E=“H→L”数据被写到IR或DR
DATA=dat;
//dat:
显示数据
//EN下降源
/*选择屏幕screen:
0-全屏,1-左屏,2-右屏*/
voidSelectScreen(ucharscreen)
{switch(screen)
{case0:
cs1=1;
//全屏
cs2=1;
break;
case1:
//左屏
cs2=0;
case2:
cs1=0;
//右屏
/*清屏screen:
voidClearScreen(ucharscreen)
{uchari,j;
SelectScreen(screen);
for(i=0;
i<
8;
i++)//控制页数0-7,共8页
{Setpage(i);
for(j=0;
j<
64;
j++)//控制列数0-63,共64列
{SetColumn(j);
WriteByte(0x00);
}//写点内容,列地址自动加1
voidInitLCD()//初始化LCD
SelectScreen(0);
SetOnOff(0);
//关显示
SetOnOff
(1);
//开显示
ClearScreen(0);
//清屏
SetStartLine(0);
//开始行:
第3章.系统仿真与结果
3.1开机显示
利用proteus软件仿真,点击运行之后会显示如下的开机画面。
图五开机显示画面
图中菜单为反白颜色,按下“确定”键后即可进入菜单。
3.2主菜单显示
系统开机后,按下“确定”键即可进入主菜单。
主菜单显示如下:
图六主菜单显示
3.3子菜单显示
在子菜单中分别有几道菜供顾客享用,当顾客按下“上移”或“下移”键选中想要的菜系再按下“确定”键就可以进入该菜系,再选择自己想要的菜系按下“确定”键即可点菜成功。
子菜单显示如下:
图七子菜单显示
3.4点菜成功显示
当顾客选择到自己想要吃的菜并按下“确定”键后就表示顾客点菜成功。
点菜成功显示如下:
图八点菜成功显示
当顾客再次按下“确定”键后返回菜系菜单,并且已经点过的菜会以一个钩表示。
如下图:
图九显示已点菜
第4章.总结与体会
短短两周的专业设计结束了,回顾这两周我的努力,我觉得我还是收获蛮大的,通过这两周的专业设计,我对单片机有了更深的认识,对LCD12864有了更深入的了解,单片机其实说简单点就是用软件控制单片机各个脚的电平变化,但是实践中还是挺有难度的,这次专业设计我接到的任务是做一个简易的酒店点菜终端系统,刚开始觉得挺有难度的,主要是我对LCD12864一无所知,但是经过上网查找资料及通过看LCD12864的指导手册终于弄懂了这个液晶显示屏,其实一个看似简单的电路,要把他设计出来就比较困难了,这次设计我用的编程语言是C语言,其实单片机的C语言我通过看网上的视频还是有所了解。
所以这次编程还算比较顺利,刚开始我只做了两大的菜系,我想这其中的难点就是怎样进入各个子菜单及其返回以及光标的上下移动,我的方法其实也挺简单,就是将选中的菜系字体取反白显示出来。
另一个难点就是键盘扫描了,刚开始我出了点小状况,就是按下确定键后不会进入各个菜单,后来认识思考之后才发现用!
n代替就行了。
每次按键按下n自动取反,最后一个就是各个菜单的显示比较难了,因为你移动一下就是一个状态,最后我经过仔细的思考觉得用个switch…case语句一下子就出来了,虽然这样会显得程序比较复杂,但是我还没有想到其他更好的简单办法所以就用了这个。
通过这两周的学习,我学到了很多,毕竟自己也做出了一点东西,蛮有成就感的,其实我也知道这只是冰山一角,要想真正的弄通单片机,今后的学习道路还很漫长,我想我也会深深的记住这次课设给我的经验与教训,在今后的学习中一定要多思考,多实践,那样我才会真正有所成就。
最后衷心感谢陈老师在这两周对我的细心指导。
附录
5.1仿真电路图
5.2程序清单
#include<
reg52.h>
intrins.h>
code.h>
#defineuintunsignedint
#defineucharunsignedchar
#defineDATAP0//LCD12864数据线
sbitsy=P3^0;
sbitqd=P3^4;
sbitxy=P3^7;
sbitRS=P2^0;
//数据\指令选择
sbitRW=P2^1;
//读\写选择
sbitEN=P2^2;
//读\写使能
sbitcs1=P2^3;
//片选1
sbitcs2=P2^4;
//片选2
voidmenuselect();
voidkeyscan();
voidlucai();
voiddccg(ucharb);
voidlucai2();
voidchuancai();
voidsorry();
voidlucaia();
ucharn,m,k;
/*状态检查,LCD是否忙*/
//仅当第7位为0时才可操作(判别busy信号)
/*延时程序*/
voiddelay(uintz)
{uinti,j;
i<
z;
i++)
for(j=0;
j<
110;
j++);
/*初始化LCD*/
voidInitLCD()
/*显示全角汉字*/
voidDisplay(ucharss,ucharpage,ucharcolumn,ucharnumber)
{inti;
//选屏参数,page选页参数,column选列参数,number选第几汉字输出
SelectScreen(ss);
column=column&
Setpage(page);
//写上半页
SetColumn(column);
//控制列
16;
i++)//控制16列的数据输出
{WriteByte(Hzk[i+32*number]);
}//i+32*number汉字的前16个数据输出
Setpage(page+1);
//写下半页
{WriteByte(Hzk[i+32*number+16]);
}//i+32*number+16汉字的后16个数据输出
}
voidDisplay2(ucharss,ucharpage,ucharcolumn,ucharnumber)
{WriteByte(~Hzk[i+32*number]);
{WriteByte(~Hzk[i+32*number+16]);
voidmenu()
{
uinti;
while(!
n)
{
//显示汉字
keyscan();
2;
i++)
{Display(1,0,0+i*16,i);
/*Display(选屏参数(cs1,cs2),page选页参数,column选列参数,number选第几汉字输出)*/
Display(1,0,32+i*16,i+2);
Display(2,0,64+i*16,i+4);
Display(2,0,96+i*16,i+6);
Display(1,2,0+i*16,i+8);
Display(1,2,32+i*16,i+10);
Display(2,2,64+i*16,12+i*5);
Display(2,2,96+i*16,17);
Display(1,4,0+i*16,17);
Display(1,4,32+i*16,17);
Display(2,4,64+i*16,17);
Display(2,4,96+i*16,17);
Display(1,6,0+i*16,i+13);
Display(1,6,32+i*16,17);
Display(2,6,64+i*16,17);
Display(2,6,96+i*16,i+15);
n=0;
menuselect();
/*主函数*/
voidmain()
InitLCD();
//初始12864
menu();
voidmenuselect()
{uinti;
ClearScreen(0);
{keyscan();
i++)
switch(m%8)
{
case0:
Display(1,0,0+i*16,30-i*17);
Display(1,0,32+i*16,19+i*6);
Display(2,0,64+i*16,20+i*5);
Display(2,0,96+i*16,21+i*4);
Display(1,2,0+i*16,17);
Display(1,2,32+i*16,17);
Display(2,2,64+i*16,17);
Display(1,4,0+i*16,22+i*3);
Display(1,4,32+i*16,23+i*2);
Display(2,4,64+i*16,24+i*1);
Display(2,4,96+i*16,i+15);
Display(1,6,0+i*16,17);
Display(2,6,96+i*16,17);
break;
case1:
Dis