推箱子游戏51单片机课设计(最全)_第1页
推箱子游戏51单片机课设计(最全)_第2页
推箱子游戏51单片机课设计(最全)_第3页
推箱子游戏51单片机课设计(最全)_第4页
推箱子游戏51单片机课设计(最全)_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、51单片机课程设计 题 目:基于51单片机的推箱子游戏设计 目 录1、课程设计目的12、课程设计题目和实现目标13、设计方案14、proteus仿真原理图75、程序设计96、调试总结287、设计心得体会28参考文献29附录:程序代码-291、课程设计目的mcs-51单片机课程设计是与mcs51单片机课程相配套的实践教学环节。mcs51单片机是一门实践性很强的专业基础课,通过课程设计,达到进一步理解单片机的硬件、软件和综合应用方面的知识,培养实践能力和综合应用能力,开拓学习积极性、主动性,学会灵活运用已经学过的知识,并能不断接受新的知识。培养大胆发明创造的设计理念,为今后就业打下良好的基础。通过

2、课程设计,掌握以下知识和技能:1. 单片机应用系统的总体方案的设计;2. 单片机应用系统的硬件设计;3. 单片机应用系统的软件程序设计;4. 单片机开发系统的应用和调试能力 2、 课程设计题目和实现目标2.1 课程设计题目:基于51单片机的推箱子游戏设计2.2实现目标设计一款在以51单片机为核心的硬件系统中运行的推箱子游戏。游戏一共9关,功能包括:(1)显示游戏开机界面和游戏界面;(2)按键处理包括移动小人和移动箱子,通过移动上下左右键来控制小人的移动,通过小人推动箱子,把箱子推到指定的目的地为过关,箱子只能推不能拉;(3)用于可以任意选关,并能随时退出、进入游戏;(4)每一关都有时间计时,显

3、示当前玩家的游戏耗时。3、设计方案根据设计目标,整个系统框图如下:图1 系统框图3.1 控制模块选用atmel公司 生产的at89c52为主控芯片,它是是一个低电压,高性能cmos 8位单片机,主要功能特性如下:1、 兼容mcs51指令系统;2、8k可反复擦写(大于1000次)flash 7、2个串行中断,可编程uart串行通道;8、2个外部中断源,共8个中断源;9、2个读写中断口线,3级加密位;10、 低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;本次课设选用pdip封装的 at89c52芯片,其引脚功能如图2所示,图3为最小系统: 图2 引脚功能图3 最小系统u1:at89c52,dipf

4、封装;c1,c2:22pf瓷片电容c3:10uf电解电容;x1:12m晶振r1:10k金属膜电阻3.2 显示模块选用内置t6963c控制控制器的12864图形点阵液晶(以下简称lcd12864)做为显示模块。t6963c控制器的最大特点具是有硬件初始值设置功能,显示驱动所需的参数,例如:占空比系数、每行驱动传输的字节数、字符的字体选择等均由引脚电平设置。所以,液晶显示模块在上电时t6963c控制器就进行初始化设置,软件操作的主要精力就可以全部用于显示界面的设计上。 市场上出售此控制器的液晶很多,本次课设选用深圳市晶日达科技有限公司生产kxm12864f.lcd12864和单片机以模拟方式连接,

5、即通过模拟操作时序的方法控制液晶显示。具体的接线图如图4所示图4 显示模块rp1:1k排阻,用于做p0口的上拉电阻;lcd1:kxm12864f3.3按键模块16个轻触按键连接成4*4矩阵键盘,做为按键模块,如图5所示图5 4*4矩阵键盘最终系统的硬件系统如下:图6 硬件系统4、 proteus仿真原理图 在proteus搭建的仿真原理图如下:图7 硬件系统图8 开机画面图9 游戏画面图10 游戏画面5. 程序设计5.1 lcd12864显示驱动程序图11 读写指令/数据时序图准备向lcd12864进行操作时,首先要读取lcd12864的当前的状态,只有lcd12864不忙的时候才能读写操作和

