毕业设计(论文)_基于单片机的微型游戏机__贪吃的蛇_第1页
毕业设计(论文)_基于单片机的微型游戏机__贪吃的蛇_第2页
毕业设计(论文)_基于单片机的微型游戏机__贪吃的蛇_第3页
毕业设计(论文)_基于单片机的微型游戏机__贪吃的蛇_第4页
毕业设计(论文)_基于单片机的微型游戏机__贪吃的蛇_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、基于单片机的微型游戏机贪吃的蛇摘 要 单片微型机简称单片机,它是在一片芯片上集成了中央处理部件,存储器、定时器/计数器和各种输入输出设备等接口部件。单片机是微机发展的一个重要的分支,自问世以来,性能不断地改善和提高,加之单片机具有集成度高、功能强、速度快、体积小、功耗小、使用方便、性能可靠、价格便宜等优点,故在工业控制、数据采集和处理、通信系统、家用电器等领域的应用日益广泛。国内虽然起步较晚,但单片机的潜力越来越被人们所重视,尤其在工业控制、自动化仪器仪表、计算机系统接口、智能化外设等应用领域发展很快。它的应用对于产品升级换代、机电一体化都具有重要的意义,在工业生产中,电流、电压、温度、压力、

2、流量、流速和开关量都是常用的主要被控参数,被用于各种不同产品的生产。在通信行业更为广泛利用, 从只能基本通话,到现在一台 拥有各种不同的功能,单片机得到了广泛的应用。 可以听音乐,听收音机,玩游戏,照相片等等,比较流行的 游戏贪吃蛇就能用单片机实现。关键词:51单片机 贪吃蛇 游戏Based on single chip micro-game - greedy snakeABSTRACTSingle-chip microprocessor referred to as microcontrollers, which is integrated on a chip, a central proc

3、essing unit, memory, timer / counters and a variety of input and output devices such as Interface Unit. SCM is a microprocessor development, an important branch, since its inception, performance, continuous improvement and increase, coupled with microcontroller with an integrated high, strong functi

4、on, high speed, small size, power consumption, easy to use, reliable, cheap, etc. advantages, so in the industrial control, data acquisition and processing, communication systems, home appliances and other fields increasingly wide range of applications. Although the domestic late start, but the pote

5、ntial of SCM has been growing attention, especially in industrial control, automation instruments and meters, computer system interface, intelligent peripherals and other applications developed rapidly. Its application for the upgrading of products, mechanical and electrical integration, have import

6、ant significance in industrial production, current, voltage, temperature, pressure, flow, flow rate and switching capacity are commonly used parameters of the main accused, was used for a variety production of different products. More extensive use of the communications industry, cell phone calls fr

7、om can only be basic to the present, mobile phones have a variety of functions, single-chip has been widely used. Phone can listen to music, listening to the radio, play games, according to photos, etc., the more popular cell phone game Snake will be able to use SCM.Keyword:51singlechip snake game目

8、录 TOC o 1-3 h z u HYPERLINK l _Toc261456042 1 第一章 绪论 PAGEREF _Toc261456042 h 1 HYPERLINK l _Toc261456043 概述 PAGEREF _Toc261456043 h 1 HYPERLINK l _Toc261456044 选题背景 PAGEREF _Toc261456044 h 1 HYPERLINK l _Toc261456045 课题分析 PAGEREF _Toc261456045 h 1 HYPERLINK l _Toc261456046 思路设计 PAGEREF _Toc261456046

9、 h 1 HYPERLINK l _Toc261456047 2第二章 系统的基本组成和工作原理 PAGEREF _Toc261456047 h 2 HYPERLINK l _Toc261456048 系统的基本组成 PAGEREF _Toc261456048 h 2 HYPERLINK l _Toc261456049 系统的工作原理 PAGEREF _Toc261456049 h 2 HYPERLINK l _Toc261456050 3第三章 显示电路的选取和设计 PAGEREF _Toc261456050 h 2 HYPERLINK l _Toc261456051 游戏显示的器件选择 P

10、AGEREF _Toc261456051 h 2 HYPERLINK l _Toc261456052 显示功能的硬件电路 PAGEREF _Toc261456052 h 3 HYPERLINK l _Toc261456053 4第四章 键盘扫描的电路设计 PAGEREF _Toc261456053 h 4 HYPERLINK l _Toc261456054 键盘扫描思路设计 PAGEREF _Toc261456054 h 4 HYPERLINK l _Toc261456055 键盘硬件电路设计 PAGEREF _Toc261456055 h 4 HYPERLINK l _Toc26145605

