基于s3c44b0ARM飞机游戏课程设计报告
- 格式:doc
- 大小:1.20 MB
- 文档页数:33
毕业设计说明书(论文)基于S3C44B0步进电机的控制系统序言当今世界,以计算机技术、芯片技术和软件技术为核心的数字化技术取得了迅猛发展,不仅广泛渗透到社会、经济、军事、交通、通信等相关行业,而且深入到家电、娱乐、艺术、社会文化等各个领域,掀起了一场数字化技术革命。
现代控制技术、多媒体技术与Internet的应用与普及,促使消费电子、计算机、通信一体化(3C)趋势步伐加快,嵌入式系统技术再度成为一个研究热点.嵌入式系统技术是将先进的计算机技术、半导体技术和电子技术和各个行业的具体应用相结合后的产物,这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。
ARM (Advanced RISC Machines),是对一类微处理器的通称,还可以认为是一种技术的名字。
目前,采用ARM技术知识产权的微处理器,即我们通常所说的ARM微处理器,己遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于ARM技术的微处理器应用约占据了32位RISC微处理器75%以上的市场份额,ARM技术正在逐步渗入到我们生活的各个方面。
随着人们生活水平的提高人们对智能产品的需求越来越高。
很多产品用8位机已经很难满足要求,同时技术的进步已经使32位系统不再高高在上。
32位微控制器的价格已经不比8位机高多少,有些系统使用32位机其整体成本甚至比用8 位机还要低。
这样使用32位系统就没有技术和成本的障碍了。
原先高高在上的32位嵌入式系统已经不再高贵,我们即将迎来32位应用普及的时代。
作为电类非计算机专业的本科生很有必要了解和掌握32位嵌入式应用的开发技术。
而目前在32位市场上ARM 占统治地位,因此为了适应社会发展的需求我们就很有必加入ARM嵌入式学习的环境中来了。
第1章绪论1.1课题背景嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件是可裁剪的,适用于对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。
飞机大战游戏课程设计报告一、课程目标知识目标:1. 学生能理解并掌握编程语言的基本语法和结构,如变量、循环、条件语句等。
2. 学生能运用所学的编程知识,设计和开发一个简单的“飞机大战”游戏。
3. 学生能理解游戏设计中的数学原理,如坐标系统、碰撞检测等。
技能目标:1. 学生能够运用编程工具(如Scratch或Python等)进行游戏设计和开发,提高编程实践能力。
2. 学生通过团队协作,培养沟通与协作能力,学会共同解决问题。
3. 学生能够运用创新思维,设计和优化游戏功能,提高游戏的可玩性和趣味性。
情感态度价值观目标:1. 学生培养对计算机编程的兴趣和热情,激发学习动力。
2. 学生在游戏设计和开发过程中,培养自信心和成就感,增强自主学习能力。
3. 学生通过游戏设计,体会团队合作的重要性,学会尊重他人,培养良好的团队精神。
课程性质:本课程为信息技术学科,以实践为主,注重培养学生的动手能力和创新思维。
学生特点:五年级学生,对新鲜事物充满好奇心,具备一定的逻辑思维能力,喜欢动手操作。
教学要求:教师应引导学生通过自主学习、合作探究的方式,完成游戏设计和开发任务,关注学生的学习过程,及时给予反馈和指导,提高学生的综合素质。
在教学过程中,将课程目标分解为具体的学习成果,以便于教学设计和评估。
二、教学内容本课程教学内容依据课程目标进行选择和组织,主要包括以下几部分:1. 编程基础知识:- 变量的定义和使用- 常用的数据类型- 程序流程控制(条件语句、循环语句)- 函数的定义和调用2. 游戏设计原理:- 游戏的基本元素(玩家、敌人、子弹等)- 坐标系统与运动控制- 碰撞检测与游戏逻辑3. 编程工具与操作:- Scratch或Python编程环境的使用- 图形和角色的绘制与导入- 事件处理与声音效果的应用4. 项目实践:- 设计并开发“飞机大战”游戏- 团队合作与分工- 游戏测试与优化教学内容安排和进度:第一课时:介绍编程基础知识和游戏设计原理,让学生了解课程目标和要求。
飞机大战游戏课程设计一、课程目标知识目标:1. 学生能理解游戏编程的基本概念,掌握飞机大战游戏中所涉及的计算思维和编程逻辑。
2. 学生能描述飞机大战游戏中角色、敌人和道具的基本属性,运用数学知识进行碰撞检测和分数计算。
3. 学生了解并能应用游戏设计中的美术元素,如角色设计、背景布局等。
技能目标:1. 学生能够运用所学的编程知识,独立设计和编写一个简单的飞机大战游戏。
2. 学生通过实践操作,掌握游戏中角色移动、射击、得分等功能的实现。
3. 学生能够运用合作学习的方法,与团队成员共同完成游戏设计,提高团队协作能力。
情感态度价值观目标:1. 学生培养对编程和游戏设计的兴趣,激发学习信息技术的热情。
2. 学生在游戏设计过程中,体验创新和解决问题的快乐,增强自信心。
3. 学生通过团队合作,学会尊重他人意见,培养良好的沟通和协作能力。
4. 学生了解游戏在现实生活中的应用,认识到信息技术在现代社会中的重要性。
课程性质:本课程为信息技术课程,以实践操作为主,结合理论知识,培养学生的编程能力和计算思维。
学生特点:五年级学生对新鲜事物充满好奇,具备一定的信息技术基础,喜欢动手实践,善于合作学习。
教学要求:课程要求学生在掌握基本知识的基础上,注重实践操作,通过合作学习,培养编程技能和团队协作能力。
教学过程中,教师需关注学生个体差异,提供个性化指导,确保每位学生都能达到课程目标。
二、教学内容1. 游戏编程基本概念:介绍游戏编程的定义、作用和基本流程,结合课本相关章节,让学生了解游戏设计的基本框架和编程思维。
2. 游戏角色设计:讲解角色属性、移动、射击等功能的实现方法,指导学生运用数学知识进行碰撞检测和分数计算。
3. 游戏场景设计:介绍背景、道具等元素的设计方法,结合课本中的美术知识,让学生学会如何制作美观、有趣的游戏场景。
4. 编程语言和工具:教授适合五年级学生的编程语言(如Scratch)和工具,使其能够运用所学知识独立编写飞机大战游戏。
湖南文理学院课程设计报告课程名称:基于S3C44B0的PWM发生器专业班级:自动化12101班学生姓名:于向国指导教师:王文虎完成时间: 2015年 6 月10 日报告成绩:摘要Samsung公司推出的16/32位RISC处理器S3C44B0为手持设备和一般类型应用提供了高性价比和高性能的微控制器解决方案。
为了降低成本,S3C44B0提供了丰富的内部制件,包括:8KB cache,内部SRAM,LCD控制器,带自动握手的2通道UART,4通道DMA,系统管理器(片选逻辑,FP/EDO/SDRAM控制器),代用PWM功能5通道定制器,I/O端口,RTC,8通道10位ADC,IIC-BUS接口,同步SIO接口和PLL倍频器。
S3C44B0通过提供全面的、通用的片上外设,大大减少了系统电路中除处理器以外的元器件配置,从而最小化系统的成本。
基于S3C44BO的PWM发生器的设计,该课题设计目的是充分运用大学期间所学的专业知识,考察现在正在使用的信号发生器的基本功能,完成一个基本的世纪系统的设计全过程关键是这个实际系统设计的过程,在整个过程中我可以充分发挥自动化的专业知识。
这样一个信号发生器装置在控制领域有相当广泛的应用范围。
因为产生一系列的可调波形可以作为其他一些设备的数值输入,还可以应用与设备检测,仪器调试等场合。
关键词:S3C44B0 PWM 信号发生器Abstract16/32 of the Samsung launched a RISC microprocessor S3C44B0 for handheld devices and the general type application provides cost-effective and high-performance microcontroller solutions. In order to reduce costs, S3C44B0 provides a rich internal parts, including: 8 KB cache, internal SRAM, LCD controller, shook hands with automatic UART 2 channel, channel 4 DMA, system manager (piece of logic, FP/EDO/SDRAM controller), 5 channel custom alternative PWM function, I/O port, RTC, 8 channel 10 bit ADC, IIC BUS interface, synchronization of the SIO interface and PLL frequency multiplier. S3C44B0 by providing comprehensive, general on-chip peripherals, greatly reduces the system circuit components other than the processor configuration, so as to minimize the cost of the system.Based on S3C44BO PWM generator is designed, the subject is designed to make full use of professional knowledge, university during inspection are now using the basic function of the signal generator, a century of basic system design the actual system design is the key to the whole process, I can give full play to the automation in the process of professional knowledge. Such a signal generator device has quite a wide range of application in the field of control. Because of a series of adjustable waveform can be used as a numerical input of other equipment, can also be applied to detecting equipment, equipment debugging, etc.Keywords: S3C44B0 PWM signal generator第一章简介1.1S3C44B0的系统概述S3C44BO包括:8KB cache,内部SRAM,LCD控制器,带自动握手的2通道UART,4通道DMA,系统管理器(片选逻辑,FP/EDO/SDRAM控制器),代用PWM 功能5通道定制器,I/O端口,RTC,8通道10位ADC,IIC-BUS接口,同步SIO 接口和PLL倍频器。
c语言空战游戏课程设计一、课程目标知识目标:1. 学生能理解C语言的基本语法和结构,掌握游戏设计中常用的数据类型、运算符、控制结构等知识。
2. 学生能运用C语言编写简单的空战游戏程序,理解游戏逻辑和流程控制。
3. 学生了解并能运用数组、函数等C语言特性实现游戏功能,如飞机移动、射击、敌人生成等。
技能目标:1. 学生掌握C语言编程的基本技巧,具备分析和解决编程问题的能力。
2. 学生能运用调试工具进行程序调试,找出并修复代码中的错误。
3. 学生具备团队协作能力,能与他人共同完成一个完整的游戏项目。
情感态度价值观目标:1. 学生培养对编程和计算机科学的兴趣,激发创新意识和探索精神。
2. 学生树立正确的竞争与合作意识,学会在团队项目中承担责任和分工合作。
3. 学生通过游戏设计,认识到编程知识在实际应用中的价值,增强自信心和成就感。
课程性质:本课程为C语言编程实践课,注重培养学生的编程技能和实际应用能力。
学生特点:学生为初中生,具备一定的计算机操作基础,对游戏有浓厚兴趣,但编程经验有限。
教学要求:教师需结合学生特点,采用生动有趣的教学方式,引导学生掌握C 语言知识,培养其编程技能和团队协作能力。
在教学过程中,注重理论与实践相结合,关注学生的个体差异,提供有针对性的指导。
通过课程学习,使学生达到上述设定的具体学习成果,为其后续编程学习奠定基础。
二、教学内容根据课程目标,教学内容主要包括以下几部分:1. C语言基础语法:变量、数据类型、运算符、控制结构(如if、for、while 等)。
教材章节:第一章至第四章。
2. 函数和数组:函数定义与调用、局部变量与全局变量、一维数组与二维数组。
教材章节:第五章、第六章。
3. 游戏设计基础:游戏循环、事件处理、图形绘制。
教材章节:第七章、第十章。
4. 空战游戏编程实践:飞机移动、射击、敌人生成、碰撞检测、得分与生命值。
教材章节:第八章、第九章、第十一章。
教学进度安排如下:1. 第一周:C语言基础语法学习,完成相关练习。
ARM7之S3C44B0X的电路设计初体验:关于其存储器控制器2009年04月19日星期日03:18 P.M.1.S3C44B0X地址空间划分其分为8个BANK,每一BANK最多有32MB空间。
为什么?S3C44B0X的地址总线范围为ADDR【24:0】,那就是说一共有25根地址线咯,这里的寻址范围就达到了32MB 空间,再加上S3C它自身有的片选信号线NGCS[7:0],那就是一共32MB*8=256MB空间。
2.S3C44B0X存储控制器功能大小端模式的选择:ENDIAN INPUT。
我们实验箱为小端模式。
Bank0总线宽度设置:主要还是取决于OM0和OM1,在我们实验箱的电路设计中已经固定好是1:0模式,即BANK0的总线宽度为16位。
本实验箱中的SDRAM的地址范围是存在于第7个BANK中。
3. S3C44B0X存储控制器寄存器BWSCON寄存器:决定每个BANK的总线宽度,决定每个BANK的等待时间,以及小端和大端模式选择。
BANKCON[5:0]寄存器:主要功能为时钟等待的选择。
需要特别注意BANKCON6和BANKCON7,他们的16.15位决定了存储器类型,REFRESH寄存器:决定是否启动自动重刷以及重刷时钟。
BANKSIZE寄存器:决定BANK6/7的大小。
MRSRB寄存器:决定SDRAM的模式。
4.S3C44B0X存储控制器寄存器初始化其对存储器的初始化时在文件“44binit.s”文件中,这是不是就是传说中的BOOTLOADER呢?探究中?看了看它对存储器初始化这一部分代码:设置寄存器#****************************************************#* Set memory control registers *#****************************************************ldr r0,=SMRDATAldmia r0,{r1-r13}ldr r0,=0x01c80000 /* BWSCON Address */stmia r0,{r1-r13}设置每个BANK的使用#bank0 16bit BOOT ROM#bank1 NandFlash(8bit)/IDE/USB/rtl8019as/LCD#bank2 No use#bank3 Keyboard#bank4 No use#bank5 No use#bank6 16bit SDRAM#bank7 No use.ifeq BUSWIDTH-16.long 0x11110102 /* Bank0=16bit BootRom(AT29C010A*2) :0x0 */.else.long 0x22222220 /* Bank0=OM[1:0], Bank1~Bank7=32bit */.endif.long((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+ (B0_PMC)) /* GCS0 */.long((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+ (B1_PMC)) /* GCS1 */.long((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+ (B2_PMC)) /* GCS2 */.long((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+ (B3_PMC)) /* GCS3 */.long((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+ (B4_PMC)) /* GCS4 */.long((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+ (B5_PMC)) /* GCS5 */.ifc "DRAM",BDRAMTYPE.long ((B6_MT<<15)+(B6_Trcd<<4)+(B6_Tcas<<3)+(B6_Tcp<<2)+(B6_CAN)) /* GCS6 check the MT value in parameter.a */.long ((B7_MT<<15)+(B7_Trcd<<4)+(B7_Tcas<<3)+(B7_Tcp<<2)+(B7_CAN)) /* GCS7 */.else.long ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) /* GCS6 */.long ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) /* GCS7 */.endif.long ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT) /* REFRESH RFEN=1, TREFMD=0, trp=3clk, trc=5clk, tchr=3clk,count=1019 */ .long 0x10 /* SCLK power down mode, BANKSIZE 32M/32M */.long 0x20 /* MRSR6 CL=2clk */.long 0x20 /* MRSR7虽然说的那么简单,认真看看上面的汇编还是不懂它每一行是什么意思。
S3C44B0 学习板使用指南重庆勤智科技有限公司三星公司推出的 16/32 位 RISC 处理器 S3C44B0X 为手持设备和一般类型的提供了一种高性能低成本的解决方案。
为了降低整个系统的成本,S3C44B0X 内部集成了丰富的片内外设,包括:8K 的 cache,可选的片内 SRAM,LCD 控制器,带有握手信号的双同道 UART,4 同道 DMA,系统管理器(片选逻辑,FP/EDO/SDRAM 控制器),带有PWM 功能的 5 通道定时器,I/O 端口,RTC 实时时钟,8 通道 10 位 ADC,IIC、IIS 总线接口,同步 SIO 接口以及用于时钟管理的PLL 锁相环。
S3C44B0X 采用了 ARM7TDMI 内核,0.25um 标准宏单元和存储编译器。
TDMI 的每一个字母代表一种功能: T(Thumb),支持 16 为压缩指令集 Thumb D(Debug),支持片上 Debug M(Multiplier),内嵌硬件乘法器 I(ICE):嵌入式 ICE,支持片上断点和调试点S3C44B0X 极低的功耗以及简单,只能的全静态设计使其非常适合对成本和功耗敏感的项目。
同时S3C44B0X 还采用了一种新的总线结构,即 SAMBAII(三星 ARM CPU 嵌入式微处理器总线结构)S3C44B0X 通过集成全面、通用的片内外设,大大减少了系统电路中除处理器外的器件需求,从而最小化系统成本。
下列是其集成的边内外设: 外部存储器控制器(FP/EDO/SDRAM 控制器,片选逻辑)控制器(最大支持 256 色 STN,LCD 具有一个专用的 DMA 通道) LCD个通用 DMA 通道,2 个外设 DMA 通道并有片外请求管脚 2个 UART,带有握手协议(支持 irDA1.0,具有 16 字节 FIFO)1 通道 SIO 2多主总线接口 IIC总线控制器 IIS个 PWM 定制器和 1 通道内部定时器 5 看门狗定时器个通用 I/O 口,作多支持 8 各片外中断源 71 功耗管理:普通,慢速,空闲和停止模式 8 通道 10 位 ADC 具有日立功能的 RTC 带 PLL 的片内时钟发生器使用 S3C44B0X 来构建系统,能够降低真个系统的成本,我们列举以下一些可以采用 S3C44B0X 构建系统应用: GPS 电话 PDA(个人数字助理) 掌上游戏机 指纹识别系统 终端汽车导航系统 mp3 等手持应用一、 S3C44B0 学习板简介S3C44B0 开发板是依据三星公司评估板的基础上开发而来, 其主要硬件包括:内核)(ARM7 Samsung66MHzS3C44B0XFlash 8M 2M SDRAMBase-T以太网接口 10M IDE 接口设备接口 USB1.1 IIC 总线接口实时时钟 RTC LCD 接口,支持 640×480 以下单色或 320×240 以下 STN/DSTN 256 色 2 个 RS232 UART 串行口,支持 Modem 握手信号 标准 14 针 JTAG 接口键盘,1×3 LED 灯 1×4 可扩展总线接口同时,本开发板提供完善的开发包和各种硬件测试程序(含源码),以帮助客户快速掌握 S3C44B0 的各种片内外设以及扩展接口的使用方法: ADS1.2 IDE, ARM 程序开发集成环境 GNU 工具包(包括交叉编译器、链接、汇编工具) uClinux 源码包 U-Boot1.1.1(BOIS)启动控制程序(含源码) 应用程序代码 相关技术文档,手册 键盘控制 LED 试验 实时时钟演示 IIC 测试程序 PWM 测试程序 uCOS-II 实时操作系统加载试验下图是 S3C44B0 的开发板图,我们在这里可以看到使用的板子的各种外围芯片,外设以及各种接口。
课设报告题目:飞机大战班级:姓名:学号:指导老师:日期:年月日目录1摘要 (3)2.1 功能需求 (3)2.2 设计要求 (4)3 硬件设计及描述 (5)3.1 总体描述 (5)3.2 系统总体框图 (5)3.3 各部分硬件介绍 (5)3.31输入模块 (5)3.32输入模块 (6)4 软件设计流程及描述 (7)4.1 程序流程图 (7)4.2 主要函数模块及功能 (8)4.2.1控制飞机模块 (8)4.2.2 碰撞检测模块 (9)5 功能实现 (11)液晶显示 (11)6 心得体会 (13)1摘要三星公司推出的16/32 位RISC 处理器S3C44B0X 为手持设备和一般类型的提供了一种高性能低成本的解决方案。
为了降低整个系统的成本,S3C44B0X 内部集成了丰富的片内外设,包括:8K 的cache,可选的片内SRAM,LCD 控制器,带有握手信号的双同道UART,4 同道DMA,系统管理器(片选逻辑,FP/EDO/SDRAM 控制器),带有PWM 功能的5 通道定时器,I/O 端口,RTC 实时时钟,8 通道10 位ADC,IIC、IIS 总线接口,同步SIO 接口以及用于时钟管理的PLL 锁相环。
S3C44B0X 极低的功耗以及简单,只能的全静态设计使其非常适合对成本和功耗敏感的项目。
同时S3C44B0X 还采用了一种新的总线结构,即 SAMBAII(三星 ARM CPU 嵌入式微处理器总线结构)S3C44B0X 通过集成全面、通用的片内外设,大大减少了系统电路中除处理器外的器件需求,从而最小化系统成本。
2.1 功能需求1.以动漫的形式显示开机界面和加载游戏进入。
2.以位图的方式显示不同飞机的图像,开机界面。
3.使用碰撞检测机制,实现飞机与飞机,飞机与子弹的检测。
4.实现按键的控制,对子弹的发送和飞机的上下左右的自由控制。
5.敌机的随机出现,并实现无限架敌机,且游戏主界面需每次出现三架飞机,供我机击落。
6.对击落的敌机实现计数,随着敌机击落的不同数量设置不同的难度级别。
7.飞机实现三次的生命值,即有三次机会。
2.2 设计要求1.界面流畅,操控飞机灵活。
2.碰撞检测的算法设计3 硬件设计及描述3.1 总体描述在实验开发板上,根据功能需求,设定了控制模块由ARM7为控制核心,具有在线编程功能,低功耗,输入模块由按键和触屏控制,通过触屏实现游戏的加载,通过按键实现飞机的上下移动,避开与敌机的相撞,子弹的发射可以将敌机击毁。
3.2 系统总体框图按键模块信号输入ARM7信号输出液晶显示3.3 各部分硬件介绍3.31输入模块矩阵式键盘适用于按键数量较多的场合,它由行线和列线组成,按键位于行、列的交叉点上。
如图6—7所示,一个3 X 3的行、列结构可以构成一个有9个按键的键盘。
同理一个4 X 4的行、列结构可以构成一个含有16个按键的键盘等等。
很明显,在按键数量较多的场合,矩阵键盘与独立式按键键盘相比,要节省很多的I/O口。
按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。
行线通过上拉电阻接到VCC上。
平时无按键动作时,行线处于高电平状态,而当有按键按下时,行线电平状态将由与此行线相连的列线电平决定。
列线电平如果为低,则行线电平为低;列线电平如果为高,则行线电平亦为高。
这一点是识别矩阵键盘按键是否被按下的关键所在。
由于矩阵键盘中行、列线为多键共用,各按键均影响该键所在行和列的电平。
因此各按键彼此将相互发生影响,所以必须将行、列线信号配合起来并作适当的处理,才能确定闭合键的位置。
3.32输入模块LCD屏是中间夹有一些液晶材料的两块玻璃板,在此夹层的各个节点上通以微小的电流,就能够让液晶显现出图案,诸如计算器上的数字、PDA上的文本、笔记本电脑显示器上的图像之类的东西。
LCD的主要特点:首要的是它们体积轻而且薄,只有几英寸厚。
LCD第二大优点就是能耗少,比CRT显示器少90%。
其三,LCD 的文本和图表显示要比CRT 显示器上的清晰。
目前的不足之处也是显而易见的,如视角窄,颜色表现力欠佳。
图为S3C44BOX中内置的LCD控制器的逻辑框图,它用于传输显示数据并产生必要的控制信号,如VFRAME,VLINE,VCLK,和VM。
除了控制信号,还有显示数据的数据端口VD[7:0]。
LCD控制器包含REGBANK,LCDCDMA,VIDPRCS,和TIMEGEN。
REGBANK 具有18 个可编程寄存器,用于配置LCD 控制器。
LCDCDMA 为专用DMA,以自动地将显示数据从帧内存中传送到LCD 驱动器中。
4 软件设计流程及描述4.1 程序流程图图4-1 系统程序流程图4.2 主要函数模块及功能4.2.1控制飞机模块采用扫描法判断按键的按下,根据对按键的不同键值实现对飞机的上下左右控制,每按一次,飞机均移动十个像素的位置。
部分实现代码如下:key = Key_Get();switch(key) {case '2':LCD_Clear_Plane(planeX, planeY, planeX+40, planeY+40); planeY -= 10;break;case '*':LCD_Clear_Plane(planeX, planeY, planeX+40, planeY+40); planeX -= 10;break;case '0':LCD_Clear_Plane(planeX, planeY, planeX+40, planeY+40); planeY += 10;break;case '#':LCD_Clear_Plane(planeX, planeY, planeX+40, planeY+40); planeX += 10;break;case '1':OrnotDrawBullet();break;}4.2.2 碰撞检测模块分别实现飞机与飞机的碰撞检测和飞机和子弹的碰撞检测。
下图分别为两个检测的流程图。
飞机与飞机的碰撞采用矩阵相交的方法,实现算法如下:假定矩形是用一对点表达的(minx, miny) (maxx, maxy),那么两个矩形rect1{(minx1, miny1)(maxx1, maxy1)}rect2{(minx2, miny2)(maxx2, maxy2)} 相交的结果一定是个矩形,构成这个相交矩形rect{(minx, miny) (maxx, maxy)}的点对坐标是:minx = max(minx1, minx2)miny = max(miny1, miny2)maxx = min(maxx1, maxx2)maxy = min(maxy1, maxy2)如果两个矩形不相交,那么计算得到的点对坐标必然满足:(minx > maxx )或者(miny > maxy )玩家游戏的飞机默认设置为三次机会,即有三次生命值,当判断生命值<0 时候游戏结束,并且跳出框显示击毁敌机的数量。
子弹的发射靠按键的按下实现,与敌机碰撞同样采用飞机与飞机的碰撞,当子弹与飞机碰撞的时候,接触部分会出现局部的爆炸,继而出现大爆炸,同时随着击毁敌机的数量增多,游戏的难度增加,敌机下落的速度增加。
5 功能实现液晶显示游戏初始化后,开机界面的显示。
进入游戏界面,实现对敌机的打击。
生命值的统计,击毁敌机数6 心得体会这次课程设计最大的收获就是只有把理论运用到实践中我们才能真正掌握所学的知识,在实践中,通过一系列问题的出现与解决,我对ARM有了更好的认识和理解,同时让我的动手能力有了一定的提高。
本次课程设计是以小组合作的形式进行,在这个过程中我们小组成员之间互相学习,互相帮助,团结协作,弥补彼此的不足,经过成员间的讨论及请教其他小组成员,我们的问题迎刃而解。
7源代码/********************************************************** * Copyright (c) 2004 上海双实科技有限公司* All rights reserved.** 文件名称:main_lcd.c* 文件标识:程序实现体* 摘要:本文件是对lcd功能的测试** 当前版本:1.0* 作者:刘征* 完成日期:2004.8.17** 取代版本:* 作者:* 完成日期:********************************************************* *//********************************************************** * bmp头文件********************************************************* */#include "44b0x.h"#include "44bConfig.h"#include "define.h"#include "LCD_Control.h"#include "LCD_BMP.h"#include "bmp_Color256.h"/********************************************************** * key头文件********************************************************* */#include "uart.h"#include "key.h"#include <stdio.h>#include <stdlib.h>/*********************************************************** Touch头文件**********************************************************/#include "TouchPanel.h"#define DISABLE_TIMER2 (rTCON &= ~0x1000)#define ENABLE_TIMER2 (rTCON |= 0x1000)#define ENABLE_TOUCH (rPDATE &= 0xfe);/*********************************************************** 变量**********************************************************/extern GUI_BITMAP *pBitmap;char key = 0;//键值int planeX=145,planeY=200;//初始飞机坐标int a[5],b[5],c[5],d[5];int i = 0 ,m = 0;int color[2];int ArmyX[3] ,ArmyY[3],live_Army[3];int live_plane = 1;//飞机生命值int Random1 = 80 , Random2 = 200 ,Random3 = 120;int Count ;int liveHeart[3];int liveCount = 3;int AccSign1 = 1 , AccSign2 = 1 , AccSign3 = 1 , AccSign4 = 1; int HeartSign=1;//int live_Army = 1;//敌机生命值/********************************************************** * 函数声明********************************************************* */void LCD_Clear_Plane(int x0, int y0, int x1, int y1); void LCD_Clear_Bullet(int x0, int y0, int x1, int y1); void drawPlane(int x, int y, int arm);void changeColor(int a){int b;if(a == 0)b = a + 1;if(a == 1)b = a - 1;LCD_Draw_FillRect(70, 2, 75, 37,color[a]);LCD_Draw_FillRect(70, 40, 75, 77,color[b]);LCD_Draw_FillRect(70, 80, 75, 117,color[a]);LCD_Draw_FillRect(70, 120, 75, 157,color[b]);LCD_Draw_FillRect(70, 160, 75, 197,color[a]);LCD_Draw_FillRect(70, 200, 75, 237,color[b]);LCD_Draw_FillRect(245, 2, 250, 37,color[a]);LCD_Draw_FillRect(245, 40, 250, 77,color[b]);LCD_Draw_FillRect(245, 80, 250, 117,color[a]);LCD_Draw_FillRect(245, 120, 250, 157,color[b]);LCD_Draw_FillRect(245, 160, 250, 197,color[a]);LCD_Draw_FillRect(245, 200, 250, 237,color[b]); }/********************************************************** * 画飞机********************************************************* *//*** 清除飞机运动轨迹*/void LCD_Clear_Plane(int x0, int y0, int x1, int y1)int x,y;for(x = x0;x <= x1; x++){for(y = y0;y <= y1; y++){SETPIXEL(x, y, 0xff);//clear lcd }}}void drawPlane(int x, int y, int arm){if(arm == 0){BMP_Init(Army);GUI_DrawBitmap(pBitmap,x,y);}if(arm == 1){BMP_Init(Array);GUI_DrawBitmap(pBitmap,x,y);}}void drawBonb(int x, int y, int arm){if(arm == 0){BMP_Init(bonb1);GUI_DrawBitmap(pBitmap,x,y);}if(arm == 1){BMP_Init(bonb2);GUI_DrawBitmap(pBitmap,x,y);}/********************************************************** * 飞机移动********************************************************* */void OrnotDrawBullet(){a[i] = planeX + 17;b[i] = planeY - 6 ;c[i] = planeX + 20;d[i] = planeY;i++;if(i >= 5)i = 0;}//避免越界void avoidCrossLine(){if(planeX < 75)planeX =75;if(planeX > 205)planeX = 205;if(planeY < 0)planeY = 0;if(planeY > 200)planeY = 200;}void movePlane(){int minx[3];int miny[3];int maxy[3];int k = 0;key = Key_Get();switch(key) {case '2':LCD_Clear_Plane(planeX, planeY, planeX+40, planeY+40); planeY -= 10;break;case '*':LCD_Clear_Plane(planeX, planeY, planeX+40, planeY+40); planeX -= 10;break;case '0':LCD_Clear_Plane(planeX, planeY, planeX+40, planeY+40); planeY += 10;break;case '#':LCD_Clear_Plane(planeX, planeY, planeX+40, planeY+40); planeX += 10;break;case '1':OrnotDrawBullet();break;}avoidCrossLine();for(;k<3;k++){minx[k] = (ArmyX[k] - planeX >0)? ArmyX[k] + 2:planeX;miny[k] = (ArmyY[k] + 2 - planeY > 0)? ArmyY[k] + 2:planeY;maxx[k] = (ArmyX[k] - 10 - planeX >0)? planeX + 40:ArmyX[k] + 30;maxy[k] = (ArmyY[k] + 2 - 10 - planeY >0)? planeY + 40:ArmyY[k] +30 + 2;}for(k = 0;k < 3; k++){if(minx[k] > maxx[k] || miny[k] > maxy[k]){}else{if(live_plane == 1 && live_Army[k] == 1){//live_plane = 0;live_Army[k] = 0;LCD_Clear_Plane(ArmyX[k], ArmyY[k], ArmyX[k] + 30, ArmyY[k] + 30);drawBonb(planeX - 10, planeY - 10, 0);Delay(2000);LCD_Clear_Plane(planeX -10, planeY - 10, planeX + 25, planeY + 18);LCD_Clear_Plane(planeX, planeY, planeX + 40, planeY + 40);LCD_Clear_Plane(ArmyX[k], ArmyY[k] + 2, ArmyX[k] + 30, ArmyY[k] + 30 + 2);drawBonb(planeX - 10, planeY - 10 , 1);Delay(2000);LCD_Clear_Plane(planeX -10, planeY - 10,planeX + 30, planeY + 20);// planeX=-40,planeY=-40;liveCount --;if(liveCount < 1){live_plane = 0;}}}}if(live_plane == 1){drawPlane(planeX,planeY,1);}}void LCD_Clear_Bullet(int x0, int y0, int x1, int y1) {LCD_Clear_Plane(x0, y0, x1, y1);}/********************************************************** * 子弹********************************************************* */void draw_Bullet(){int j;LCD_Draw_FillRect(a[0], b[0], c[0], d[0],0x00);LCD_Draw_FillRect(a[1], b[1], c[1], d[1],0x00);LCD_Draw_FillRect(a[2], b[2], c[2], d[2],0x00);LCD_Draw_FillRect(a[3], b[3], c[3], d[3],0x00);LCD_Draw_FillRect(a[4], b[4], c[4], d[4],0x00);Delay(800);LCD_Clear_Bullet(a[0], b[0], c[0], d[0]);LCD_Clear_Bullet(a[1], b[1], c[1], d[1]);LCD_Clear_Bullet(a[2], b[2], c[2], d[2]);LCD_Clear_Bullet(a[3], b[3], c[3], d[3]);LCD_Clear_Bullet(a[4], b[4], c[4], d[4]);for(j = 0;j < 5; j++){for(m = 0;m < 3; m++){if( a[j] >= ArmyX[m] && a[j] <= ArmyX[m] + 30 && b[j] >= ArmyY[m] && b[j] <= ArmyY[m] + 30 && live_Army[m] == 1){live_Army[m] = 0;drawBonb(a[j] - 13, b[j] - 20 , 0);Delay(1000);LCD_Clear_Plane(a[j] - 13, b[j] - 20, a[j] + 15, b[j] + 12);LCD_Clear_Plane(ArmyX[m], ArmyY[m], ArmyX[m] + 30, ArmyY[m] + 30);drawBonb(a[j] - 15, b[j] - 23 , 1);Delay(1000);LCD_Clear_Plane(a[j] - 15, b[j] - 23,a[j] + 25, b[j] + 7);a[j] = 0;b[j] = 0;c[j] = 0;d[j] = 0;Count++;}}if(b[j] > 0){b[j] -= 10;d[j] -= 10;}if(b[j] < 0){a[j] = 0;b[j] = 0;c[j] = 0;d[j] = 0;}}}void ArmyMove(int x, int y, int a){LCD_Clear_Plane(x, y, x+30, y+30);drawPlane(x,y+2,0);// Delay(800);}//画三个红心void LiveHeartDraw(){int k;liveHeart[0] = 0;liveHeart[1] = 20;liveHeart[2] = 40;Lcd_GotoXY(1,3);Lcd_printf(RED,"生命值:");for(k = 0; k < 3; k++){LCD_Clear_Plane(liveHeart[k],80, liveHeart[k] + 20, 100);BMP_Init(live_heart);GUI_DrawBitmap(pBitmap,liveHeart[k],80);}}//生命值和计数void LiveHeart(int n){if(n==1){LCD_Clear_Plane(liveHeart[1],80, liveHeart[1] + 20, 100);LCD_Clear_Plane(liveHeart[2],80, liveHeart[2] + 20, 100);}if(n==2){LCD_Clear_Plane(liveHeart[2],80, liveHeart[2] + 20, 100);}Lcd_GotoXY(1,11);Lcd_printf(RED,"击毁数:");Lcd_GotoXY(1,13);LCD_Clear_Plane(0, 210, 60, 240);Lcd_printf(RED," %d",Count);}void __irq Timer2_Int(void){/* Clear flag */rI_ISPC = BIT_TIMER2;draw_Bullet();Random1++;if(Random1>215)Random1=80;Random3+=10;if(Random3>215)Random3=120;}void __irq Timer3_Int(void){/* Clear flag */rI_ISPC = BIT_TIMER3;Random2++;if(Random2>215)Random2=80;if(live_Army[0] == 1){ArmyMove(ArmyX[0], ArmyY[0], 0);ArmyY[0] += 2;if(ArmyY[0] > 240 ){ArmyY[0] = -4;ArmyX[0] =Random1;}}if(live_Army[0] == 0){ArmyY[0] = -4;ArmyX[0] =Random1;live_Army[0] = 1;}if(live_Army[1] == 1){ArmyMove(ArmyX[1], ArmyY[1], 0);ArmyY[1] += 2;if(ArmyY[1] > 240 ){ArmyY[1] = -2;ArmyX[1] = Random2;}}if(live_Army[1] == 0){ArmyY[1] = -2;ArmyX[1] =Random2;live_Army[1] = 1;}if(live_Army[2] == 1){ArmyMove(ArmyX[2], ArmyY[2], 0);ArmyY[2] += 2;if(ArmyY[2] > 240 ){ArmyY[2] = -4;ArmyX[2] =Random3;}}if(live_Army[2] == 0){ArmyY[2] = -4;ArmyX[2] =Random3;live_Army[2] = 1;}}void __irq Timer4_Int(void){/* Clear flag */rI_ISPC = BIT_TIMER4;draw_Bullet();}void Timer2_Init(void){rTCON &= 0xffff0fff;rTCFG0 &= 0xffff00ff;rTCFG0 |= 0xf900;rTCFG1 &= 0xfffff0ff;rTCFG1 |= 0x00000200;rTCNTB2 = 32 * 120;rTCON |= 0x00002000;rTCON &= 0xffff0fff;rTCON |= 0x0000c000;SetISR(pISR_TIMER2,(int)Timer2_Int);EnableIrq(BIT_TIMER2);ENABLE_TIMER2;}void Timer3_Init(void){rTCON &= 0xfff0ffff;rTCFG0 &= 0xffff00ff;rTCFG0 |= 0xf900;rTCFG1 &= 0xffff0fff;rTCFG1 |= 0x00002000;rTCNTB3 = 32 * 100;rTCON |= 0x00020000;rTCON &= 0xfff0ffff;rTCON |= 0x000c0000;SetISR(pISR_TIMER3,(int)Timer3_Int);EnableIrq(BIT_TIMER3);rTCON |= 0x00010000;}void Timer4_Init(void){rTCON &= 0xff0fffff;rTCFG0 &= 0xff00ffff;rTCFG0 |= 0xf900;rTCFG1 &= 0xfff0ffff;rTCFG1 |= 0x00020000;rTCNTB4 = 32 * 200;rTCON |= 0x00200000;rTCON &= 0xff0fffff;rTCON |= 0x00c00000;SetISR(pISR_TIMER4,(int)Timer4_Int);EnableIrq(BIT_TIMER4);rTCON |= 0x00100000;}//开机动漫void drawBackground(){BMP_Init(backPlane);GUI_DrawBitmap(pBitmap,60,180);Delay(10000);LCD_Clear_Plane(60, 180, 95, 215);BMP_Init(bonb1);GUI_DrawBitmap(pBitmap,60,180);Delay(7000);LCD_Clear_Plane(60, 180, 90, 210);BMP_Init(backPlane);GUI_DrawBitmap(pBitmap,130,180);Delay(10000);LCD_Clear_Plane(130, 180, 165, 215);BMP_Init(bonb1);GUI_DrawBitmap(pBitmap,130,180);Delay(7000);LCD_Clear_Plane(130, 180, 165, 210);BMP_Init(backPlane);GUI_DrawBitmap(pBitmap,210,180);Delay(10000);LCD_Clear_Plane(210, 180, 245, 215);}//进度条void drawProgressBar(){int x = 10,y = 120, n = 0;LCD_Clear_Plane(0, 0, 320, 240);Lcd_GotoXY(8,6);Lcd_printf(RED,"正在进入游戏,请稍候...");LCD_DrawRect(10, 120, 300, 140, GREEN);for(;n < 5; n++){LCD_Draw_FillRect(x, y, x + 58,y + 20,GREEN);Delay(10000);x += 58;}LCD_Draw_FillRect(0, 0, 320, 240,0xff);Timer2_Init();Timer3_Init();// Timer4_Init();}//清空右边小心加速字幕void Right_Words(){Lcd_GotoXY(35,7);Lcd_printf(RED,"小");Lcd_GotoXY(35,8);Lcd_printf(RED,"心");Lcd_GotoXY(35,9);Lcd_printf(RED,"加");Lcd_GotoXY(35,10);Lcd_printf(RED,"速");Delay(2500);LCD_Clear_Plane(250,40, 300,200); }//敌机加速void Accelerate(int Acc){if(Acc==5&&AccSign1==1){rTCNTB3 = 32 * 80;Right_Words();AccSign1=0;}if(Acc==10&&AccSign2==1){rTCNTB3 = 32 * 60;Right_Words();AccSign2=0;}if(Acc==15&&AccSign3==1){rTCNTB3 = 32 * 40;Right_Words();AccSign3=0;}if(Acc==20&&AccSign4==1){rTCNTB3 = 32 * 20;Right_Words();AccSign4=0;}}//游戏结束void GameOver(){rTCON &= 0x00000000;BMP_Init(gameOver);GUI_DrawBitmap(pBitmap,0,0);Lcd_GotoXY(20,9);Lcd_printf(RED,"击毁敌机:%d 架",Count);}void Sum_Init(){Port_Init();LCD_Init();Isr_Init();Uart_Init(0,57600);Key_Init();// Beep_Init();ENABLE_TOUCH;TouchPanel_Init();//触摸屏初始化ArmyX[0] = 120;ArmyX[1] = 200;ArmyX[2] = 80;ArmyY[0] = -2;ArmyY[1] = -2;ArmyY[2] = -2;live_Army[0] = 1;live_Army[1] = 1;live_Army[2] = 1;}/*********************************************************** 函数介绍:本函数被用来用作测试IIc总线传输数据功能。