6、数据。相关程序如下:/*函数名:status_bit_01()功能:状态位sta1(读/写指令),sta0(读/写数据)判断入口参数:返回值:状态值i*/ unsigned char status_bit_01() unsigned char i; p0=0xff;cd=1;rd=0;for(i=10;i0;i-)if(p1&0x03)=0x03)break;rd=1;return i; /*函数名:write_data(unsigned char dat)功能:写数据入口参数:8位数据dat返回值:*/void write_data(unsigned char dat)while(statu

7、s_bit_01()=0);rd=1;cd=0;wr=0;p0=dat;wr=1;cd=1; /*函数名:write_cmd1(unsigned char cmd)功能:写命令,无参数入口参数:8位命令cmd返回值:*/void write_cmd1(unsigned char cmd)while(status_bit_01()=0);rd=1;cd=1;wr=0;p0=cmd;wr=1;cd=0; /*函数名:write_cmd2(unsigned char cmd)功能:写单参数命令入口参数:8位数据dat,8位命令cmd返回值:*/void write_cmd2(unsigned cha

8、r dat,unsigned char cmd)write_data(dat);write_cmd1(cmd);/*函数名:write_cmd2(unsigned char cmd)功能:写双参数命令入口参数:8位数据data1,8位数据data2,8位命令cmd返回值:*/void write_cmd3(unsigned char data1,unsigned char data2,unsigned char cmd) write_data(data1); write_data(data2); write_cmd1(cmd);图12 为lcd12864的指令集,向lcd12864写入相关的指

9、令,即可控制其显示。图12 lcd12864的指令集使用液晶前必须对其进行初始化操作,初始化的内容包括光标指针设置,图形区首地址,图形区宽度,显示方式设置,图形方式显示,标形状设置。相关程序如下:/*函数名:init_12864()功能:初始化lcd12864入口参数:返回值:*/void init_12864()wr=1;rd=1;cd=1;rst=1;/初始化write_cmd3(0x01,0x00,0x21);/光标指针设置write_cmd3(0x00,0x00,0x42);/图形区首地址write_cmd3(16,0x00,0x43);/图形区宽度 write_cmd1(0x88);

10、/显示方式设置,正常显示write_cmd1(0x98);/图形方式显示,不显示字母,只打点write_cmd1(0xa0);/光标形状设置1 0 1 0 0 n2 n1 n05.2 按键扫描程序初始p1的电平为0x0f,当有按键下时,电平发生变化,开始程序开始扫描判断哪个按键被按下,并返回按键号,相关程序如下:/*函数名:keys_scan()功能:按键扫描入口参数:返回值:按键号keyno */unsigned char keys_scan() unsigned char tmp;unsigned char keyno;if(p1 != 0x0f)p1 = 0x0f; delayms(1)

11、; tmp = p1 0x0f;switch(tmp)case 1: keyno = 0;break;case 2: keyno = 1;break;case 4: keyno = 2;break;case 8: keyno = 3;break;default:keyno = 16;p1 = 0xf0;delayms(1);tmp = (p1 4) 0x0f;switch(tmp)case 1:keyno += 0;break;case 2:keyno += 4;break;case 4:keyno += 8;break;case 8:keyno += 12;break;p1=0x0f;ret

12、urn keyno; 5.3 游戏元素设计出现在显示画面中的游戏元素总共有6种:墙壁,箱子,小人,目的地,空白,箱子在目的地。每个元素在液晶上以一个字符显示,即88的点阵。在字模提取软件设计各个元素,并获得元素的显示码。显示码的每8位构成字符的一行,8就行有8个字节。其中1表示该点显示,0表示该点不显示。图13-是在字模提取软件设计的各个元素, 图13 小人 图14 墙壁 图15 箱子 图16 目的地 图17 箱子在目的地 图18空白 定义一个二维数组elements8,存储这些点阵信息。其中第一个地址为元素代号unsigned char code elements8=0x00,0x00,0x

13、00,0x00,0x00,0x00,0x00,0x00, /0空白0x3c,0x7e,0x66,0x3c,0x7e,0x99,0x3c,0x66, /1人物0x7f,0x7f,0x7f,0x00,0xef,0xef,0xef,0x00, /2砖头0xff,0xc3,0xa5,0x99,0x99,0xa5,0xc3,0xff, /3箱子0x00,0x18,0x24,0x4a,0x52,0x24,0x18,0x00, /4目标0xff,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0xff, /5箱子到达目标 ;5.4元素的显示由于t6963c液晶是按以列1字符(8点),行1点来定位

14、的,所以显示时,要先定位显示字符位的列字符和行字符首地址,即行*0x80+列;再定义一个循环变量i,从0,到7,定位该字符位的8个点行,即行*0x80+列+i*0x10,定位到每个点行后,写入对应的元素字节,即elements元素代号i,就可以在液晶的指定字符位置上显示该元素了。相关元素显示子函数如下:/*函数名:printelement()功能:指定字符位置,显示元素入口参数:列字符地址xh,行字符地址yh,元素代码elnum返回值:*/void printelement(unsigned char xh, unsigned char yh,unsigned char elnum) unsi