11、6 5第五章 系统程序设计 PAGEREF _Toc261456056 h 5 HYPERLINK l _Toc261456057 编译软件 PAGEREF _Toc261456057 h 5 HYPERLINK l _Toc261456058 软件设计工具 PAGEREF _Toc261456058 h 5 HYPERLINK l _Toc261456059 C51 优化的 C 语言交叉编译器 PAGEREF _Toc261456059 h 10 HYPERLINK l _Toc261456060 系统设计流程图 PAGEREF _Toc261456060 h 11 HYPERLINK l

12、_Toc261456061 参考文献 PAGEREF _Toc261456061 h 15 HYPERLINK l _Toc261456062 附 录 PAGEREF _Toc261456062 h 16 HYPERLINK l _Toc261456063 谢辞 PAGEREF _Toc261456063 h 431 第一章 绪论概述本设计采用80C51核心的单片机最小系统,80C51是MCS51系列单片机钟CHMOS工艺的一个典型品种。另外,其他厂商以8051为基核开发出CHMOS工艺单片机产品统称为80C51系列。贪吃蛇游戏采用ATS892的80C51系列的芯片,AT89S52具有8KB空

13、间ROM,256B的RAW,4个并行接口,1个串行接口,3个定时计数器,6个中断源。拥有大量的程序存储空间,大大减轻了对程序的编写和算法的要求。丰富的硬件资源可使外围电路变得更简单。选题背景贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。我希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力。因此我选定了这个题目。课题分析 贪吃蛇游戏设计主要硬件由单片机最小系统,TFT彩屏

14、,4X4矩阵键盘,整个的游戏设计外围电路比较少,主要核心在于游戏的程序设计,本设计的游戏规则也参照现在 流行的贪吃蛇游戏的规则去设计,当蛇吃到食物时,蛇身就会自动增加一格,食物随机出现在屏幕上,当蛇碰到墙壁时,游戏结束。本设计需要考虑的问题有以下几个:显示彩屏的选择保证游戏的流畅性和及时响应性游戏的设计应该接近人性化电路连接距离应尽量短,避免信号线受外界干扰思路设计 游戏的运行由矩阵键盘去控制,显示由TFT彩色屏幕完成。本设计的键盘扫描电路不同于以往一般的矩阵键盘,而由中断扫描代替,当有按键按下时,才执行扫描键盘,这样就可以节省很多CPU资源,同时也可以及时的反应出按键操作。 第二章 系统的基

15、本组成和工作原理系统的基本组成 贪吃蛇游戏设计由三部分组成,屏幕显示,最小系统及矩阵键盘。最小系统采用Atmel公司的51核的AT89S52芯片,AT89S52芯片具有8K的程序存储器,256B的数据存储器,已经为程序的设计带来了很大的方便,解决了因程序容量庞大而导致硬件选择困难的问题。同时也节约了设计成本,一块AT89S52只需要5块钱就足够了,对于一般人来讲是可以承受得了的。加上屏幕的应用比较简单,有相应的配套应用命令子程序,减低了设计者重新编写屏幕应用子程序的麻烦,同时设计者可根据自身设计需要,增添或修改程序,使得程序更完善。系统的工作原理 系统的程序设计分为一个主函数,3个子函数,子函

16、数分别是键盘扫描函数,贪吃蛇运行子程序和TFT屏幕自带的子程序。在主程序里只对LCD的初始化,中断设备的初始化,然后死循环执行贪吃蛇运行程序。 第三章 显示电路的选取和设计游戏显示的器件选择 游戏设计的显示屏可以有很多种的选择,选择不同的屏幕,程序的编写也随之不同。屏幕可以选择LCD128X64,8X8点阵LED,TFT彩色屏幕等等。 LCD128X64是比较通用,大众化,容易使用的液晶屏,若采用LCD128X64液晶屏,则要用到8位的I/O口作数据传送,6位I/O口作选通位,一共要用到14个I/O口,占用单片机最小系统的资源比较多,另外,LCD128X64每一个显示格由8x8像素组成,若使用

17、每一个显示单元格作为贪吃蛇的蛇身显示,显然有点大,不美观,若利用LCD128X64里可编辑每个单元格的显示图案的功能,将会使得编写程序变得很麻烦,而且CPU要执行的程序显然增加了很多。 8X8点阵LED比LCD128X64结构更简单,不需要任何的指令集,即对I/O口直接输出可以使用。若选用8X8点阵LED显示屏,首先16位的I/O口已经被占用,8X8的点阵能使用的范围很少,对增强游戏的功能方面加以限制。 TFT彩色屏幕具有很强的显示功能,能显示262k颜色,屏幕由具有丰富的功能子程序,为使用者节省了不少时间,而且占用I/O口少,只用到5个I/O口。本设计将采用SSD1283A型号的彩屏。 SS

