单片机设计_推箱子游戏(AT89C51)

51单片机游戏(推箱子)

想要更多项目私wo!!!

一、电路设计

此电路由AT89C51最小系统、LCD12864显示模块、74LS08芯片和四个独立按键组成。
LCD12864显示模块
带中文字库的128X64 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体 中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192 个1616 点汉字,和128 个168 点ASCII 字符 集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4 行16×16 点 阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶 显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
== 控制器接口信号说明 ==
1、RS,R/W的配合选择决定控制界面的4种模式:
在这里插入图片描述
2、E信号
在这里插入图片描述
  ●忙标志:BFBF标志提供内部工作情况.BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0时,模块为准备状态,随时可接受外部指令和数据。利用STATUSRD指令,可以将BF读到DB7总线,从而检验模块之工作状态。

●字型产生ROM(CGROM)字型产生ROM(CGROM)提供8192个此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAYON),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAYOFF)。DFF的状态是指令DISPLAYON/OFF和RST信号控制的。

●显示数据RAM(DDRAM)模块内部显示数据RAM提供64×2个位元组的空间,最多可控制4行16字(64个字)的中文字型显示,当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示三种字型,分别是半角英数字型(16*8)、CGRAM字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在0000H—0006H的编码中(其代码分别是0000、0002、0004、0006共4个)将选择CGRAM的自定义字型,02H—7FH的编码中将选择半角英数字的字型,至于A1以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5(A140—D75F),GB(A1A0-F7FFH)。

●字型产生RAM(CGRAM)字型产生RAM提供图象定义(造字)功能,可以提供四组16×16点的自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,便可和CGROM中的定义一样地通过DDRAM显示在屏幕中。

●地址计数器AC地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器来改变,之后只要读取或是写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一,当RS为“0”时而R/W为“1”时,地址计数器的值会被读取到DB6——DB0中。

光标/闪烁控制电路
  此模块提供硬体光标及闪烁控制电路,由地址计数器的值来指定DDRAM中的光标或闪烁位置。

lcd12864指令说明
在这里插入图片描述
  备注:当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。

74LS08芯片
详细地说是4二输入与门,即一片74LS08芯片内有共四路二个输入端的与门。内部线路如下图:
在这里插入图片描述
在这里插入图片描述

二、运行效果

在这里插入图片描述

在这里插入图片描述

三、部分代码

/*想要更多项目私wo!!!*/
#include <reg51.h>
#include "data.h"
#include "order.h"
#include "lcdinit.c"
#include "function.c"

void int1(void) interrupt 2
{
	keyboard();
}

int main(){
	uchar i=1;
	error0=0;
	error1=0;
	error2=0;
	delay(50);
	EA=1;
	IT1=1;
	EX1=1;
	lcd_init(0x00,0x00,0x14,0x50,0x01,0x14,0x00,MOD_XOR,0x0c);
	set_cgram();
	wirte_cgrom();
	cls();
	start();
	cls();
	pushbox();
	guan();
	while(1){
	}
	return(0);
}