15、gned char i;int temp; for(i=0;i8;i+) /行地址加+1temp = yh* 0x80+i*0x10 + xh;write_cmd3(temp&0xff,temp/0xff,add_pos);write_cmd2(elementselnumi,noc_wr); 调用如下程序,对显示元素进行测试,图19为显示效果:printelement(0,1,1); /在第0列,第1行,显示1号元素(小人)printelement(1,1,2); /在第1列,第1行,显示2号元素(墙壁)printelement(2,1,3); /在第2列,第1行,显示3号元素(箱子)prin

16、telement(3,1,4); /在第3列,第1行,显示4号元素(目的地)printelement(4,1,5); /在第4列,第1行,显示5号元素(箱子在目的地上)图19 显示效果5.5 游戏关卡界面设计游戏每关都是在88个字符组成的区域中进行的,只要在每一个字符显示相应的元素,就可以组成游戏界面。定义一个三维数组code level88,存储每一关每一个字符位上要显示的元素。 各关卡的界面如下:/*第1关*/0,0,2,2,2,2,2,0,2,2,2,0,0,0,2,0,2,0,3,0,2,0,2,2,2,0,2,0,0,4,0,2,2,0,0,0,0,2,0,2,2,2,0,2,0,0

17、,0,2,0,2,1,0,0,2,2,2,0,2,2,2,2,2,0,0, 图20 第1关游戏画面/*第2关*/2,2,2,2,2,2,2,2,2,0,0,0,0,0,1,2,2,0,0,0,5,0,0,2,2,0,0,2,2,2,2,2,2,2,0,0,2,0,0,0,2,0,3,0,2,0,0,0,2,0,0,4,2,0,0,0,2,2,2,2,2,0,0,0, 图21 第2关游戏画面/*第3关*/0,0,2,2,2,2,0,0,0,0,2,4,4,2,0,0,0,2,2,0,4,2,2,0,0,2,0,0,3,4,2,0,2,2,0,3,0,0,2,2,2,0,0,2,3,3,0,2,2

18、,0,0,1,0,0,0,2,2,2,2,2,2,2,2,2, 图22 第3关游戏画面 /*第4关*/0,0,0,2,2,2,2,0,0,2,2,2,0,1,2,0,0,2,0,0,3,0,2,0,2,2,0,2,0,2,2,2,2,0,0,2,0,2,4,2,2,0,2,0,0,3,4,2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2, 图23 第4关游戏画面/*第5关*/0,0,0,2,2,2,2,0,0,2,2,2,0,1,2,0,0,2,0,0,3,0,2,0,2,2,0,2,0,2,2,2,2,0,0,2,0,2,4,2,2,0,2,0,0,0,0,2,2,0,0,

19、0,0,0,0,2,2,2,2,2,2,2,2,2, 图24 第5关游戏画面/*第6关*/0,0,0,2,2,2,2,0,0,2,2,2,0,1,2,0,0,2,0,0,3,0,2,0,2,2,0,2,0,2,2,2,2,0,0,2,0,2,4,2,2,0,2,0,0,3,4,2,2,0,3,0,0,0,4,2,2,2,2,2,2,2,2,2, 图25 第6关游戏画面 /*第6关*/0,0,2,2,2,2,2,0,2,2,2,0,0,0,2,0,2,0,3,0,2,0,2,2,2,0,2,0,0,4,0,2,2,0,0,0,0,2,0,2,2,2,3,2,4,0,0,2,0,2,1,0,0,2

20、,2,2,0,2,2,2,2,2,0,0, 图26 第7关游戏画面/*第7关*/0,2,2,2,2,0,0,0,2,2,0,0,2,0,0,0,2,1,3,0,2,0,0,0,2,2,3,0,2,2,0,0,2,2,0,3,0,2,0,0,2,4,3,0,0,2,0,0,2,4,4,5,4,2,0,0,2,2,2,2,2,2,0,0, 图27 第8关游戏画面/*第9关*/0,0,0,2,2,2,2,0,0,2,2,2,0,0,2,0,2,2,0,1,3,0,2,0,2,0,4,3,0,0,2,0,2,0,4,5,0,2,2,0,2,0,4,3,0,2,0,0,2,2,0,0,2,2,0,0,0