18、D1283A的TFT驱动器是一种智能都在同一个驱动器,集成了电源电路,门驱动器,内存为单芯片驱动器和源。它可以驱动132号决议的RGB 132的一个小组26万色为a - TFT。 它也集成了控制器的功能和组成132高达39204个字节(132 132 18 / 8)图形显示数据RAM(GDDRAM),6800接口,这样它与普通单片机通过8/9/16/18-bits系列/ 8080系列兼容的并行接口或串行接口和存储数据的GDDRAM研究。辅助18位视频接口(垂直同步,HSYNC,DOTCLK,启用和RR0 - RR5,GG0 - GG5,BB0 - BB5)是SSD1283A纳入图像显示动画。

19、只有外部电容器9只,它嵌入的DC - DC转换器,振荡器和电压发生器提供一切必要的组件所需的电压由外部的驱动程序最低限度。通用的电压产生电路包含驱动液晶显示器对电极。伽玛控制电路的集成,也包括可通过软件命令调整,以提供最大的灵活性和最佳的显示质量。显示功能的硬件电路图3-1 游戏显示硬件电路图 如图所示,显示电路占用了P00-P04口,仅占用了5个接口。P0口的每一位口线可以驱动8个LSTTL负载。在作为通用I/O口时,由于输出驱动电路是开漏方式,有集电极的开路(OC门)电路或漏极电路驱动是需外接上拉电阻,本设计采用4.7K的排电阻做上拉电阻,足以使P0口驱动TFT液晶显示屏。 第四章 键盘扫

20、描的电路设计键盘扫描思路设计 键盘是人机对话的一个重要的桥梁,通过按键控制单片机的操作。键盘的设计有两种方式,一种是独立键盘,就是独立每一个I/O口单独连接一个按钮,这样的设计是最简单的,可是具有很大的局限性,因为单片机的I/O口本身就很有限,而且8个按键需要8个I/O口,浪费了单片机的资源。第二种方式是矩阵键盘,矩阵键盘采用行列式结构按键设置在行列的交点上。当口线数量为8时,可以将4根口线定义为行线,另4根口线的定义为列线,形成4X4键盘,可以配置16个按键。同样利用8根口线,矩阵键盘可以配置16个键,而独立键盘只能配置8个按键,从此看出,矩阵键盘比独立键盘拥有更丰富的性能。键盘硬件电路设计

21、图1-2矩阵键盘电路图 如图所示,矩阵键盘的行线连接P1口的前四位,列线连接P1口的后四位。矩阵键盘上某一键闭合时,该键所对应的行线和列线短接。此时该行线电平将由被短接的列线电平所决定。 第五章 系统程序设计编译软件 关于程序的编写,在C51单片机中,可以用汇编语言编写程序,也可以用C语言编写。汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言,其主要优点是占用资源少、程序执行效率高,但是不同的CPU,其汇编语言可能有所差异,所以不易移植。C语言是一种结构化的高级语言,其优点是可读性好,移植容易,是普遍使用的一种计算机语言,缺点是占用资源较多,执行效率没有汇编高。对于

22、目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。 综合本设计的情况,由于编写程序容量并不是很大,而且对于初学者更好理解程序的设计,故采用keilC 编译器来完成程序的编写。软件设计工具uVision2 集成开发环境 uVision2 IDE是一个基于Window的开发平台包含一个高效的编辑器一个项目管理器和一个MAKE工具。uVision2 支持所有的KEIL 8051工具包括C编译器,宏汇编器,连接/定位器 目标代码到HEX的转换器。uVis

23、ion2 通过以下特性加速你的嵌入式系统的开发过程:全功能的源代码编辑器。器件库用来配置开发工具设置。项目管理器用来创建和维护你的项目。集成的 MAKE 工具可以汇编 编译和连接你的嵌入式应用。所有开发工具的设置都是对话框形式的。真正的源代码级的对 CPU和外围器件的调试器。高级 GDI(AGDI)接口用来在目标硬件上进行软件调试 以及和Monitor-51 进行通信。 与开发工具手册和器件数据手册和用户指南有直接的链接。 uVision2界面提供一个菜单,一个工具条以便你快速选择命令按钮,另外还有源代码的显示窗口,对话框和信息显示uVision2允许同时打开浏览多个源文件。 图5-1开发环境