void keyboard(){
	switch(P1&0x1f){
		case 0x1e:		/*上 cury > 0 && */
				  if(level_temp[curx][cury-1]==0||level_temp[curx][cury-1]==4){

				      if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					      level_temp[curx][cury]=4;
				          printc(curx,cury,4);
					  }
					  else{
					      level_temp[curx][cury]=0;
				          printc(curx,cury,0);
					  }

				      cury=cury-1;
					  level_temp[curx][cury]=1;
				      printc(curx,cury,1);
				  }

				  else if(level_temp[curx][cury-1]==3){

				      if(level_temp[curx][cury-2]==0){

				          if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }

						  cury=cury-1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx][cury-1]=3;
						  printc(curx,cury-1,3);
					  }

					  else if(level_temp[curx][cury-2]==4){

				          if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }

						  cury=cury-1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx][cury-1]=5;
						  printc(curx,cury-1,5);
						  pass();
					  }

				  }

				  else if(level_temp[curx][cury-1]==5){

				      if(level_temp[curx][cury-2]==0){

				          if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }
						  cury=cury-1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx][cury-1]=3;
						  printc(curx,cury-1,3);
						      
					  }
					  else if(level_temp[curx][cury-2]==4){

					      if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }
					      
						  cury=cury-1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx][cury-1]=5;
						  printc(curx,cury-1,5);
						  pass();
					  }
					  pass();
				  }
				  while((P1&0x01)==0);
				  break;
		case 0x1d:	   /*下 cury < 7 && */
				  if(level_temp[curx][cury+1]==0||level_temp[curx][cury+1]==4){

				      if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					      level_temp[curx][cury]=4;
				          printc(curx,cury,4);
					  }
					  else{
					      level_temp[curx][cury]=0;
				          printc(curx,cury,0);
					  }

				      cury=cury+1;
					  level_temp[curx][cury]=1;
				      printc(curx,cury,1);
				  }

				  else if(level_temp[curx][cury+1]==3){

				      if(level_temp[curx][cury+2]==0){

				          if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }

						  cury=cury+1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx][cury+1]=3;
						  printc(curx,cury+1,3);
					  }

					  else if(level_temp[curx][cury+2]==4){

				          if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }

						  cury=cury+1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx][cury+1]=5;
						  printc(curx,cury+1,5);
						  pass();
					  }

				  }

				  else if(level_temp[curx][cury+1]==5){

				      if(level_temp[curx][cury+2]==0){

				          if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }
						  cury=cury+1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx][cury+1]=3;
						  printc(curx,cury+1,3);
						      
					  }
					  else if(level_temp[curx][cury+2]==4){

					      if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }
					      
						  cury=cury+1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx][cury+1]=5;
						  printc(curx,cury+1,5);
						  pass();
					  }
					  pass();
				  }
				  while((P1&0x02)==0);
				  break;
		case 0x1b:	   /*左 curx > 0 && */
				  if(level_temp[curx-1][cury]==0||level_temp[curx-1][cury]==4){

				      if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					      level_temp[curx][cury]=4;
				          printc(curx,cury,4);
					  }
					  else{
					      level_temp[curx][cury]=0;
				          printc(curx,cury,0);
					  }

				      curx=curx-1;
					  level_temp[curx][cury]=1;
				      printc(curx,cury,1);
				  }

				  else if(level_temp[curx-1][cury]==3){

				      if(level_temp[curx-2][cury]==0){

				          if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }

						  curx=curx-1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx-1][cury]=3;
						  printc(curx-1,cury,3);
					  }

					  else if(level_temp[curx-2][cury]==4){

				          if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }

						  curx=curx-1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx-1][cury]=5;
						  printc(curx-1,cury,5);
						  pass();
					  }

				  }

				  else if(level_temp[curx-1][cury]==5){

				      if(level_temp[curx-2][cury]==0){

				          if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }
						  curx=curx-1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx-1][cury]=3;
						  printc(curx-1,cury,3);
						      
					  }
					  else if(level_temp[curx-2][cury]==4){

					      if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }
					      
						  curx=curx-1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx-1][cury]=5;
						  printc(curx-1,cury,5);
						  pass();
					  }
					  pass();
				  }
				  while((P1&0x04)==0);
				  break;
		case 0x17:	   /*右 curx < 9 && */
				  if(level_temp[curx+1][cury]==0||level_temp[curx+1][cury]==4){

				      if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					      level_temp[curx][cury]=4;
				          printc(curx,cury,4);
					  }
					  else{
					      level_temp[curx][cury]=0;
				          printc(curx,cury,0);
					  }

				      curx=curx+1;
					  level_temp[curx][cury]=1;
				      printc(curx,cury,1);
				  }

				  else if(level_temp[curx+1][cury]==3){

				      if(level_temp[curx+2][cury]==0){

				          if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }

						  curx=curx+1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx+1][cury]=3;
						  printc(curx+1,cury,3);
					  }

					  else if(level_temp[curx+2][cury]==4){

				          if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }

						  curx=curx+1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx+1][cury]=5;
						  printc(curx+1,cury,5);
						  pass();
					  }

				  }

				  else if(level_temp[curx+1][cury]==5){

				      if(level_temp[curx+2][cury]==0){

				          if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }
						  curx=curx+1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx+1][cury]=3;
						  printc(curx+1,cury,3);
						      
					  }
					  else if(level_temp[curx+2][cury]==4){

					      if(level[g][cury][curx]==4||level[g][cury][curx]==5){
					          level_temp[curx][cury]=4;
				              printc(curx,cury,4);
					      }
						  else{
					          level_temp[curx][cury]=0;
				              printc(curx,cury,0);
					      }
					      
						  curx=curx+1;
						  level_temp[curx][cury]=1;
						  printc(curx,cury,1);
						  level_temp[curx+1][cury]=5;
						  printc(curx+1,cury,5);
						  pass();
					  }
					  pass();
				  }
				  while((P1&0x08)==0);
				  break;
	    case 0x0f:	   /*确定*/
				  break;
	}
}
  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值