ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:67.50KB ,
资源ID:3251982      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-3251982.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(贪吃蛇游戏设计报告.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

贪吃蛇游戏设计报告.docx

1、贪吃蛇游戏设计报告贪吃蛇游戏设计班级:13级7班 学号: 姓名: 一、实验目的1熟练掌握 C6713 的中断结构和对中断的处理过程。 2熟练掌握 C6713 定时器的控制和使用方法。 3熟练掌握键盘的使用原理及编程方法。4熟练掌握使用C6713DSP的扩展空间控制外围设备信息的方法;掌握蜂鸣器发声原理和音乐发生方法;掌握液晶显示器的显示控制原理及编程方法。5掌握C6713的系统自启动设计方法。6熟练掌握C语言开发DSP程序的流程及调试方法。二、实验设备计算机,ICETEK-C6713-EDU 实验箱,示波器。3、实验内容(*号为选做内容)1、在液晶屏上显示游戏背景、初始蛇身及运动、随机产生食物

2、。2、可以用键盘控制蛇身运动、暂停游戏。3、游戏烧写到FLASH内,可以上电自启动运行。四、设计原理贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个按键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体叉蛇头撞倒自己身体游戏结束。要想实现贪吃蛇功能,需要应用到键盘,按键中断,和液晶显示。想要正常使用按键,就要调用包含于有文件ICETEK-C6713-A.h中的 init_emif();和 InitCTR();程序用来初始化emif和ICETEK-CTR。中断原理:dsp有三种类型的

3、中断cpu的TMS320C6000:重置、可屏蔽的、不可屏敝的复位中断优先级最高,对应于复位信号。不可屏蔽中断优先级最高,对应于第二敝中断信号。最低优先级中断中断415对应INT4INT15信号。重置,敝中断,一些INT4INT15信号映射到C6000设备上的别针。一些INT4INT15中断信号是内部使用的外设和一些可能不可用或在软件的控制下可以使用。外中断区别于计时器等片内设备中断,它来源于 DSP 片外,属于硬件中断。外中断信号通过DSP 器件封装上的专用管脚输入DSP,属于可屏蔽中断。TMS3206713DSP 有三个外中断:EXT_INT4EXT_INT7,如果CPU 允许,这四个信号

4、线上的低脉冲信号会中断CPU。中断是为使 CPU 具有对外界异步事件的处理能力而设置的。通常DSP 工作在包含多个外界异步事件环境中,当这些事件发生时,DSP 应及时执行这些事件所要求的任务。中断就是要求CPU 暂停当前的工作,转而去处理这些事件,处理完成后,再回到原来被中断的地方继续原来的工作。显然,服务一个中断包括保存当前处理现场,完成中断服务,恢复各寄存器和现场,然后返回继续执行被暂时中断的程序。请求CPU 中断的请求源称为中断源。这些中断源可以是片内的,如定时器等,也可以是片外的,如A/D 转换及其他片外装置。片外中断请求连接到芯片的中断管脚,并且在这些管脚处的电平上升沿产生。如果这个

5、中断被使能,则CPU开始处理这个中断,将当前程序流程转向中断服务程序。当几个中断源同时向CPU 请求中断时,CPU 会根据中断源的优先级别,优先响应级别最高的中断请求。TMS320C6000 有11 个寄存器管理中断服务:*控制状态寄存器CSR 控制全局使能或禁止中断*中断使能寄存器IER 使能或禁止中断处理*中断标志寄存器IFR 指示有中断请求但未被响应的中断发生*中断设置寄存器ISR 手动设置IFR 中的标志位*中断清除寄存器ICR 手动清除IFR 中的标志位*中断服务表指针ISTP 指向中断服务表的起始地址*不可屏蔽中断返回指针NRP 包含从不可屏蔽中断返回的地址,该中断返回通过B NR

6、P指令完成*可屏蔽中断返回地址IRP 可屏蔽中断的返回地址*中断选择寄存器IML 可选择CPU 中断10-15 号对应的中断源*中断选择寄存器IMH 可选择CPU 中断4-9 号对应的中断源*外中断极性选择寄存器EIP 选择外中断(INT4-INT7)的触发极性外设事件要引起 CPU 中断,必须保证:CSR 使能中断,IER 相应位被使能(置1),ST1 寄存器中的INTM 使能(置0),中断服务表相应位置放置服务程序入口地址转移指令,相应中断源放入IML 或IMH 适当位置。当 CPU 响应中断时,PC 指针指向中断向量表中对应中断的地址,进入中断服务子程序。中断向量表是DSP 存放中断服务

7、程序的一段内存区域,大小为80H。在中断向量表中,每一个中断占用32 个字的空间,一般情况是将一条跳转或延时跳转指令存放于此。中断向量表的位置是可以改变的,修改ISTP 寄存器中的中断向量表基地址可以实现这一点。程序中应包含中断向量表。向量表中每项为32 个字,存放跳转指令,跳转指令中的地址为相应服务程序入口地址。第一个向量表的首项为复位向量,即CPU 复位操作完成后自动进入执行的程序入口。程序中包含相应的中断服务程序,应将其入口地址加入相应中断向量表中。在程序中重定位中断向量表到本程序的中断向量表地址;设置中断源(IML,IMH)、中断屏蔽寄存器IER_ 定时器原理:设备有32位通用定时器,

8、可用于:时间事件、计数事件、产生脉冲、中断cpu、dma发送同步事件 计时器有两个信号模式,由一个内部时钟或externl来源。计时器有输入插口和输出插口。输入和输出。(tinpand兜售)可以作为定时器时钟时钟输入和输出。也可以分别配置为通用的输入和输出。监视定时器状态:设置TOUT 管脚功能:01940004 01980004 定时器周期寄存器PRD 设置定时器的计数周期决定TSTAT 信号的频率01940008 01980008 定时器计数寄存器CNT 定时器当前计数值键盘使用:ICETEK-C6713-EDU 实验箱对TMS320C6713 DSP 存储空间的使用地址范围:0901f0

9、000h0901fffffh 数据宽度:16 位0901f0000h: ICETEK-CTR 全局控制寄存器写地址0901f0002h: 读取键盘扫描码地址,液晶命令写地址0901f0004h: 清除键盘缓冲区读地址,液晶控制写地址0901f0006h: 液晶左侧显示数据写地址0901f0008h: 液晶右侧显示数据写地址0901f000Ah: 发光二极管阵列数据写地址0901f000Eh: 发光二极管阵列使能、交通灯状态、PWM 状态写地址、直流电机使能位其它地址: 保留液晶显示器的显示控制原理:ICETEK-C6713-A 是一块以TMS320C6713DSP 为核心的DSP 扩展评估板,

10、它通过扩展接口与实验箱的显示/控制模块连接,可以控制其各种外围设备。液晶显示模块的访问、控制是由 C6713DSP 对CE1 空间的特定地址的操作完成。LCD控制寻址:命令发送的地址为0901f0002H,数据发送的地址为0901f0006H 和0901f0008H,辅助控制的地址为0901f0004H。显示控制方法:-液晶显示模块中有两片显示缓冲存储器,分别对应屏幕显示的象素,向其中写入数值将改变显示,写入“1”则显示一点,写入“0”则不显示。在系统硬件上电复位后,软件根据用户的需要自动对各项控制器指令代码及其参数进行设置,从而完成对液晶模块的参数 如液晶的行数、列数、扫描频率、光标的位置等

11、。以及显示方式等一系列的初始化过程。在对系统进行正确的初始化以后,可以通过将外部中的数据直接送至显示缓冲区,控制器就可以控制液晶屏显示出用户所要的图画。同时用户也可以根据自己的需要在主程序运行的过程中改变图片显示的形式。试验箱上与之相连对应的端口有端口8001.8002控制液晶显示开关以及行列显示,而端口8003和8004是控制显示左屏和右屏。具体情况如下:port8001=0x3f; port8002=0;打开显示屏 port8001=0x3e; port8002=0;关闭显示屏port8001=0x0c0; port8002=0;从存储器第0行开始显示,依次增大行数也增大到8为止。port

12、8001=0x40; port8002=0;控制0列port8001=0x0b8; port8002=0;控制0页port8003=0x80; port8002=0;控制左屏显示port8003=0x01; port8002=0;控制右屏显示发送控制命令:向液晶显示模块发送控制命令的方法是通过向命令控制地址写入命令控制字,然后再向辅助控制地址写入0。由于液晶模块相对于DSP 来讲是慢速设备,在命令之间可能需要增加延时语句,或将CE1 空间的EMIF 访问控制寄存器设置的访问延时加大。写显示数据:在使用命令控制字选择操作位置(页数、列数)之后,可以将待显示的数据写入液晶显示模块的缓存。将数据发送

13、到相应数据控制地址即可。由于液晶模块相对于DSP 来讲是慢速设备,在命令之间可能需要增加延时语句,或将CE1 空间的EMIF 访问控制寄存器设置的访问延时加大。液晶显示程序:void draw(int index) int page; /定义页 int row; /定义列 page=index%8; /页对8取模 row=index/8; /列对8取整 LCDCMD(7-page+0x0b8); / 设置操作页 if (row64) LCDCMD(row+LCDCMDVERADDRESS); / 起始列 LCDWriteLeft(Ground.LCDarrayindex); else LCDC

14、MD(row-64+LCDCMDVERADDRESS); / 起始列 LCDWriteRight(Ground.LCDarrayindex); 五、程序设计本次设计是基于DSP芯片的贪吃蛇设计。而显示则使用液晶显示器,设计关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位

15、置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。当在一个关卡中蛇头撞到墙壁或者自己的身体,则刷屏,表示游戏结束。其程序流程图如下: 在设计中,我们定义了一个共同体,把蛇身数据以及屏幕显示的数据放在一个类里面,这样既节省了空间,也方便我们在程序中的数据调用。相关函数定义函数定义是对各个基础函数的定义,并且设置需要运用的信息,便于调用void food();/产生食物的函数void Init();/void move();/贪吃蛇的运动void draw(int index);/显示void InitInterrupt(v

16、oid);/中断函数函数main( )程序流程图 主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,然后初始化图形系统. 主函数模块主要是定义各个端口,调用各个程序,像清除屏幕显示内容.延时子程序.打开显示。以及全局初始化。同时还有控制显示的方式位。Main程序main() init_emif(); / 初始化emif InitCTR(); / 初始化ICETEK-CTR TurnOnLCD(); / 打开显示 LCDCLS(); / 清除显示内存 Init(); InitInterrupt(); while(1) switch (GameStatus) case win:

17、Init(); break; case fail: Init(); break; case running: move(); draw(BITSLOT(SnakeBodySnakeHead); draw(BITSLOT(SnakeTailIndex); Delay(500); 六、总结1) 函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序 十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增加了程序的可读性。2) 分析函数先从main()函数入手。Main()函数是C源程序编译时的开始, 从main()函数开始读函数可将其他函数的功能理解得更透彻。3) 在做程序的