24、界面菜单条,工具条和快捷键 菜单条提供各种操作菜单,如:编辑操作,项目维护,开发工具选项设置,调试程序,窗口选择和处理,在线帮助,工具条按钮允许你快速地执行uVision2命令。键盘快捷键(你自己可以配置)允许你执行uVision命令。下面的表格列出了uVision2菜单项命令,工具条图标,默认的快捷键以及他们的描述:文件菜单和命令 File 菜单 快捷键 描述 New Ctrl+N 创建新文件 Open Ctrl+O 打开已经存在的文件 Close 关闭当前文件 Save Ctrl+S 保存当前文件 Save all 保存所有文件 Save as 另外取名保存 Device Database

25、 维护器件库 Print Setup 设置打印机 Print Ctrl+P 打印当前文件 Print Preview 打印预览 1-9 打开最近用过的文件 Exit 退出 uVision2 提示是否保存文件 编辑菜单和编辑器命令(Edit) 菜单 快捷键 描述 Home 移动光标到本行的开始 End 移动光标到本行的末尾 Ctrl+Home 移动光标到文件的开始 Ctrl+End 移动光标到文件的结束 Ctrl+ 移动光标到词的右边 Ctrl+A 选择当前文件的所有文本内容 Undo Ctrl+Z 取消上次操作 Redo Ctrl+Shift+Z 重复上次操作 Cut Ctrl+X 剪切所选文

26、本 Ctrl+Y 剪切当前行的所有文本 Copy Ctrl+C 复制所选文本 Paste Ctrl+V 粘贴 Indent 将所选文本右移一个制表键的距离 Selected Text Unindent 将所选文本左移一个制表键的距离 Selected Text Toggle Bookmark Ctrl+F2 设置/取消当前行的标签Goto Next Bookmark F2 移动光标到下一个标签处 Goto Previous Bookmark Shift+F2 移动光标到上一个标签处 Clear All Bookmarks 清除当前文件的所有标签 Find Ctrl+F 在当前文件中查找文本 F

27、3 向前重复查找 Shift+F3 向后重复查找 Ctrl+F3 查找光标处的单词 Ctrl+ 寻找匹配的大括号,圆括号,方括号(用此命令将光标放到大括号,圆括号或方括号的前面) Replace Ctrl+H 替换特定的字符 Find in Files 在多个文件中查找选择文本命令 在 uVision2中, 你可以通过按住Shift键和相应的光标操作键来选择文本 如 Ctrl+-是移动光标到下一个词 那么 Ctrl+Shift+-就是选择当前光标位置到下一个词的开始位置间的文本。 当然 你也可以用鼠标来选择文本 操作如下: 要选择 鼠标操作 任意数量的文本 在你要选择的文本上拖动鼠标 一个词

28、双击此词。 一行文本 移动鼠标到此行的最左边,直到鼠标变成右指向的箭头,然后单击。 多行文本 移动鼠标到此行的最左边 直到鼠标变成右指向的箭头 然后相应拖动。 一个距形框中的文本 按住 Alt键 然后相应拖动鼠标。 视图菜单 View 菜单 快捷键 描述 Status Bar 显示/隐藏状态条 File Toolbar 显示/隐藏文件菜单条 Build Toolbar 显示/隐藏编译菜单条 Debug Toolbar 显示/隐藏调试菜单条 Project Window 显示/隐藏项目窗口 Output Window 显示/隐藏输出窗口 Source Browser 打开资源浏览器 Disass

29、embly Window 显示/隐藏反汇编窗口 Watch & Call 显示/隐藏观察和堆栈窗口 Stack Window Memory Window 显示/隐藏存储器窗口 Code Coverage Window 显示/隐藏代码报告窗口 Performance Analyzer Window 显示/隐藏性能分析窗口 Symbol Window 显示/隐藏字符变量窗口 Serial Window #1 显示/隐藏串口 1 的观察窗口 Serial Window #2 显示/隐藏串口 2 的观察窗口 Toolbox 显示/隐藏自定义工具条 Periodic Window Update 程序运行

30、时刷新调试窗口 Workbook Mode 显示/隐藏窗口框架模式 Options 设置颜色 字体 快捷键和编辑器的选项 调试菜单和调试命令 Debug 菜单 快捷键 描述 Start/Stop Ctrl+F5 开始/停止调试模式 Debugging Go F5 运行程序 直到遇到一个中断 Step F11 单步执行程序 遇到子程序则进入 Step over F10 单步执行程序 跳过子程序 Step out of Ctrl+F11 执行到当前函数的结束 Current function Stop Running ESC 停止程序运行 Breakpoints 打开断点对话框 Insert/Re