21、,2,2,2,2,0,0,0, 图28 第9关游戏画面;5.6 开机画面开机画面是用画图程序制作的一个128像素64像素的单色位图,并用取模软件提取该图像的点阵信息,共1024字节。使用t6963c的写数据地址自动加1的命令写入上述全部1024字节的数据,显示开机画面。图29 开机界面图30 字模提取图31 proteus中显示效果图像的点阵码:/*- 宽度x高度=128x64 -*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0

22、x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0

23、x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0

24、x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xe0,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x7c,0xc0,0x06,0x30,0xc6,0

25、x00,0x1f,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x86,0xc7,0xf0,0x06,0x1f,0xc7,0xf8,0x30,0x00,0x01,0xc0,0x00,0x00,0x00,0x00,0x01,0x87,0x86,0x18,0x0c,0x01,0x80,0x0c,0x30,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x01,0x87,0x82,0x18,0x1c,0x01,0x80,0x0e,0x30,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x01,0x87,0x06,0

26、x0c,0x18,0x01,0x00,0x06,0x30,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x0f,0x87,0x07,0x0f,0x10,0x03,0x00,0x0c,0x30,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x0c,0x06,0x00,0x01,0x90,0x43,0x00,0x0c,0x1f,0xff,0x01,0x80,0x00,0x00,0x00,0x00,0x0c,0x06,0x00,0x01,0x98,0xc3,0x08,0x38,0x00,0x3e,0x03,0x00,0x00,0x00,0x00,0

27、x00,0x0c,0x0c,0x00,0x01,0x8f,0xc3,0x1c,0x38,0x00,0x3c,0x06,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x00,0x03,0x1f,0xc7,0xfc,0x7c,0x7f,0xf6,0x0f,0xe0,0x00,0x00,0x00,0x00,0x0f,0x88,0x1e,0x1f,0x1c,0x7f,0x67,0xdc,0xc0,0x03,0x18,0x30,0x00,0x00,0x00,0x00,0x01,0x8c,0x00,0x03,0x18,0x01,0x80,0x0c,0xc0,0x01,0xf0,0

28、x30,0x00,0x00,0x00,0x00,0x03,0x87,0x80,0x03,0x10,0x00,0x80,0x0c,0xc0,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x0e,0x01,0x80,0x03,0x10,0x00,0x9f,0x0c,0xc0,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x0c,0x01,0x80,0x03,0x18,0x0f,0x80,0x0c,0xc0,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x0c,0x01,0x9e,0x1f,0x0e,0x1b,0x80,0

29、x0c,0xc0,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x0c,0x03,0x00,0x03,0x0e,0x31,0x00,0x0c,0x7f,0xf0,0x7f,0xe0,0x00,0x00,0x00,0x00,0x0c,0x06,0x00,0x03,0x1c,0x30,0x9f,0x0c,0x00,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x07,0x86,0x00,0x03,0x38,0x30,0xc0,0x0c,0x00,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x01,0x86,0x1e,0

30、x1f,0x30,0x18,0xc0,0x0c,0x01,0xf0,0x60,0x00,0x00,0x00,0x00,0x00,0x07,0x86,0x00,0x01,0xb0,0x0f,0x80,0x0c,0x03,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x0c,0x06,0x00,0x01,0x98,0x07,0x1f,0x0c,0x03,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x0c,0x06,0x00,0x01,0x8c,0x06,0x00,0x0c,0x03,0x00,0x60,0x00,0x00,0x00,0x00,0

31、x00,0x0c,0x06,0x00,0x03,0x07,0x06,0x00,0x0c,0x03,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x0c,0x06,0x0f,0xff,0x03,0x06,0x00,0x0c,0x03,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x0c,0x0f,0x18,0x00,0x03,0x07,0x00,0x18,0x03,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x07,0xf9,0xf0,0x00,0x01,0xfd,0xff,0xf0,0x01,0xff,0x80,0

32、x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0

33、x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0

34、x00,0x00,0x00,0x00,0xfd,0xfe,0x18,0x7f,0x3f,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x8d,0xb6,0x18,0x31,0xb6,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x8c,0x30,0x1c,0x31,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x30,0x3c,0x31,0x86,0x00,0x00,0x00,0

35、x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x30,0x3c,0x3f,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x30,0x36,0x36,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x30,0x3e,0x36,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x30,0x66,0x33,0

36、x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x8c,0x30,0x63,0x33,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x8c,0x30,0x63,0x31,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf8,0x78,0xf7,0xf9,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0

37、x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0

38、x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,5.7 游戏流程游戏中,程序循环执行按键扫描程序,并做出相应判断。整个程序中,最关键的部分是要根据玩家的输入,控制小人、箱子的移动。定义一个二维数组,用于保存当前游戏状态每

39、个字符位的元素,当玩家按键输入时,改变该数组中相应得数据,再将此二维数组每个数据代码的元素显示出来,就可以出现小人,箱子移动的效果。每关开始,进行游戏初始化。将关卡数据写入上述二维数组中,并记入小人的位置(man_x,man_y)。程序只要根据小人移动方向周围的元素信息,结合游戏规则,只要判断能够移动箱子、小人的情况,才显示出来,而不用对不能移动的情况进行判定,这大大简化了程序的编写。游戏流程框图如下(以向上移动为例,其他方向类似):图32 流程框图1图33 流程框图2图34 流程框图3小人、箱子移动示意图(按列看,不同的列对应上述流程的不同情况):图35 移动示意图5. 8完成本关每进行一次

40、移动后就进行是否过关的判定。将记录本关每个字符位状态的数组与存储本关原始信息的数组的对应数据进行比较,若发现目的地上没有箱子,则不算过关,程序退出,进入等待按键输入程序,若所有的目的地都有箱子,则游戏过关,初始化下一关游戏,显示下一关游戏界面。/*函数名:level_suc()功能:判断是否通过本关卡入口参数:返回值:*/void level_suc()unsigned char i,j,k=1;for(i = 0; i 8; i+) /行if(k=0) break;for(j = 0; j 8; j+)/列 if(levellevelgij=4|levellevelgij=5)/循环扫描目标