18、时候先列框架,将这个程序所要达到的目的(功能)分析出 来,选择正确的数据结构然后在将程序模块化,按照模块编写函数更加简单合理。 5)c语言是相对最简单的设计语言,用c语言表达我们的想法,这对我们将来的学习有了更多的要求。 贪吃蛇源程序:#include ICETEK-C6713-A.h #include /* for CHAR_BIT */ #define BITMASK(b) (128(b) % CHAR_BIT) #define BITSLOT(b) (b) / CHAR_BIT) #define BITSET(a, b) (a)BITSLOT(b) |= BITMASK(b) #defi

19、ne BITCLEAR(a, b) (a)BITSLOT(b) &= BITMASK(b) #define BITTEST(a, b) (a)BITSLOT(b) & BITMASK(b) #define BITNSLOTS(nb) (nb + CHAR_BIT - 1) / CHAR_BIT)#define win 2#define fail 1#define running 0#define up 1#define down 2#define left 3#define right 4void food();void Init();void move();void draw(int ind

20、ex);void InitInterrupt(void);int SnakeFoodPosition,SnakeLong;int SnakeBody20,SnakeHead,SnakeTail,GameStatus,SnakeDirection,SnakeTailIndex;union char bitarrayBITNSLOTS(64*128 ); unsigned char LCDarray64*128/8; Ground; int SnakeFoodPosition,SnakeLong;main() init_emif(); / 初始化emif InitCTR(); / 初始化ICETE