31、move 设置/取消当前行的断点 Breakpoint Enable/Disable 使能/禁止当前行的断点 Breakpoint Disable All 禁止所有的断点 Breakpoints Kill All 取消所有的断点 Breakpoints Show Next 显示下一条指令 Statement Enable/Disable 使能/禁止程序运行轨迹的标识 Trace Recording View Trace 显示程序运行过的指令 Records Memory Map 打开存储器空间配置对话框 Performance 打开设置性能分析的窗口 Analyzer Inline Assem

32、bly 对某一个行重新汇编 可以修改汇编代码 Function Editor 编辑调试函数和调试配置文件外围器件菜单 Peripherals 菜单 快捷键 描述 Reset CPU 复位 CPU Interrupt, 打开片上外围器件的设置对话框 I/O-Ports, 话框的种类及内容依赖于你选择CPU Serial, Timer, A/D Converter, D/A Converter, I2C Controller, CAN Controller, Watchdog工具菜单 Tool 利用工具菜单,你可以配置,运行Gimpel PC-Lint,Siemens Easy-Case 和用户程

33、序通过Customize Tools Menu菜单,你可以添加你想要添加的程序。 菜单 快捷键 描述 Setup PC-Lint 配置 Gimpel Software的PC-Link程序 Lint 用 PC-Lint 处理当前编辑的文件 Lint all C Source Files 用PC-Lint处理你项目中所有的C源代码文件 Setup Easy-Case 配置 Siemens的 Easy-Case 程序 Start/Stop Easy-Case 运行/停止 Siemens的 Easy-Case 程序 Show File (Line) 用Easy-Case 处理当前编辑的文件 Custo

34、mize Tools Menu 添加用户程序到工具菜单中 C51 优化的 C 语言交叉编译器 Keil C51 交叉编译器是一个基于ANSI C标准的针对8051系列MCU的C编译器生成的可执行代码快速,紧凑。在运行效率和速度上可以和汇编程序得到的代码相媲美。 和汇编语言相比,用C语言这样的高级语言有很多优势,比如:对处理器的指令集不必了解8051 CPU的基本结构可以了解,但不是必须的。 寄存器的分配以及各种变量和数据的寻址都由编译器完成。 程序拥有了正式的结构(由C语言带来的),并且能被分成多个单独的子函数。这使整个应用系统的结构变得清晰,同时让源代码变得可重复使用。 选择特定的操作符来操

35、作变量的能力提高了源代码的可读性 可以运用和人的思维很接近的词汇和算法表达式 编写程序和调试程序的时间得到很大程度的缩短 C 运行连接库包含一些标准的子程序 如 格式化输出 数字转换 浮点运算 由于程序的模块结构技术 使得现有的程序段可以很容易的包含到新的程序中去 ANSI标准的C语言是一种丰常方便的,获得广泛应用的,在绝大部分系统中都能够很容易得到的语言。 因此 如果需要 现有的程序可以很快地移植到其他的处理器上,节省投资。 系统设计流程图开始LCD屏幕初始化贪吃蛇设计初始化贪吃蛇运行子程序图5-2系统主程序流程图 如图所示,程序设计的主程序即main函数很简单,主要完成初始化工作,主要完成

36、对LCD屏幕,贪吃蛇结构的初始化,然后不断运行贪吃蛇游戏程序。下面逐一分析每一个子程序的设计。开始初始化定时器绘制游戏初始界面初始化贪吃蛇参数结束图5-3贪吃蛇初始化子程序流程图定时器的作用在于产生随机数,用于随机摆放食物,定时器的工作模式为模式一,即16位计数器,当计数溢出时,定时器中断程序重装计数初值,清除中断标志位。TFT显示屏幕的显示范围是132x132个像素点,定义贪吃蛇的活动范围为从左第7个像素到84个像素,从上第7个像素到120个像素。在屏幕的坐标为(96,24)开始显示游戏得分值,坐标为(96,97)显示游戏的级数。初始化贪吃蛇参数是直接给贪吃蛇的结构体赋初值。开始根据按键选择

37、蛇的方向判断蛇是否死亡判断蛇是否最长判断蛇是否吃到食物蛇死亡界面过关界面放果子程序判断是否有按键判断是否有按键YNYN等待等待YNYNYN图5-4贪吃蛇运行子程序 贪吃蛇运行子程序是整个程序设计的核心,首先由系统检测是否有按键按下,确定有按键按下后,外部中断程序自动执行,开始扫描矩阵键盘,得到键值,根据键值判断贪吃蛇要走的方向。在游戏运行的期间,系统不断检测蛇是否死亡,蛇是否已经最长,蛇是否吃到了食物。若蛇已经死亡,则蛇的死亡标记位被置位,跳转到死亡界面,检测是否有按键按下,有就跳转到游戏开始界面,重新开始游戏,无则等到有任意键按下。若检测到蛇身的长度已经达到最长,则游戏的级数自动升高一级,游

