资源描述
文档供参考,可复制、编制,期待您的好评与关注! 32 / 36摘 要本文基于单片机设计的贪吃蛇游戏,具有传统意义上的贪吃蛇游戏的特点:吃豆子蛇身增长,得分;分数达到一定等级进行升级以后,蛇运动速度加快等。为节省存储空间,游戏算法上进行了新的设计,定义一个一维数组,利用位操作存储读取蛇头的运动状态信息。具体实现上,硬件系统平台采用51系列单片机,搭载LCD,构成了一个轻巧便携的游戏机系统。文中具体介绍了使用到的各种硬件的特性,游戏的各种功能与详细设计,软件的具体设计思路,各模块的详细介绍,部分模块的程序流程图,状态迁移图,关键部分代码的详细讲解等。关键词:贪吃蛇游戏;单片机;LCD12864 AbstractIn this paper,the Snake game is such a game based on single chip,with the traditional Snake game features: Snake body grows and scores with eating a bean;Scores reached a certain number to upgrade the level and speedIn order to save the storage space,the algorithms of game makes anew designBy defining a one-dimensional array,snake heads motion states are stored and read in this array with bit operationThe hardware system uses single chip platform with LCD, ultimately forming a compact portable game system The article introduces the use of a variety of hardware features,the game features and the detailed design,software design of the specific ideas,details of various modules,some modules of the program flow chart,state transition graph,a key part of the code details and so on朗读显示对应的拉丁字符的拼音朗读显示对应的拉丁字符的拼音字典 - 查看字典详细内容1. 名词 1. summary2. abstract朗读显示对应的拉丁字符的拼音Keywords:Greedy Snake Game; single chip; LCD12864目 录摘 要I目 录III第一章 绪论1.1手持游戏介绍11.2研究背景与意义11.3手持游戏的发展状况1第二章 单片机简介42.1单片机的定义42.2单片机的基本结构42.3单片机执行指令的过程52.4单片机的特点6第三章 LCD12864原理73.1 LCD12864概述73.2 LCD12864主要硬件构成说明83.3 LCD12864外部接口93.4 LCD12864指令说明103.5 LCD12864读写操作时序123.6 LCD12864的应用说明14第四章 系统硬件设计154.1系统结构框图154.2系统原理图154.3主要模块介绍及其功能16第五章 系统软件设计185.1游戏设计思想185.2系统软件设计流程图195.3贪吃蛇游戏系统实现主程序20第六章 系统运行结果26第七章 结束语,30参考文献31致 谢32 第一章 绪 论1.1手持游戏介绍手持游戏起源于1976年,由美国Mattel公司开发的Mattel Electronics Handheld Games系列。首款上市的产品名为Mattel Auto Race,是最早将LED应用在电子游戏的掌机始祖。 手持游戏一般具有流程短小,节奏明快的特点。由于其目的是供人们在较短时间内(如等车、排队的过程中)娱乐,所以不会像一般视频游戏那样具有复杂的情节;同时,由于硬件条件的限制,一般掌机的画面和声音都不如同时期的家用游戏硬件(这种情况可能由于任天堂NDS和索尼PSP的推出而有所改变)。这就对游戏设计者提出了更高的要求。 在亚洲地区,特别是日本和中国,手持游戏具有大量的用户群,并带动了大量相关软、硬件产业的发展。这是因为手持游戏具有便于携带和随时娱乐的特点,同时近年来掌机游戏加入的收集、交换等要素进一步提升了这类游戏的魅力,例如著名的口袋妖怪游戏,已成为一种文化现象和符号,其每一新作都会成为青少年群体的话题。1.2研究背景与意义随着社会的发展,人们生活的步调日益加快,越来越多的人加入了全球化的世界。人们不再拘泥于一小块天地,加班,出差成了现代人不可避免的公务。而此时一款可以随时随地娱乐的游戏成了必需品。贪吃蛇这一游戏简单易行,操作方便,娱乐性较强,吸引了不少人。这一款游戏紧紧地抓住了人们的心理,虽然简单,却其乐无穷,在人们不断追求更多的欲望下,该游戏给人们带来了追逐的快感,以及成功后的满足感,对于一直处于高压下的现代人是很好的放松工具。 当前科学技术飞速发展,特别是微电子技术,计算机软件与应用技术的发展,使得人们的日常生活丰富多彩。单片微型计算机(简称单片机)作为微型计算机家族的一员,以其独特的结构,良好的稳定性,便宜的价格在嵌入式领域广泛应用。与传统的PC上设计的贪吃蛇游戏不同,本次作者利用Proteus硬件仿真软件,采用单片机、液晶显示屏、扬声器、按键等搭建硬件平台,C语言编程,实现便携地贪吃蛇游戏。1.3手持游戏的发展状况 在70年代,由于游戏行业的良好经营状况,让众多的公司一窝蜂的加入了游戏开发的行列。这种行为虽然促进了游戏界行业的发展,开拓了游戏的种类,但也造成了大量的伪劣游戏充斥于整个业界。于是在1982年,爆发了名为“雅利达冲击”的事件。这次事件,原由就是市场上充斥的大量低质游戏。其结果造成了玩家的集体反对,导致无人再去购买游戏。一时间,繁荣的游戏产业成为昨夜黄花,业界一片萧条景象。而在众人都以为游戏行业已经成为过去的时候,任天堂的FC闪亮登场,打造出新的游戏王朝。 而FC的辉煌,又让业界的其他人士点燃了心中的希望。于是乎1985年,SEGA发售了代号为“MK III”的家用游戏机;而NEC则在1987年发售了PC-E。可惜的是这两款游戏机在国内少的出奇,大部分人都无缘与之相见。而在这两款游戏机发售之后,业界进入了战国时代,但是由于FC上大量优质游戏的存在,SEGA和NEC始终无法撼动任天堂业界老大的位置,只能另辟途径。 1988年,SEGA公司发售了头一款16位游戏机“MEGA DRIVE”,简称MD。虽然还是没有撼动FC的王者地位,但多多少少也带来了一些冲击。尤其的其后在美国市场,MD更是独领风骚。而这款游戏机在我国的16位游戏机领袖战中,也是保持了老大的地位。 而这个时期的任天堂也并没有在家坐吃山空,他首先于1989年发售了新型手掌游戏机“GAME BOY”,简称GB;接着在1990年发售了“Super Family Computer”,简称SFC。当然其他的公司同样没有闲着,SEGA于1990年发售手掌机“GAME GEAR”,准备与任天堂抢夺掌机市场;SNK也在同年发售其第一款家用游戏机“NEOGEO”。可惜的是由于软件方面的优势,任天堂的SFC还是占据着王位。 这段时期应当说是任天堂时期,因为在这期间,任天堂始终都是游戏界的老大,而他对游戏界的发展也同样起着不可忽视的作用。 出于对游戏行业的灿烂辉煌,以及在16位游戏机大战中任天堂不可动摇的地位等等想法,1994年,3DO与松下发售了他们共同开发的第一款32位家用游戏机3DO。同年SEGA发售了“SEGA SATURN”,简称SS;索尼发售“PLAYSTATION”,简称PS;NEC发售PC-FX;次年任天堂发售了头戴式液晶游戏机“VR BOY”,简称VB;但是由于没有对应的优秀软件出现,在其失败后,任天堂又于1996年发售了 “NINTENDO 64”,简称N64。至此,游戏界进入三国争雄时代,这三雄是SEGA的SS、索尼的PS和任天堂的N64。而最早出现的3DO和NEC的PC-FX以及任天堂的VB,都很快的退出了市场。说到这了新一代的游戏迷们基本上应该多少知道些了,因为新一代的大部分游戏迷都是从PS游戏开始成为游戏迷的。但是这个辉煌的时代,并不是只有这些而已。 1998年3月,任天堂发售GB强化机型“GAME BOY COLOR”,简称GBC;同月SNK发售其头款掌机“NEOGEO POCKET”,简称NGP,其后NGP于99年彩色话;接着是SEGA因SS后期的颓废形势,发售了新机种“DREAMCAST”,继续其未完的争霸事业;而索尼也在这一年,发售了“POCKET STASION”,相在掌机领域弄点甜头;到了1999年,BANDAI也眼馋任天堂GB系列的疯狂走势,发售了WONDER SWAN,简称WS,并于2000年彩色化。 到此,我觉得这个时代可以说是结束了。在这期间在家用主机上除了VB和PC-FX没有什么优秀游戏以外,3DO、SS、PS和N64每个主机上都出现了各种优秀的游戏。但是到了这个时期,由于任天堂采取的策略的些许失误以及主机硬件与时代的脱节导致其失去了业界老大的地位;而SEGA因为其一惯的作风,虽然其死硬型游戏迷众多,仍然没有逃脱其失败的命运;可是索尼凭借其在音乐娱乐领域的经验,让PS成为了32位主机战中的霸主。至此,游戏界走入了一个新的时代。 在32位家用游戏主机大战中的胜利,索尼又于2000年发售了PS后续机种:“PLAYSTASION2”,简称PS2。面对此情此景,SEGA已经无力回天,而任天堂则在2001年发售了GBC的后续机种“GAMEBOY ADVANCE”,简称GBA,后出现其后续机种GBASP,首先确保其在掌机领域的王者地位;接着在同年发售其最新的家用游戏主机“GAMECUBE”,简称GC,要夺回其游戏界霸主的地位。另一方面,电脑软件行业中的老大比尔.盖茨看着家用游戏行业的红火也眼红了,也在2001年,发售了微软公司的家用游戏主机“XBOX”。 到目前为止,家用机方面,PS2可以说是独领风骚,掌机方面GBA是一枝独秀。可是游戏业霸主之争还没结束,估计这场争霸战永远不会结束,只要还有人想玩游戏,这场比赛就会继续下去。 在游戏行业发展的这些年中,游戏机的种类并不是只有我说的以上几种。在我的记忆里,NEC同样出过一款手掌机,而且在国内也有过;而百代也出过一款家用主机,但数量太少,也就没有了消息;同样在美洲也发售过几款出名的主机,但由于在我过,基本上玩的家用游戏机都是日本造的,基本上没人知道;目前韩国还有一款新的掌机,可惜在我国数量太少了;而在开发过程中,因为种种原因不知所终的主机就更不用说了;最后,最重要的一点就是我们华人同样出过一款家用主机,并不是什么兼容机,而是完全由我们自己独立开发的主机。这款主机是由台湾方面研制的,可惜的是由于软件方面的缘故,很快就消声觅迹了,但我想只要我们努力,总有一天我们中国人可以造出完全是我们自己独立开发的最先进的游戏机。第二章 单片机简介单片微型计算机自20世纪70年代问世以来,以对人类社会产生了巨大的影响。尤其是美国Intel公司生产的MCS-51系列单片机,由于其具有集成度高、处理功能强、可靠性高、系统结构简单、价格低廉、易于使用等优点,在世界范围内已经得到广泛的普及和应用。而且随着以MCS-51单片机基本内核为核心的各种扩展型、增强型的新型单片机不断推出,MCS-51系列仍是我国单片机应用领域的主流机型。目前在工业控制、智能仪器仪表、办公室自动化、家用电器等诸多领域,到处都可看见单片机的踪影,单片机技术开发和应用高水平已成为一个国家工业化水平的标志之一。2.1单片机的定义单片机就是在一块半导体硅片上集成了微处理器(CPU),存储器(RAM,ROM,EPROM)和各种输入、输出接口(定时器/计数器,并行I/O口,串行口,A/D转换器以及脉宽调制器PWM等),这样一块集成电路芯片具有一台计算机的属性,因而被称为单片微型计算机,简称单片机。单片机主要应用与测控领域,用以实现各种测试和控制功能。在国际上,多把单片机称为微控制器MCU(MicroController Unit)。由于单片机在使用时,通常是处于测控系统的核心地位为并嵌入其中,通常也把单片机称为嵌入式控制器EMCU(Embedded MicroController Unit)。2.2单片机的基本结构1. 微处理器(CPU)MCS-51单片机中有1个8位的CPU,包括运算器和控制器两大部分,不仅可处理字节数据,还可以进行位变量的处理。例如:位处理、查表、状态检测、中断处理等。2. 内部数据存储器(RAM)单片机芯片共有256个RAM单元,其中后128单元被专用寄存器占用,能作为寄存器供用户使用的只是前128单元,用于存放可读写的数据。因此通常所说的内部数据存储器就是指前128单元,简称内部RAM。地址范围为00HFFH(256B)。片外最多可外扩64KB。RAM是一个多用多功能数据存储器,有数据存储、通用工作寄存器、堆栈、位地址等空间。3. 内部程序存储器(ROM)单片机内部有4KB的ROM,用于存放程序、原始数据或表格。因此称之为程序存储器,简称内部RAM。地址范围为0000HFFFFH(64KB)。片外最多可外扩64KB。4. 定时器/计数器单片机共有2个16位的定时器/计数器,具有4种工作方式,以实现定时或计数功能,并以其定时或计数结果对计算机进行控制。定时时靠内部分频时钟频率计数实现,做计数器时,对P3.4(T0)或P3.5(T1)端口的低电平脉冲计数。5. 并行I/O口MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3)以实现数据的输入输出。6. 串行口MCS-51单片机有一个全双工的串行口,具有4种工作方式,以实现单片机和其它设备之间的串行数据传送。该串行口功能较强,既可作为全双工异步通信收发器使用,也可作为移位器使用。RXD( P3.0)脚为接收端口,TXD(P3.1)脚为发送端口。7. 中断控制系统MCS-51单片机的中断功能较强,以满足不同控制应用的需要。共有5个中断源,即外中断2个,定时中断2个,串行中断1个,全部中断分为高级和低级共二个优先级别。8. 时钟电路MCS-51单片机芯片的内部有时钟电路,但石英晶体和微调电容需外接。时钟电路为单片机产生时钟脉冲序列。系统允许的晶振频率为12MHZ等。9. 特殊功能寄存器(SFR)特殊功能寄存器共有21个,用于CPU对片内各功能部件进行管理、控制、监视。实际上是片内各功能部件的控制寄存器和状态寄存器,是一个具有特殊功能的RAM区。2.3单片机执行指令的过程 单片机执行程序的过程,实际上就是执行所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-分析指令-执行指令。取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。2.4单片机的特点单片机应用在检测控制领域中,具有如下特点:1.小巧灵活、成本低、易于产品化。2.可靠性好,适应温度范围宽。3.易扩展,很容易构成各种规模的应用系统,控制功能强。4.可以很方便的实现多机和分布式控制系统。5.具有优异的性能价格比。6.存储器ROM和RAM是严格分工的。7.采用面向控制的指令系统。8.输入/输出(I/O)端口引脚通常设计有多种功能。9.品种规格的系列化。10.功率消耗低。所以从工业自动化、智能仪器仪表、消费类电子产品、通信方面、家用电器方面等,直到国防尖端技术领域,单片机都发挥着十分重要的作用。综观单片机几十年的发展历程,单片机今后将向多功能、高性能、高速度、低电压、低功耗、低价格、外围电路内装化以及片内存储器容量增加和Flash存储器化方向发展。可以预言,今后的单片机将是功能更强、集成的和可靠性更高而功耗更低,以及使用更方便。此外,专用化也是单片机的一个发展方向,针对单一用途的专用单片机将会越来越多。第三章 LCD12864原理3.1 LCD12864概述LCD12864是一种图形点阵液晶显示器,它主要由行驱动器/ 列驱动器及12864全点阵液晶显示器组成. 横向O-127共128个点阵,分为左右两屏各占063共64个点阵;纵向O63共64个点阵,每8个纵向点阵(8个点阵可以看成8位8位为1字节)构成一页,将屏幕分成8页,并按照纵向取模,字节倒序的方式显示1字节内容,可完成图形显示,也可以显示84个(1616点阵)汉字.1.主要技术参数和性能:电源:VDD:+5V;LCD外接驱动电压为 -3.0-8.0V 显示内容:128(列)64(行)点全屏幕点阵七种指令与CPU接口采用8位数据总线并行输入输出和8条控制线.占空比1/64工作温度: 0 +60 ,存储温度: -20 +70 2.外形尺寸图图3-1 LCD12864的外形尺寸图表3-1 LCD12864外形尺寸参数值 ITEM NOMINAL DIMENUNIT模块体积78.070.013.0mm视域62.044.0mm行列点阵数12864DOTS点距离0.440.60mm点大小0.390.55mm3.2 LCD12864主要硬件构成说明图3-2 LCD12864结构框图IC3为行驱动器.IC1,IC2为列驱动器.IC1,IC2,IC3含有如下主要功能器件:1.指令寄存器(IR)IR是用来寄存指令码,与数据寄存器寄存数据相对应.当D/I=1 时,在E信号下降沿的作用下,指令码写入IR.2.数据寄存器(DR) DR是用来寄存数据的,与指令寄存器寄存指令相对应.当D/I=1时,在E信号的下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7DB0 数据总线.DR 和DDRAM之间的数据传输是模块内部自动执行的.3.忙标志:BF BF标志提供内部工作情况.BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0时,模块为准备状态,随时可接受外部指令和数据.利用STATUS READ 指令,可以将BF读到DB7总线,从而检验模块之工作状态.4.显示控制触发器DFF 此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY ON),DDRAM 的内容就显示在屏幕上,DDF=0为关显示(DISPLAY OFF)。 DDF 的状态是指令DISPLAY ON/OFF和RST信号控制的。5.XY地址计数器 XY地址计数器是一个9位计数器。高三位是X地址计数器,低6位为Y地址计数器,XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y地址指针。 X地址计数器是没有记数功能的,只能用指令设置。 Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。6.显示数据RAM(DDRAM) DDRAM是存贮图形显示数据的。数据为1表示显示选择,数据为0表示显示非选择。DDRAM与地址和显示位置的关系见DDRAM地址表(见第6页)。7.Z地址计数器 Z地址计数器是一个6位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,RST复位后Z地址计数器为0。Z地址计数器可以用指令DISPLAY START LINE 预置。因此,显示屏幕的起始行就由此指令控制,即DDRAM的数据从哪一行开始显示在屏幕的第一行。此模块的DDRAM共64行,屏幕可以循环滚动显示64行。3.3 LCD12864外部接口表3-2 LCD12864外部接口信号管脚号管脚名称LEVER管脚功能描述1/CS1H/LL:选择芯片(左半屏)信号2/CS2H/LL:选择芯片(左半屏)信号3GND0V电源地4VDD5.0V电源电压5V0-3.0-8.0V液晶显示驱动外接负电压6D/IH/LD/I=“H”,表示DB7DB0为显示数据D/I=“L”,表示DB7DB0为显示指令数据7R/WH/LR/W=“H”,E=“H”,数据被读到DB7DB0R/W=“L”,E=“HL”, DB7DB0的数据被写到IR或DR8EH/L使能信号:R/W=“L”,E信号下降沿锁存DB7DB0 R/W=“H”,E=“H” DRAM数据读到DB7DB09DB0H/L数据线10DB1H/L数据线11DB2H/L数据线12DB3H/L数据线13DB4H/L数据线14DB5H/L数据线15DB6H/L数据线16DB7H/L数据线17RESETH/L复位信号,低电平复位18VEE-10VLCD驱动负电压19LEDADC+5V背光源正极(LED+5V)20LEDKDC0V背光源负极(LED-OV)3.4 LCD12864指令说明表3-3 LCD12864指令表指指令码功能令RWDID7D6D5D4D3D2D1D0显示ON/OFF0000111111/0控制显示器的开关,不影响DDRAM中数据和内部状态显示起始行0011显示起始行(063)指定显示屏从DDRAM中哪一行开始显示数据设置X地址0010111X:07设置DDRAM中的页地址(X地址)设置Y地址0001Y地址(063)设置地址(Y地址)读状态10B U S Y0ON/OFFRST0000读取状态RST 1:复位 0:正常ON/OFF 1:显示开 0:显示关BUSY 0:READY1: IN OPERATION写显示数据01显示数据将数据线上的数据DB7DB0写入DDRAM读显示数据11显示数据将数据线上的数据DB7DB0写入DDRAM1.显示开关控制(DISPLAY ON/OFF)代码R/W D/IDB7DB6DB5DB4DB3DB2DB1DB0形式 0 0 0 0 1 1 1 1 1 DD=1:开显示(DISPLAY ON) 意即显示器可以进行各种显示操作D=0:关显示(DISPLAY OFF) 意即不能对显示器进行各种显示操作 2.设置显示起始行(DISPLAY START LINE) 代码R/W D/IDB7DB6DB5DB4DB3DB2DB1DB0形式 0 0 1 1 A5 A4 A3 A2 A1 A0 显示起始行是由Z地址计数器控制的。A5A0 6位地址自动送入Z地址计数器,起始行的地址可以是063的任意一行。该指令设置了对应液晶屏最上一行的显示RAM的行号,有规律地改变显示起始行,可以使LCD实现显示滚屏的效果。3.设置页地址(SET PAGE “X ADDRESS”)代码R/W D/IDB7DB6DB5DB4DB3DB2DB1DB0形式 0 0 1 0 1 1 1 A2 A1 A0 所谓页地址就是DDRAM的行地址,8行为一页,模块共64行即8页,A2A0表示07页。读写数据对地址没有影响,页地址由本指令或RST信号改变复位后页地址为0。页地址与DDRAM的对应关系见DDRAM地址表。4.设置Y地址(SET Y ADDRESS) 代码R/W D/IDB7DB6DB5DB4DB3DB2DB1DB0形式 0 0 0 1 A5 A4 A3 A2 A1 A0 此指令的作用是将A5A0送入Y地址计数器,作为DDRAM的Y地址指针。在对DDRA M进行读写操作后,Y地址指针自动加1,指向下一个DDRAM单元。设置了页地址和列地址,就唯一确定了显示RAM中的一个单元,这样MPU就可以用读、写指令读出该单元中的内容或向该单元写进一个字节数据。表3-4 DDRAM地址表 CS1=1CS2=1Y=016263016263行号X=0DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB707DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7855X=7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB7DB0DB756635.读状态(STATUS READ)代码R/W D/IDB7DB6DB5DB4DB3DB2DB1DB0形式 0 1 BUSY 0ON/OFFRET 0 0 0 0当R/W=1 D/I=0时,在E信号为“H”的作用下,状态分别输出到数据总线(DB7DB0)的相应位。该指令用来查询液晶显示模块内部控制器的状态,各参量含义如下:BF:1-内部在工作0-正常状态ON/OFF: 表示DFF触发器的状态,1-显示关闭0-显示打开RST: RST=1表示内部正在初始化,此时组件不接受任何指令和数据。1-复位状态0-正常状态在BF和RST状态时,除读状态指令外,其它指令均不对液晶显示模块产生作用。在对液晶显示模块操作之前要查询BF状态,以确定是否可以对液晶显示模块进行操作。6.写显示数据(WRITE DISPLAY DATE) 代码R/W D/IDB7DB6DB5DB4DB3DB2DB1DB0形式 0 1 D7 D6 D5 D4 D3 D2 D1 D0D7D0为显示数据,此指令把D7D0写入相应的DDRAM单元,Y地址指针自动加1。7.读显示数据(READ DISPLAY DATE) 代码R/W D/IDB7DB6DB5DB4DB3DB2DB1DB0形式 1 1 D7 D6 D5 D4 D3 D2 D1 D0 此指令把DDRAM的内容D7D0读到数据总线DB7DB0,Y地址指针自动加1。读、写数据指令每执行完一次读、写操作,列地址就自动增一。必须注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据。3.5 LCD12864读写操作时序1.写操作时序图3-3 LCD12864写操作时序图2.读操作时序图3-4 LCD12864读操作时序图3.读写时序参数表表3-5 LCD12864读写时序参数表名 称符 号最小值典型值最大值单位E 周期时间Tcyc1000-nsE高电平宽度Pweh450-nsE低电平宽度Pwel450-nsE上升时间Tr-25nsE下降时间Tf-25ns地址建立时间Tas140-ns地址保持时间Tah10-ns数据建立时间Tdsw200-ns数据延迟时间Tddr-320ns写数据保持时间Tdhw10-ns读数据保持时间Tdhw20-ns3.6 LCD12864的应用说明用带中文字库的128X64显示模块时应注意以下几点:1.欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。2.显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。3.当字符编码为2字节时,应先写入高位字节,再写入低位字节。4.模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。5.“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。第四章 系统硬件设计4.1系统结构框图系统主要由AMPIRE128*64图形点阵液晶显示器、单片机、键盘组成。其中P0接字符LED液晶显示器的数据总线DB0DB7,P2.0接RS,P2.1接RW,P2.2接E,P2.3接CS1,P2.4接CS2,结构框图如图4-1如图4-1 贪吃蛇游戏系统结构框图4.2系统原理图基于单片机的贪吃蛇游戏设计由LCD12864图形点阵液晶显示器、AT89C51、按键、4073、二极管和RESPACK-8排阻组成硬件,原理图如图4-2, 图4-2 贪吃蛇游戏系统原理图 其主要运行原理是使用单片机的I/O口驱动LCD,向LCD的数据口写数据或指令,使LCD显示相应的游戏信息和游戏界面。单片机采用查询方式扫描键盘,当有键按下的时候,单片机读取键值,按照按键的功能操作游戏中贪吃蛇的运动方向。蛇的运动和游戏时钟则是采用中断器1中断产生的,当满足一定条件时,通过单片机I/O口送到LCD上进行显示。 4.3主要模块介绍及其功能1.主函数模块主函数是整个程序运行的一个缩影,是一个无限循环的程序。完成的操作包括初始化一系列硬件软件,利用定时中断完成对游戏时钟的控制,调用其他模块完成按键处理,蛇运动与游戏的处理。2.按键模块按键模块分为按键检测模块和按键处理模块两部分。按键检测模块初始化按键对应的管脚,利用查询方式检测具体是哪个按键被按下,将该按键对应的变量值改变。按键处理模块针对不同状态下,对按键做不同的处理,具体划分成六个状态,对应六个函数,分别是游戏进入状态,游戏等待开始状态,游戏中状态,游戏中暂停状态,游戏死亡状态,游戏结束状态。3. LCDl2864显示模块该模块负责显示游戏界面。针对六种状态(游戏进入状态,游戏等待开始状态,游戏中状态,游戏中暂停状态,游戏死亡状态,游戏结束状态),在LCDl2864上时时刷新显示不同的画面。4.蛇运动控制模块该模块负责对蛇的动作与状态的控制,包括游戏开始时对蛇的初始化,蛇移动的处理,对存储地图的数组中的一位做置1,置0或查询操作,蛇吃食物后的处理,根据当前蛇头坐标及蛇头运动方向,更新下一步蛇头的坐标。5.游戏控制模块该模块负责游戏的控制,具体包括在屏幕上随机生成新豆子;吃到豆子以后分数增加,等级增加:对游戏时钟的控制。第五章 系统软件设计系统中的应用软件是根据系统功能要求设计的。软件的功能可分为两大类。一类是执行软件,它能完成各种实质性的功能,如测量、计算、显示、打印、输出控制等;另一类是监控软件,它是专门用来协调各执行模块和操作者的关系,在系统软件中充当组织调度角色。单片机的软件设计通常要考虑以下几个方面的问题:1.根据软件功能的要求,将系统软件划分为若干个相当独立的部分。设计出合理的总体结构,使软件开发清晰、简洁和流程合理。2.各功能程序实行模块化、子程序话。既便于调试、连接,又便于移植和修改。3.在编写应用软件之前,应绘制出程序流程图。4.要合理分配系统资源。5.1游戏设计思想按照需求分析,游戏设计重点要解决游戏界面的显示和蛇身运动处理的问题。游戏采用一个LCD屏幕显示游戏界面。LCD12864分两列显示游戏信息,第一列显示游戏得分;第二列显示游戏运行界面。LCDl2864以4x4大小为一个单位点阵,定义贪吃蛇的每一节蛇身大小为一个单位点阵,豆子的大小和一节蛇身大小相同,也是一个单位点阵。LCDl2864要显示各种游戏状态对应的界面,所以定义数组来存储各种界面对应的位图数据。定义函数实现在LCDl2864的某一坐标位置增加一个单位点阵或删除一个单位点阵的操作,这样通过调用该函数实现增加蛇头,消除蛇尾,实现在游戏界面上蛇运动。蛇在运动的过程中,主要需要处理如下几个问题:1.运动处理。根据用户按键的键值蛇身进行柔体传动。所谓柔体传动,指贪吃蛇运动的时候并不是整条蛇向一个方向运动的,而是在每个时钟到来时,由蛇头带动每个点阵的方向都向下一个点阵传播,然后自己向新的方向运动一步。运动后,下一个点阵由于得到了上一个点阵的方向,就按照此方向同样地运动一步。所以,它会马上填补上一个点阵的位置,如此类推。实际上在设计贪吃蛇的时候,只需要把蛇尾的那个点阵去掉,然后在蛇头的新方向上放一个点阵就可以了。因此定义一个函数用于更新点的坐标,只要知道蛇头或蛇尾的坐标和运动方向,就可以调用该函数更新蛇头或蛇尾的坐标,同时调用相关显示函数,实现蛇运动处理。蛇头的方向可以通过按键捕获实时获得。而蛇尾的方向获得要困难得多。为了减小处理器的负担而使用占用大量数据存储器的方法,可用数组length80。蛇身运动期间需要在该数组中记录下每次蛇身移动一步,蛇头的运动方向。定义两个变量分别代表蛇头和蛇尾,每次存储蛇头运动方向后,代表蛇头的变量加一,以便在下一位置继续存储蛇头运动方向;代表蛇尾的变量则指向数组的开始位置,通过该变量读取数组中蛇尾的运动方向(因为存在该数组中蛇头的运动方向,随着蛇头坐标的移动,存在数组开始位置的运动方向即是蛇尾的运动方向),通过读取的蛇尾运动方向便可以更新蛇尾坐标。2.吃到豆子的处理。蛇头坐标与豆子坐标相等,则吃到豆子。如果吃到豆子,在蛇头位置增加一个单位点阵,并更新豆子的坐标。3.放置新的豆子。通过更新豆子的坐标实现放置新的豆子。放置豆子的过程中,还需要判断新豆子的坐标是否与蛇身,如果重叠,则需要重新放置和判断,直到新的豆子不与蛇身坐标重叠为止。4.死亡处理。蛇运动的过程中,若蛇头碰到墙或自己的身体,则游戏结束。在游戏中,任何时候按下开始暂停键,则游戏暂停,可以进一步选择是否退出游戏。5.2 系统软件设计流程图本设计基于单片机的手机界面的流程图如图5-1图5-1 贪吃蛇游戏软件设计流程图5.3贪吃蛇游戏系统实现主程序#include 12864.h#include zifu.huchar length80=0,8,1,8;bit flag2,flag=0; /0表示行,1表示列flag1是步进标志flag2表示是否蛇头遇到蛇身 1表示没有uchar direction=1; bit flag3,flag1=0;uchar k,dengji=2; /flag3是食物是否重选的标志。k是按键号uchar p=20; /定时次数 void zhongduan() interrupt 0 using 0 k=(P26); k=k&0x03; if(flag) if(k=1) direction=3;/左 if(k=2) direction=1;/右 else if(k=0) direction=4;/上 if(k=3) direction=2;/下 void dingshi() interrupt 1 using 1 /定时程序.产生步进时间 if(p-) TL0=0; TH0=0xa0; flag1=0; else flag1=1; TL0=0; TH0=0x00; p=20-(dengji1); main() uchar food2=12,8; uchar i,x,y; choose12864(2); init12864(); clear12864(); for(i=0;i3;i+) play16(0,(2+(i1),0,(xuexiao+(i5); delay1ms(300); for(i=0;i3;i+) play16(1,(i1),0,xuexiao+(i+3)5); delay1ms(300); for(i=0;i96;i+) dot(16+i,15); delay1ms(2); /显示直线 play16(0,4,1,sjz); play16(0,6,1,sjz+32); play16(1,0,1,sjz+64); delay1ms(450); delay1ms(450); play16(0,4,2,ming); delay1ms(350); play16(0,6,2,ming+32); delay1ms(350); play16(1,0,2,ming+64); delay1ms(350); play16(1,2,2,ming+96); delay1ms(350); delay1ms(350); choose12864(2); clear12864(); vertical(1,61,30); vertical(1,61,127); for(i=0;i98;i+) dot(30+i,1); dot(30+i,62); play16(0,0,0,tan); play16(0,0,1,chi); play16(0,0,2,she); change(length,(length+1); change(length+2),(length+3); change(food,food+1); TMOD=1; /定时器工作方式 IT0=1; /边延有效 EA=1; /开CPU中断 ET0=1; /开定时器中断 EX0=1; /开外部中断 TL0=0x00; TH0=0x00; /定时器初值 TR0=1; /启动定时器 do while(!flag1); x=*(length); y=*(length+1); switch(direction) /东 case 1: for(i=0;idengji-1;i+) *(length+(i1)=*(length+(i1)+2); *(length+(i1)+1)=*(length+(i1)+3); (*(length+(dengji1)-2)+; flag=0; break; case 2: /南 for(i=0;idengji-1;i+) *(length+(i1)=*(length+(i1)+2); *(length+(i1)+1)=*(length+(i1)+3); (*(length+(dengji1)-1)+; flag=1; break; case 3:/西 for(i=0;idengji-1;i+) *(length+(i1)=*(length+(i1)+2); *(length+(i1)+1)=*(length+(i1)+3); (*(length+(dengji1)-2)-; flag=0; break; case 4: /北 for(i=0;idengji-1;i+) *(length+(i1)=*(length+(i1)+2); *(length+(i1)+1)=*(length+(i1)+3); (*(length+(dengji1)-1)-; flag=1; break; if(*(length+(dengji1)-2)=food0)&(*(length+(dengji0;i-) *(length+(i1)=*(length+(i1)-2);
展开阅读全文