21、K-CTR TurnOnLCD(); / 打开显示 LCDCLS(); / 清除显示内存 Init(); InitInterrupt(); while(1) switch (GameStatus) case win: Init(); break; case fail: Init(); break; case running: move(); draw(BITSLOT(SnakeBodySnakeHead); draw(BITSLOT(SnakeTailIndex); Delay(500); void Init() int i; for (i=0;i64*128/8;i+) Ground.bit

22、arrayi=0; /memset(Ground.LCDarray, 0, 4*16); for(i=0;i64;i+) BITSET(Ground.bitarray,i);/画上边界 BITSET(Ground.bitarray,127*64+i);/画下边界 for(i=1;i127;i+) BITSET(Ground.bitarray,i*64);/画左边界 BITSET(Ground.bitarray,i*63+63);/画右边界 BITSET(Ground.bitarray,330); BITSET(Ground.bitarray,331); BITSET(Ground.bitarr

23、ay,332); SnakeBody0=330; SnakeBody1=331; SnakeBody2=332; SnakeHead=2; SnakeTail=0; SnakeLong=3; food(); SnakeDirection=up; GameStatus=running; for (i=0;i64*128/8;i+) draw(i); void food() srand(unsigned) time(0); SnakeFoodPosition=rand()%(64*128-1); while (BITTEST(Ground.bitarray, SnakeFoodPosition)

24、SnakeFoodPosition+=SnakeLong; SnakeFoodPosition=SnakeFoodPosition%(64*128-1); BITSET(Ground.bitarray,SnakeFoodPosition); draw(BITSLOT(SnakeFoodPosition);void move() int i; i=SnakeBodySnakeHead; /暂存蛇头上一位置 SnakeHead+; SnakeHead=SnakeHead%20; switch (SnakeDirection) case up: SnakeBodySnakeHead=i+1; bre

25、ak; case down: SnakeBodySnakeHead=i-1; break; case left: SnakeBodySnakeHead=i-64; break; case right: SnakeBodySnakeHead=i+64; break; if (!BITTEST(Ground.bitarray,SnakeBodySnakeHead) BITSET(Ground.bitarray,SnakeBodySnakeHead); BITCLEAR(Ground.bitarray,SnakeBodySnakeTail); SnakeTailIndex=SnakeBodySnak

26、eTail; SnakeTail+; SnakeTail=SnakeTail%20; else if (SnakeBodySnakeHead=SnakeFoodPosition) BITSET(Ground.bitarray,SnakeBodySnakeHead); SnakeLong+; food(); if (SnakeLong=20) GameStatus=win; else GameStatus=fail; void draw(int index) int page; int row; page=index%8; row=index/8; LCDCMD(7-page+0x0b8); /

27、 设置操作页 if (row64) LCDCMD(row+LCDCMDVERADDRESS); / 起始列 LCDWriteLeft(Ground.LCDarrayindex); else LCDCMD(row-64+LCDCMDVERADDRESS); / 起始列 LCDWriteRight(Ground.LCDarrayindex); void InitInterrupt(void) / 设置中断控制寄存器 CSR&=0xfffffffe; / 关中断 GIE=0 ISTP=0x00000c00; / 重置中断向量表到0C00h IMH=0x0; / 指定xint5中断 IML=0x0a0

28、; ICR=0xff; / 清除等待的中断 IER=0x23; / 使能xint5中断 CSR=CSR|1; / 开中断void interrupt XINT5() /中断响应函数 int key; key=Getkey(); switch(key) case SCANCODE_2: SnakeDirection=down; break; case SCANCODE_8: SnakeDirection=up; break; case SCANCODE_4: SnakeDirection=left; break; case SCANCODE_6: SnakeDirection=right; break;

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2