38、戏的级数越高,贪吃蛇移动的速度越快。游戏的速度控制由延时程序决定,若延时程序延时短,则蛇移动得快,若延时比较长,则蛇移动得慢。若蛇已经吃到食物,则在放食物的原来的坐标会消除显示,重新读取计数器的值,通过计算得到要放置食物的坐标,在该坐标上显示食物。开始P1低四位输出1P1是否等于0 x0f结束延时P1是否等于0 x0f取出低四位P1输出0 xf0取出高四位取出键值NYNY图5-5键盘扫描子程序 由于该子程序出现在中断服务程序当中,不需要在主程序里重复运行,所以为CPU省下了许多资源,只占用了INIT0口,在主程序当中只需要执行对中断的设置和把P1置0 x0f输出就可以了。在扫描程序当中,首先P

39、1输出0 x0f,若有按键按下,则在P1口的低四位会有低电平出现,在P1口的低四位分别连接着四个二极管的阴极,二极管的阳极连接着中断口P3.2和VCC,没有按键按下的时候,P3.2呈现高电平,有按键按下的时候,四个二极管当中至少有一个导通,P3.2的高电平被拉低,只要把P3.2设置成下降沿中断响应模式,那样就可以进入中断服务程序。进入中断程序后,系统再次检测P1口的电平是否等于0 x0f,若P1口的电平依然不等于0 x0f,则把读到P1口的值的低四位保存起来,再输出0 xf0,读取P1口的值,把高四位保存起来。根据高四位(列值)跟低四位(行值)的值计算出键值。参考文献明浩:单片机 C 语言入门

40、教程J,2005 年电子报谷树忠,闫胜利:PROTEL 2004 使用教程M,电子工业出版社第一版胡耀辉:单片机系统开发实例经典M,北京冶金工业出版社,2006李军:51系列单片机高级实例开发指南M,北京航空航天大学出版社,2005姚燕南:微型计算机原理M,安电子科技大学出版社谢嘉奎:电子线路M,高等教育出版社李秉操:机接口技术在工业控制中的应用M, 陕西电子编辑部蔡美琴:MCS51单片机系统及其应用M,高等教育出版社周利功:增强型80C51单片机速成和实战M,北京航空航天大学出版社王天曦 ,李洪儒:电子技术工艺基础M,清华大学出版社 2000李光才,楼然笛:单片机课程设计 实例指导M,北京航

41、空航天大学出版社 2004附 录M#include #include #include LCD_SSD1283.H#include SNAKE.hvoid main(void)LCD_ssd1283a_Init();Init_SNAKE();Interrupt0_Key();while(1)Run_SNAKE();S#include #include #include LCD_SSD1283.H#include SNAKE.h/=/ 使用结构体定义变量 使程序的名称更加的清楚/=struct uchar X;uchar Y; uchar Yes;Food;/食物结构体#define SNAKE

42、_Max_Long 20 /最大长度struct uchar XSNAKE_Max_Long;uchar YSNAKE_Max_Long;uchar Long; uchar Life; uchar Score;/蛇的分数uchar Level;/蛇的等级 Snake;/蛇结构体uchar Key_V_temp=0; /取出上次按键值/函数功能:1ms延时函数/晶 振:11.0592Mvoid Delay_1mS(unsigned int n)unsigned int i;unsigned char j;for(i=0;in;i+)for(j=0;j120;j+) ;/函数名称:void Ini

43、t_time0 (void)/函数功能:初始化定时器1 用于产生随机数种子 ,用于放置实物void Init_time0 (void)EA=1;ET1=1;TMOD|=0X10;TH1=0X00;TL1=0X00;TR1=1;void time1 (void) interrupt 3TH1=0X00;TL1=0X00;/函数名称:Trun_On_Point Trun_Off_Point (uchar x,uchar y)/函数功能:点亮或者熄灭 一个点。用于显示蛇身体/入口参数:无/出口参数:无/特别说明:此 Trun_On,函数换成其他的就可以兼容其他的液晶/ 入8*8 点阵 12864 等

