单片机实现推箱子.docx
- 文档编号:26997909
- 上传时间:2023-06-25
- 格式:DOCX
- 页数:24
- 大小:18.48KB
单片机实现推箱子.docx
《单片机实现推箱子.docx》由会员分享,可在线阅读,更多相关《单片机实现推箱子.docx(24页珍藏版)》请在冰豆网上搜索。
单片机实现推箱子
程序代码
#include
#include
#include"Hzk.h"
#defineuintunsignedint
#defineucharunsignedchar
#defineLCD_dataP3
sbitrw=P2^0;
sbitrs=P2^2;
sbiten=P2^3;
sbitcs1=P2^4;
sbitcs2=P2^5;
uchara,k,j,i,renx,reny,ax,bx,cx;
sbitup=P1^0;
sbitdown=P1^2;
sbitrig=P1^3;
sbitle=P1^1;
sbitres=P1^4;
uchartemp[8][8];//用于记录屏幕一>各点的状态。
ucharcodeMap[a][8][8]=
{//“0”表示墙,“1”表示人,“2”表示人可以走的所有路径,“3”表示箱子,“4”表示目的地。
0,0,0,0,0,0,0,0,//第一关地图
0,2,2,1,0,0,4,0,
0,2,3,2,0,0,2,0,
0,0,0,2,0,0,2,0,
0,2,2,2,2,2,2,0,
0,0,2,2,0,2,2,0,
0,0,2,2,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,2,1,0,2,2,0,0,//第二关地图
0,2,2,2,2,2,2,0,
0,0,0,0,2,2,2,0,
0,2,4,0,0,2,2,0,
0,2,2,3,2,2,2,0,
0,2,2,2,2,2,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,2,2,2,2,0,0,0, //第三关地图
0,1,2,2,2,2,2,0,
0,0,0,2,0,0,2,0,
0,2,2,3,0,2,2,0,
0,2,2,2,2,2,2,0,
0,0,0,2,4,2,2,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,2,2,2,2,2,2,0, //第四关地图
0,2,0,2,2,3,2,0,
0,2,1,0,2,0,0,0,
0,2,0,4,2,2,0,0,
0,2,2,2,2,2,2,0,
0,0,0,0,2,2,2,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,2,0,2,2,2,0,//第五关地图
0,2,2,2,2,2,2,0,
0,2,2,2,0,0,0,0,
0,2,0,2,3,2,0,0,
0,4,0,2,0,2,0,0,
0,0,0,2,2,2,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,2,2,2,0,2,0,//第六关地图
0,2,3,2,2,2,2,0,
0,0,0,2,0,0,2,0,
0,0,2,2,2,4,2,0,
0,0,2,2,0,2,2,0,
0,0,0,2,2,2,2,0,
0,0,0,0,0,0,0,0,
};/*"设置地图"*/
ucharcoderen[]={
0xff,0xff,0xeb,0xc5,0xb1,0xc5,0xeb,0xff
};/*"人"*/低电平点亮
ucharcodemudi[]={
0xff,0xff,0xdb,0xe7,0xe7,0xdb,0xff,0xff
};/*"目的地"*/
ucharcodexiangzi[]={
0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xff,0xff
};/*"箱子"*/
voidCheckState(unsignedcharda)
{
rs=0;
rw=1;
do
{
LCD_data=0x00;
en=1;
da=LCD_data;
en=0;
da=0x80&da;按位与是只有对应的两个二进位均为1时,结果才为1,否则为0.
}while(!
(da==0x00));
}
voiddelay_5us(void)
{
_nop_();
_nop_();
}
voiddelay_50us(void)
{
uchari;
for(i=0;i<4;i++)
{
delay_5us();
}
}
voiddelay_100us(void)
{
delay_50us();
delay_50us();
}
voidtime(uintms)
{
ucharj;
while(ms>0)
{
for(j=0;j<10;j++)
{
delay_100us();
}
ms--;
}
}
voidWrite_data(uchardat)/*"写显示数据"*/
{
CheckState();
rs=1;1数据
rw=0;0写数据
LCD_data=dat;
en=1;由高电平到低电平,液晶模块执行命令
en=0;
}
voidwrite_command(ucharcommand)/*"写命令到LCD中"*/
{
CheakState();
rs=0;向LCD发送指令
rw=0;写数据
LCD_data=command;
en=1;
delay_5us();
en=0;
}
voidSetLine(ucharstateline)/*"设置显示开始行,0XC0是行的首地址"*/
{
stateline=0xc0|stateline;
write_command(stateline);
}
voidSetColumn(ucharcolumn)/*"设置列地址为Y0-63,0X40是列的首地址"*/
{
column=column&0x3f;column最大值为64
column=0x40|column;
write_command(column);
}
voidSetPage(ucharpage)/*"设置0Xb8是页的首地址"*/
{
page=0xb8|page;
write_command(page);
}
voidSetOnOff(ucharonoff)
{
onoff=0x3e|onoff;只能为1或0
write_command(onoff);
}
voidLCD_Pos(ucharx,uchary,ucharz)
{
SetPage(0xb8+x);8行为一页,一共是64行共8页。
A2——A0表示0到7页。
SetColumn(0x40+y*8);此指令是将A5——A0送到y地址计数器,y地址指针进行读写操作后,y地址指针自动加一。
SetLine(z);起始行的地址可以使0——63的任意一行。
}
voidSelectScreen(ucharscreen)
{
switch(screen)
{
case0:
cs1=0;/*"全屏"*/
_nop_();_nop_();_nop_();
cs2=0;
_nop_();_nop_();_nop_();
break;
case1:
cs1=0;/*"左屏"*/
_nop_();_nop_();_nop_();
cs2=1;
_nop_();_nop_();_nop_();
break;
case2:
cs1=1;/*"右屏"*/
_nop_();_nop_();_nop_();
cs2=0;
_nop_();_nop_();_nop_();
break;
}
}
voidClearScreen(ucharscreen)
{
uchari,j;
SelectScreen(screen);
for(i=0;i<8;i++)控制页数0——7,共8页
{
SetLine(i);
SetColumn(0);
for(j=0;j<64;j++)控制列数0--63,共64列
{
Write_data(0x00);写内容,列地址自动加1
}
}
}
voidLCD_Init()/*"LCD初始化"*/
{
CheckState();
write_command(0x30);
delay_5us();
write_command(0x0c);
delay_5us();
write_command(0x01);
delay_5us();
}
voidRen_Init()
{
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
{
Write_data(ren[k]);
}
}
voidXiangZi_Init()
{
ax=0x68;
bx=0xbc;
cx=0xff;
LCD_Pos(ax,bx,cx);
for(i=0;i<8;i++)
{
Write_data(xiangzi[i]);
}
}
voidMuDi_Init()
{
LCD_Pos(0x48,0xbc,0xff);
for(i=0;i<8;i++)
{
Write_data(mudi[i]);
}
}
voidDisplay(dis)
{
ucharx,flag=1;
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(0xff);
switch(dis)
{
case0:
renx--;break;
case1:
renx++;break;
case2:
reny--;break;
case3:
reny++;break;
case4:
break;
}
if(Map[a][renx][reny]==2||Map[a][renx][reny]==1)
{
if(Map[a][renx][reny]!
=0&&Map[a][renx][reny]!
=3&&Map[a][renx][reny]!
=4)
{
while(up==0&&x==1)
{
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(ren[k]);
}
while(down==0&&x==1)
{
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(ren[k]);
}
while(le==0&&x==1)
{
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(ren[k]);
}
while(rig==0&&x==1)
{
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(ren[k]);
}
if(Map[a][renx][reny]==0)
{
renx++;
flag=0;
}
}
}
}
voidSelectkey()
{
Ren_Init();
if(up==0)
{
if(Map[a][renx-1][reny]!
=0)
{
if(renx!
=(ax+1))
{
U:
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(0xff);
renx--;
while(up==0)
{
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(ren[k]);
}
}
elseif(Map[a][ax-1][bx]!
=0&&reny==bx)
{//判断是否遇见箱子和箱子是否能走
LCD_Pos(ax,bx,0xff);//擦除箱子
for(k=0;k<8;k++)
Write_data(0xff);
ax--;
LCD_Pos(renx,reny,0xff);//擦除小人
for(k=0;k<8;k++)
Write_data(0xff);
renx--;
while(up==0)
{
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(ren[k]);
LCD_Pos(ax,bx,0xff);
for(k=0;k<8;k++)
Write_data(xiangzi[k]);
}
}
elseif(Map[a][ax-1][bx]==0&&reny==bx&&renx==(ax+1))
{
;
}
elsegotoU;
}
}
if(down==0)
{
if(Map[a][renx+1][reny]!
=0)
{//判断是否能走
if(renx!
=(ax-1))
{//判断不能遇见箱子
D:
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(0xff);
renx++;
while(down==0)
{
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(ren[k]);
}
}
elseif(Map[a][ax+1][bx]!
=0&&reny==bx)
{//判断是否遇见箱子和箱子是否能走
LCD_Pos(ax,bx,0xff);//擦除箱子
for(k=0;k<8;k++)
Write_data(0xff);
ax++;
LCD_Pos(renx,reny,0xff);//擦除小人
for(k=0;k<8;k++)
Write_data(0xff);
renx++;
while(down==0)
{
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(ren[k]);
LCD_Pos(ax,bx,0xff);
for(k=0;k<8;k++)
Write_data(xiangzi[k]);
}
}
elseif(Map[a][ax+1][bx]==0&&reny==bx&&renx==(ax-1))
{
;
}
elsegotoD;
}
}
if(le==0)
{
if(Map[a][renx][reny-1]!
=0)
{//判断是否能走
if(reny!
=(bx+1))
{//判断不能遇见箱子
L:
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(0xff);
reny--;
while(le==0)
{
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(ren[k]);
}
}
elseif(Map[a][ax][bx-1]!
=0&&renx==ax)
{
LCD_Pos(ax,bx,0xff);
for(k=0;k<8;k++)
Write_data(0xff);
bx--;
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(0xff);
reny--;
while(le==0)
{
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(ren[k]);
LCD_Pos(ax,bx,0xff);
for(k=0;k<8;k++)
Write_data(xiangzi[k]);
}
}
elseif(Map[a][ax][bx-1]==0&&renx==ax&&reny==(bx+1))
{
;
}
elsegotoL;
}
}
if(rig==0)
{
if(Map[a][renx][reny+1]!
=0)
{
if(reny!
=(bx-1))
{
R:
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(0xff);
reny++;
while(rig==0)
{
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(ren[k]);
}
}
elseif(Map[a][ax][bx+1]!
=0&&renx==ax)
{//判断是否遇见箱子和箱子是否能走&&reny==(bx+1)
LCD_Pos(ax,bx,0xff);//擦除箱子
for(k=0;k<8;k++)
Write_data(0xff);
bx++;
LCD_Pos(renx,reny,0xff);//擦除小人
for(k=0;k<8;k++)
Write_data(0xff);
reny++;
while(rig==0)
{
LCD_Pos(renx,reny,0xff);
for(k=0;k<8;k++)
Write_data(ren[k]);
LCD_Pos(ax,bx,0xff);
for(k=0;k<8;k++)
Write_data(xiangzi[k]);
}
}
elseif(Map[a][ax][bx+1]==0&&renx==ax&&reny==(bx-1))
{
;
}
elsegotoR;
}
}
}
voidYouXi_Init()
{
SelectScreen
(1);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
temp[i][j]=Map[a][i][j];
switch(temp[i][j])
{
case0:
LCD_Pos(i,j,0xff);
for(k=0;k<8;k++)
Write_data(0);
break;
case1:
LCD_Pos(i,j,0xff);
renx=i;reny=j;
for(k=0;k<8;k++)
Write_data(ren[k]);
break;
case2:
LCD_Pos(i,j,0xff);
for(k=0;k<8;k++)
Write_data(0xff);
break;
case3:
LCD_Pos(i,j,0xff);
ax=i;bx=j;
for(k=0;k<8;k++)
Write_data(xiangzi[k]);
break;
case
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实现 箱子