41、位置都有箱子在,此关卡就通过if(level_tempij=5)k=1;/此位置箱子在目标位置上elsek=0;/有目标位置没有箱子break;if(k=1)/所有目标位置都有箱子if(levelg8)levelg+=1;else levelg=0; /通关后重新从第一关开始timtcount=0; /计时清零th0=(65536-50000)/256;tl0=(65536-50000)%256;tcount=0;gamebg(levelg);5.9 选关按相应的选关键,会改变记录游戏关卡的变量levelg,对游戏重新初始化,即可记录所选关卡。相关程序如下:case 5:if(levelg!=

42、8)levelg+;gamebg(levelg); /显示第一关timtcount=0;th0=(65536-50000)/256;tl0=(65536-50000)%256;tcount=0;break;/下一关case 6:if(levelg!=0)levelg-; gamebg(levelg); /显示第一关timtcount=0;th0=(65536-50000)/256;tl0=(65536-50000)%256;tcount=0;break; /上一关5.10 计时利用右半瓶的88字节的空间,显示当前游戏计时和当前关卡。界面设计如下:图36 计时界面其中汉字站4个字符,数字占两个字

43、符。点阵码也是用字模软件提取的,显示方式与游戏元素的显示方式相同。显示效果如图所示:图37 计时界面显示效果使用定时器0的计时功能,每到1秒,触发中断程序,计时变量timtcount就加1,在对其进行数字分解,将各位在响应的位置上显示出来。void t0_tt() interrupt 1th0=(65536-50000)/256;tl0=(65536-50000)%256;tcount+;if(tcount=20)tcount=0;timtcount+;time_change(timtcount);void time_change(unsigned int ttime)unsigned cha

44、r a1,a2,a3,a4,a5;unsigned char i,j;a1=ttime/10000;a2=ttime/1000%10;a3=ttime/100%10;a4=ttime/10%10;a5=ttime%10;for(j=0;j16;j+) /a1for(i=0;i1;i+)setc_xy(9+i,32+j);write_cmd2(shuzia1j,inc_wr); for(j=0;j16;j+) /a2for(i=0;i1;i+)setc_xy(10+i,32+j);write_cmd2(shuzia2j,inc_wr); for(j=0;j16;j+) /a3for(i=0;i1

45、;i+)setc_xy(11+i,32+j);write_cmd2(shuzia3j,inc_wr); /for(j=0;j16;j+) /a4for(i=0;i1;i+)setc_xy(12+i,32+j);write_cmd2(shuzia4j,inc_wr); /for(j=0;j16;j+) /a5for(i=0;i1;i+)setc_xy(13+i,32+j);write_cmd2(shuzia5j,inc_wr); 6、调试总结下面列些了在进行proteus仿真过程中出现几个问题,通过解决这些问题是我提高了调试能力。1. 忘记将c文件调添加进工程中,导致定义的函数不能被调用;2. 由按键扫描,获取按键编号,再通过按键编号执行相关操作。记录按键编号的变量要及时复位,否则在没有按键按下时,程序出现误操作;3. 图形液晶显示器的最大特性是要先定位,在写数据,而且是按1字节写入的,所以行是按位寻址,列是按字节寻址,即行有64行,列有8列。显示时常常没有注意到这个,导致定位不准确,没有出现应有的图形;4. 调试时常常出现multiple public definitions的错误而能编译。经过多方查找,解决了这个问题,并个深刻的明白.h文件和.c文件的关

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论