44、void Trun_On_Point (uchar x,uchar y,uchar color)Bar(4*(x+2),(4*(y+2),(4*(x+3),(4*(y+3),color);void Trun_Off_Point (uchar x,uchar y)Bar(4*(x+2),(4*(y+2),(4*(x+3),(4*(y+3),0 xBE5F);/函数名称:void Init_SNAKE(void) /函数功能:绘制游戏界面,初始化游戏等级等参数void Init_SNAKE(void) uchar i;Init_time0();/*绘制游戏界面*/CLR_Led_ssd1283a(

45、0 xBE5F);Rectangle(8-1,8-1,84,120,0 xaa);/绘制一个矩形框, 0-127 LCD_Display(88,8,Score,0 xcc88,0 xBE5F);LCDShow_uCharNumber(96,24,Snake.Score,0 xcc88,0 xBE5F); LCD_Display(88,81,LEVEL,0 xcc88,0 xBE5F);LCDShow_uCharNumber(96,97,Snake.Level,0 xcc88,0 xBE5F);/*初始化蛇参数*/Snake.Long=2; /定义初始化蛇的长度Snake.Life=0; /初始

46、化蛇还活着Snake.Score=0;Food.Yes=1;Key_Value=0;for(i=0;iSnake.Long;i+)/将蛇给赋值Snake.Xi=i+2;Snake.Yi=2;for(i=0;iSnake.Long;i+)/将蛇给画出来Trun_On_Point(Snake.Xi,Snake.Yi,0 xaa);/函数名称:void Display_dead(uchar i) /函数功能:显示死亡界面void Display_dead(uchar i)LCD_Display(10,40,GAME OVER,0 xcc88,0 xBE5F); while(Key_Value=i);

47、Init_SNAKE();/函数名称:void Display_Pass(uchar i)/函数功能:显示过关界面void Display_Pass(uchar i)Snake.Level+;LCD_Display(18,40,You are,0 xcc88,0 xBE5F); LCD_Display(34,56,WIN!,0 xcc88,0 xBE5F); while(Key_Value=i);Init_SNAKE();/函数名称:void Run_SNAKE(void)/函数功能:蛇运动函数 (游戏精华)void Run_SNAKE(void)uchar i=0;/*根据按键选择蛇的运动方

48、向*/if(Key_Value=Key_Right&Key_V_temp!=Key_Left)|(Key_Value=Key_Left&Key_V_temp=Key_Right)Trun_Off_Point(Snake.X0,Snake.Y0); /先把蛇尾给熄灭掉 for(i=0;iSnake.Long-1;i+) /蛇身都是它前一段的蛇身的位置Snake.Xi=Snake.Xi+1;Snake.Yi=Snake.Yi+1; Snake.XSnake.Long-1=Snake.XSnake.Long-2+1;Snake.YSnake.Long-1=Snake.YSnake.Long-2+0;

49、 /蛇头向你要求的方向移动for(i=0;iSnake.Long;i+) /这个让蛇显示出来的函数Trun_On_Point(Snake.Xi,Snake.Yi,0 xaa);Key_V_temp=Key_Right;if(Key_Value=Key_Left&Key_V_temp!=Key_Right)|(Key_Value=Key_Right&Key_V_temp=Key_Left)Trun_Off_Point(Snake.X0,Snake.Y0); /先把蛇尾给熄灭掉 for(i=0;iSnake.Long-1;i+) /蛇身都是它前一段的蛇身的位置Snake.Xi=Snake.Xi+1

50、;Snake.Yi=Snake.Yi+1; Snake.XSnake.Long-1=Snake.XSnake.Long-2-1;Snake.YSnake.Long-1=Snake.YSnake.Long-2+0; /蛇头向你要求的方向移动for(i=0;iSnake.Long;i+) /这个让蛇显示出来的函数Trun_On_Point(Snake.Xi,Snake.Yi,0 xaa);Key_V_temp=Key_Left;if( Key_Value=Key_Up&Key_V_temp!=Key_Down)|( Key_Value=Key_Down&Key_V_temp=Key_Up)Trun

51、_Off_Point(Snake.X0,Snake.Y0); /先把蛇尾给熄灭掉 for(i=0;iSnake.Long-1;i+) /蛇身都是它前一段的蛇身的位置Snake.Xi=Snake.Xi+1;Snake.Yi=Snake.Yi+1; Snake.XSnake.Long-1=Snake.XSnake.Long-2+0;Snake.YSnake.Long-1=Snake.YSnake.Long-2-1; /蛇头向你要求的方向移动for(i=0;iSnake.Long;i+) /这个让蛇显示出来的函数Trun_On_Point(Snake.Xi,Snake.Yi,0 xaa);Key_V

52、_temp=Key_Up;if( Key_Value=Key_Down&Key_V_temp!=Key_Up)|( Key_Value=Key_Up&Key_V_temp=Key_Down)Trun_Off_Point(Snake.X0,Snake.Y0); /先把蛇尾给熄灭掉 for(i=0;iSnake.Long-1;i+) /蛇身都是它前一段的蛇身的位置Snake.Xi=Snake.Xi+1;Snake.Yi=Snake.Yi+1; Snake.XSnake.Long-1=Snake.XSnake.Long-2+0;Snake.YSnake.Long-1=Snake.YSnake.Lon

53、g-2+1; /蛇头向你要求的方向移动for(i=0;i=19|Snake.YSnake.Long-1=28)/判蛇头是否撞到墙壁Snake.Life=1;for(i=3;i1); /获得随机数Food.Y=TL1&0X1B; for(i=0;iSnake.Long;i+)/判断产生的食物坐标是否和蛇身重合if(Food.X=Snake.Xi)&(Food.X=Snake.Yi)break;if(i=Snake.Long)Food.Yes=0;break;/产生有效的食物坐标 /*延时用于调整游戏速度*/Delay_1mS(5100-Snake.Level*400);K#include #in

54、clude unsigned char Key_Value=0;unsigned char Key_flag =0;void Interrupt0_Key (void)IT0=1; /设置下降沿中触发EA=1; /开总中断EX0=1; /开外部中断Key_Port=0X0f; unsigned char code Key_code=/p0 p1 p2 p30 xee,0 xed,0 xeb,0 xe7, /p40 xde,0 xdd,0 xdb,0 xd7, /p50 xbe,0 xbd,0 xbb,0 xb7, /p60 x7e,0 x7d,0 x7b,0 x77 /p7;/以上为键码,换他

55、们排列顺序就可以调整void Int0 () interrupt 0unsigned char KeyV_l,KeyV_h,KeyV,i; if(Key_Port!=0X0f) /0000 1111 有按键的时候就可能是0000 1110;/Delay();if(Key_Port!=0X0f) /0000 1111 有按键的时候就可能是0000 1110;KeyV_l=Key_Port&0 x0f; /取出键码的 低4位Key_Port=0XF0;KeyV_h=Key_Port&0 xf0; /取出键码的 高4位KeyV=KeyV_h+KeyV_l; /合并键码/* 按键编码 对应 键值Ee

56、ed eb e7 15 9 13De dd db d7 26 10 14Be bd bb b7 37 11 157e 7d 7b 77 48 12 16*/for(i=0;i16;i+) /利用键码查找键值if(Key_codei=KeyV)Key_Value=(i+1);Key_Port=0X0f;Key_flag =1;#include #include #include LCD_SSD1283.H#include ziku.h#define uchar unsigned charvoid Write_Byte(uchar dat)uchar i;c_d =1;LcdCS=0;for(i=

57、0;i8;i+) sclk = 0; dat=dat1; sdata = CY; sclk = 1; sclk = 0; LcdCS=1;void Write_Word(unsigned int dat)uchar dataH,dataL;dataH=dat/256; dataL=dat&0 xff;Write_Byte(dataH);Write_Byte(dataL);void Write_IR(uchar reg)uchar i;c_d =0;LcdCS=0;for(i=0;i8;i+) sclk = 0; reg=reg1; sdata = CY; sclk = 1; sclk = 0;

58、LcdCS=1;void Write_WDR(uchar reg,unsigned int dat)Write_IR(reg);Write_Word(dat);void Delay_XMS(unsigned int MS)uchar us,usn;while(MS!=0) /for 12M usn = 2;while(usn!=0)us = 0 xf5;while (us!=0)us-;usn-;MS-;void LCD_ssd1283a_Init(void)int i;Write_WDR(0 x10,0 x2f8e);Write_WDR(0 x11,0 x000c);Write_WDR(0

59、x07,0 x0021);Write_WDR(0 x28,0 x0006);Write_WDR(0 x28,0 x0005); Write_WDR(0 x27,0 x057f); Write_WDR(0 x29,0 x89a1);Write_WDR(0 x00,0 x0001); Delay_XMS(100);Write_WDR(0 x29,0 x80b0); Delay_XMS(30);Write_WDR(0 x29,0 xfffe);Write_WDR(0 x07,0 x0023); Delay_XMS(30);Write_WDR(0 x07,0 x0033);Write_WDR(0 x0

60、1,0 x2183);Write_WDR(0 x2f,0 xffff);Write_WDR(0 x2c,0 x8000);Write_WDR(0 x03,0 x6830); Write_WDR(0 x27,0 x0570);Write_WDR(0 x02,0 x0300); Write_WDR(0 x0b,0 x580c);Write_WDR(0 x12,0 x0609);Write_WDR(0 x13,0 x3100);Write_WDR(0 x2a,0 x1dd0);Write_WDR(0 x2b,0 x0a90);Write_WDR(0 x2d,0 x310f); Delay_XMS(1

温馨提示

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

评论

0/150

提交评论