毕设仿真分享 单片机推箱子游戏(AT89C51)-程序员宅基地

技术标签: 单片机  

51单片机游戏(推箱子)

一、电路设计

此电路由AT89C51最小系统、LCD12864显示模块、74LS08芯片和四个独立按键组成。
LCD12864显示模块
带中文字库的128X64 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体
中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192 个16 16 点汉字,和128 个16 8 点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芯片内有共四路二个输入端的与门。内部线路如下图:
在这里插入图片描述
在这里插入图片描述

二、运行效果

在这里插入图片描述

在这里插入图片描述

三、部分代码


#include 
#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;
	}
}

项目获取:

https://gitee.com/feifei1122/simulation-project

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/konliut/article/details/135455312

智能推荐

c语言1 4的商,c语言1-4章题答案.doc-程序员宅基地

文章浏览阅读60次。c语言1-4章题答案1-4章习题习题1-5#includevoid main printf "**************************\n\n" ; printf " Very Good!\n\n" ; printf "**************************\n" ; 习题1-6#includevoid main int a,b,c,max;printf "plea..._c语言的商

Vue集成百度地图实现位置选择_百度地图 vue 搜索下拉选择-程序员宅基地

文章浏览阅读3.7k次,点赞10次,收藏78次。Vue基础百度地图实现位置选择需求:添加门店时,需要选择门店的省、市、区、详细地址、以及门店的经纬度信息。解决方案:集成百度地图API,通过在地图上搜索或者点击获取门店的具体位置信息。......_百度地图 vue 搜索下拉选择

20080529转载:GridView 数据控件的七种字段类型(Fields Type)的应用-程序员宅基地

文章浏览阅读97次。9.8 数据控件的七种字段类型(Fields Type)的应用GridView共支持七种字段类型,字段原本应该叫“Column”比较恰当,但ASP.NET 2.0却采用另一个名称“Field”来表示,对于名称的命名祭司认为有点不直观,因为不明的人看了根本不知道Field代表什么东西,但既然ASP.NET 2.0使用了Field,各位就迁就一下,表9-6为GridView支持七种字段类型的说明..._[datafield("",type=)]

android-高效开发命令汇总-程序员宅基地

文章浏览阅读66次。2019独角兽企业重金招聘Python工程师标准>>> ..._androⅰd编程语句大全 site:blog.csdn.net

linux里命令的对话框whiptail-程序员宅基地

文章浏览阅读272次。Linux里面可以在命令行里形成对话框,用光标上下,左右选择,一屏一屏的问答选择,填写。whiptail是Linux不需要另行安装,默认就有的,其它的比如dialog需要另行安装,很麻烦,虽然功能比较好些。帖一个写好的东西。#!/bin/bashtrap "" 2while truedoOPTION=$(whiptail --title "Email Manager" --n..._linux whiptail 自动关闭

R语言第二章作业_.r .cxrrrr i rrzszdxx人. the rx dyfe.ifdbf. the ddr-程序员宅基地

文章浏览阅读987次,点赞2次,收藏6次。致读者: 博主是一名数据科学与大数据专业大二的学生,真正的一个互联网萌新,写博客一方面是为了记录自己的学习过程中遇到的问题和思考,一方面是希望能够帮助到很多和自己一样处于困惑的读者。> 由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!之后会写大数据专业的文章哦。GitHub链接https://github.com/wfy-belief尽管现在我的水平可能还不太及格,但我会尽我自己所能,做到最好。——天地有正气,杂然赋流形。下则为河岳,上则为日星。码文不易,可以给我._.r .cxrrrr i rrzszdxx人. the rx dyfe.ifdbf. the ddrxf自然段,人

随便推点

深度学习论文翻译解析(二):An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Ap...-程序员宅基地

文章浏览阅读1.5k次。论文标题:An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition论文作者: Baoguang Shi, Xiang Bai and Cong Yao论文代码的下载地址:http://mc.eistar.n..._转录层与连接时间分类

dom4j生成、解析xml-程序员宅基地

文章浏览阅读64次。Java代码 /** *创建xml *@paramobj泛型对象 *@paramentityPropertys泛型对象的List集合 *@paramEncodeXML自定义编码类型 *@paramXMLPathXML文件的路径及文件名..._dom4j生成解析xml

vscode代码格式化js自动换行问题_vscode格式化定义js换行规则-程序员宅基地

文章浏览阅读1w次,点赞6次,收藏8次。vscode代码格式化js自动换行问题如果设置了默认格式化是使用自带JavaScript和Typescript的语言功能会看的吐血类似下面这种// 使用自带JavaScript和Typescript的语言功能 var a = $(this) .closest('.b') .find('.c .d') .val() var e = '<div class="sadasd-asd-sda-ashide">' + $input + '<ul _vscode格式化定义js换行规则

ListView中嵌套ViewPager(ViewPager是item的一部分),并且存在判断位置的小白点。...-程序员宅基地

文章浏览阅读55次。============问题描述============ 被bug困扰了好久:1.白点会出现混乱,有的时候是正常的,有的时候会不动(如果界面只有一个item,白点可以正常切换,有两个item就会不动)。2.当有两个item时,如果滑动上一个item图片与下一个item一样时,下面的item的图片就会消失。本人新手,贴上代码,求各位大神..._listview 嵌套viewpager viewpager item复原

详解三次握手与四次挥手及相关面试题回答_3次握手4次挥手面试怎么回答-程序员宅基地

文章浏览阅读2.7k次,点赞3次,收藏14次。三次握手含义三次握手其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。TCP报文要想弄懂三次握手,得先从TCP的报文格式入手:有32位的序号和确认序号。 ACK:置为1便是确认连接。 SYN:置为1代表发起一个新连接。 FIN:置为1代表释放一个连接。 具体过程标志位的解释前两次建立连接时._3次握手4次挥手面试怎么回答

(保姆式教学) Win10 + Ubuntu 20.04——双系统安装方法 + 配置显卡 + root权限 + flash调配_双系统安装保姆教程-程序员宅基地

文章浏览阅读9.5w次,点赞209次,收藏1.1k次。这里写自定义目录标题Win10 + Ubuntu 20.04——双系统安装方法 + 配置显卡 + root权限 + flash调配(保姆式教学)请同学们提前准备:第一步:**准备U盘**第二步:**确定自己电脑的类型**第三步:**安装ubuntu镜像**第四步:**为新系统,分配硬件存储空间**第五步:**用UltralSO软碟通,将 UBUNTU 的镜像写入 U盘**最后一步!胜利就在眼前!:**使用U盘,安装新系统**特殊事项root限权问题赠送一条Tip最后的最后Win10 + Ubuntu 20_双系统安装保姆教程