基于单片机的简易酒店点菜系统Word格式文档下载.docx
- 文档编号:21810633
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:31
- 大小:192.34KB
基于单片机的简易酒店点菜系统Word格式文档下载.docx
《基于单片机的简易酒店点菜系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的简易酒店点菜系统Word格式文档下载.docx(31页珍藏版)》请在冰豆网上搜索。
否则表示按键没按下,为了更好的实现按键的准确性我加入了消抖程序与松手检测程序。
按键判定程序如下:
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中*/
SendCommandToLCD(ucharcom)
{CheckState();
//状态检查,LCD是否忙
//向LCD发送命令。
RS=0写指令,RS=1写数据
RW=0;
//R/W=“L”,E=“H→L”数据被写到IR或DR
DATA=com;
//com:
命令
//EN下降沿
/*设置页0xb8是页的首地址*/
voidSetpage(ucharpage)
{page=0xb8|page;
//10111xxx0<
=page<
=7设定页地址--X0-7,8行为一页64/8=8,共8页
SendCommandToLCD(page);
/*设定显示开始行,0xc0是行的首地址*/
voidSetStartLine(ucharstartline)
{startline=0xc0|startline;
//11000000
SendCommandToLCD(startline);
//设置从哪行开始:
0--63,一样从0行开始显示
/*设定列地址--Y0-63,0x40是列的首地址*/
voidSetColumn(ucharcolumn)
{column=column&
0x3f;
//column最大值为64,越出0=<
column<
=63
column=0x40|column;
//01xxxxxx
SendCommandToLCD(column);
/*开关显示,0x3f是开显示,0x3e是关显示*/
voidSetOnOff(ucharonoff)
{onoff=0x3e|onoff;
//0011111x,onoff只能为0或者1
SendCommandToLCD(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:
Display2(1,0,0+i*16,30-i*17);
Display2(1,0,32+i*16,19+i*6);
Display(1,2,0+i*16,17);
Dis
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 简易 酒店 点菜 系统
![提示](https://static.bdocx.com/images/bang_tan.gif)