基于51单片机的贪食蛇游戏机开发-精品 - 图文

发布时间 : 星期三 文章基于51单片机的贪食蛇游戏机开发-精品 - 图文更新完毕开始阅读

得分累计、图像显示等。外部中断服务程序的功能是识别按键。定时中断服务程序的作用是定时产生步进信号。外部中断服务程序与主程序之间联系的纽带是全局变量MovDirection,键盘中断服务程序每次执行都要把按键对应的方向更新到此变量,而主程序每次步进方向都以此变量为依据。定时中断服务程序通过全局变量IsToStep与主程序联系起来,主程序只有在IsToStep为1时才让蛇体步进,且步进后将该变量置0,定时中断服务程序每隔一段时间为IsToStep置位,使主程序得到步进信号。

开始LCD初始化启动定时器及外部中断IsToStep=1?N进入P = P-1P= 0 ?NYMovDirection方向蛇步进进入读P2口取键盘识别码判断按键根据按键值更新MovDirection返回(a)外部中断服务程序更新得分IsToStep = 0N碰到食物?Y蛇体调整产生新的食物首身相碰?Y退出游戏(b)主程序图ChpNum-3 程序流程

NIsToStep =1参考蛇长P重新赋值重载计数初值返回(c)定时中断服务程序Y

主程序首先进行LCD和定时器的初始化,绘制好游戏界面后打开外部中断并启动定时器,进入主循环。主循环等待蛇体步进信号IsToStep(由定时中断服务程序设置),得到步进信号后根据当前方向MovDirection控制蛇体向前步进。步进后判断当前蛇头是否碰到食物,若碰到,将食物与蛇体合并,并产生新的食物再进入首身相碰判断;若未碰到食物,直接进入首身相碰判断。若首身未相碰则将IsToStep清零、更新得分后回到主循环;否则退出游戏。

定时器中断服务程序作用是定时产生步进信号,因硬件定时最大值不够蛇体步进最

5

小间隔时间,我们用多次硬件定时来产生一个步进信号。设计全局变量p,每硬件中断触发一次p减1。当p减到0时置IsToStep为1并对p重新赋值。值得注意的是,p的重新赋值应参考蛇体长度,若蛇体长度越长p值应越小,即步进间隔越短,蛇体移动速度越快,游戏难度越大。具体做法见参考代码。

外部中断服务程序用于按键识别并更新前进方向全局变量MovDirection。首先取出键盘检测位的值再确定贪食蛇要改变的方向。当贪食蛇正向上或向下移动时,按下上下方向键,键值都不进行处理;而贪食蛇正向左或向右移动时,按下左右方向键,键值都不进行处理。 4.2 软件模块设计 4.2.1 LCD初始化

在对LCD进行初始化时,先要检查读忙碌标志位,当BF为1表示内部操作正在进行,

0表示允许指令操作。具体指令说明如下: (1) 显示开/关设置

引脚 R/W RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 电平 L

L

L

L

H

H

H

H

H H/L

功能:设置屏幕显示开/关。DB0=H,开显示;DB0=L,关显示。不影响显示RAM(DD RAM)中的内容。

(2) 设置显示起始行

引脚 R/W RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 电平 L

L

H

H

行地址(0~63)

功能:执行该命令后,所设置的行将显示在屏幕的第一行。显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。 (3) 设置页地址

引脚 R/W RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 电平 L

L

H

L

H

H

H 页地址(0~7)

功能:执行本指令后,下面的读写操作将在指定页内,直到重新设置。页地址就是DD RAM 的行地址,页地址存储在X地址计数器中,A2-A0可表示8页,读写数据对页地址没有影响,除本指令可改变页地址外,复位信号(RST)可把页地址计数器内容清零。

6

(4) 设置列地址

引脚 R/W RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 电平 L

L

L

H

列地址(0~63)

功能: DD RAM 的列地址存储在Y地址计数器中,读写数据对列地址有影响,在对DD RAM进行读写操作后,Y地址自动加1。 (5) 状态检测

引脚 R/W RS DB7 DB6 电平 H

L BF

DB5

DB4 DB3 DB2 DB1 DB0

L

L

L

L ON/OFF RST L

功能:读忙信号标志位(BF)、复位标志位(RST)以及显示状态位(ON/OFF)。 BF=H:内部正在执行操作;BF=L:空闲状态。RST=H:正处于复位初始化状态;RST=L:正常状态。ON/OFF=H:表示显示关闭;ON/OFF=L:表示显示开。 (6) 写显示数据

引脚 R/W RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 电平 L

H D7 D6 D5 D4 D3 D2 D1 D0

功能:写数据到DD RAM,DD RAM是存储图形显示数据的,写指令执行后Y地址计数器自动加1。D7-D0位数据为1表示显示,数据为0表示不显示。写数据到DD RAM前,要先执行“设置页地址”及“设置列地址”命令。 (7) 读显示数据

引脚 R/W RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 电平 H

H D7 D6 D5 D4 D3 D2 D1 D0

功能:从DD RAM读数据,读指令执行后Y地址计数器自动加1。从DD RAM读数据前要先执行“设置页地址” 及“设置列地址”命令.

LCD初始化时,根据指令格式,先进行读忙碌检查。当BF为低电平时,设置显示起始行为第一行,A0~A5位为0,然后设置屏幕显示为开,具体做法见参考代码。 4.2.2 键盘扫描程序

键盘扫描通过外部中断来检测,四个方向键经与门与P3.2(中断输入)引脚相连。程序初始化时将IT0置0,表示外部中断使用电平触发方式,低电平可引起中断。任何键的按下均会使P3.2电平为低,进入中断服务程序。中断服务程序先将P2口数据取出,右移6位将键盘接入引脚(P2.7、P2.6)的值取出,得到键盘识别码。键盘识别码有四个:1(左键)、2(右键)、0(上键)、3(下键)。得到按键识别码后根据识别码及当前方向

7

更新前进方向。

4.2.3 显示16*16点阵汉字

液晶显示器的数据线是8位的,显示数据是逐字节输入的。每字节输入数据对应到一列的8个像素点(8行)。自然地,64行像素点分成8页,每8行为一页。向液晶显示器写入显示数据时均要先设置写入的页号和列号(而不是具体某一个像素点的坐标),然后写入一个字节的数据。如表ChpNum-2所示,液晶显示模块中的DDRAM是存储图形显示数据的,LCD显示的数据与DDRAM中的数据一一对应(一位DDRAM对应一个像素,数据为1表显示该点,为0不显示)。汉字在液晶中占用16*16像素点,即两页16列。把汉字的点阵数据写到液晶的DDRAM中时。先载入第一页的16列(字节),再载第2页的16列。详细过程见参考代码。

表ChpNum-2 DDRAM地址映像

Y 地址

0 1 2 ????????? 61 62 63 X地址 DB0 X=0 ∫ PAGE0 DB7

DB0 X=1 ∫ PAGE1 DB7 ∷ ∷ ∷ ∷ DB0 X=7 ∫ PAGE6 DB7 DB0 ∫ PAGE7 DB7

4.2.4 食物的随机出现

食物的出现是一种随机行为,所以必须做一个随机数,而且食物出现的位置不能与蛇

的位置相同,也不能超出墙外,否则就要重置食物。这里使用程序中的定时计数器的低八位TL0的数值,由于TL0不断变化,不同的时间点数值不同,TL0$及TL0分别为食物的列地址和行地址。

8

联系合同范文客服:xxxxx#qq.com(#替换为@)