ARM课程设计报告文档格式.docx
《ARM课程设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《ARM课程设计报告文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
因为本次实验要使LCD显示,并通过键盘产生中断控制贪吃蛇的运动状态和速度,所以本次实验主要同到的.c文件主要是keyboard.c、lcd.c、8led.c和main.c,主要在这几个文件上进行编程。
本次实验的关键是如何在LCD中显示蛇并且需要实现蛇的移动,以及蛇吃到食物之后如何实现蛇身增长一段以及如何用键盘产生中断控制蛇的移动方向.
2.2.1游戏界面设计
1)游戏边框绘制
将整个屏幕全部作为游戏界面,所以将点亮屏幕四条边的像素点。
此时调用二维数组chDispRam[][]实现点亮屏幕中四条边。
具体通过以下程序实现。
2)游戏结束时界面显示
这里设计了新函数GameOver()来实现。
GameOver()原型如下:
3)食物显示和贪吃蛇显示
为了在屏幕中显示贪吃蛇,首先需要在屏幕中确定蛇头的坐标,这样蛇身的坐标都可以通过蛇头的坐标推导出来,从而实现整个3段蛇身的显示。
在点亮蛇头坐标的过程中,先设计了一个新函数Set_Display(),功能是只需要给出屏幕中某点的坐标和亮灭信号,就可以实现该点的点亮或者熄灭。
Set_Display()原型如下:
接下来调用Set_Display()实现贪吃蛇的蛇身显示。
具体程序实现如下:
然后食物的显示,包括初始显示和随机产生食物,这里通过chDispRam[][]和新函数Food()来完成。
Food()函数通过把随机数赋给食物坐标来实现食物的随机显示。
Food()原型如下:
2.2.2贪吃蛇行进和吃食物蛇身变长设计
游戏开始时,定义了新函数Move(),设置贪吃蛇从初始位置向右运动,在运动过程中等待按键,根据按键来决定下一步怎么行进。
按键控制的贪吃蛇行进可以有4种转向和4种直线运动方向。
这里通过定义了4个新函数来实现,分别是UpMove(),DownMove(),LeftMove(),RightMove().这些函数中,首先控制贪吃蛇转向,等到转向完毕后,将按转向后的方向的直线行进,继续等待下一条按键指令。
贪吃蛇在行进过程中,每行进一步,都要检测蛇头坐标是否和食物坐标相同,如果相同,则在行进过程中蛇尾少熄灭一段,这样在效果上就变相的实现了蛇身的增长。
在对比蛇头和食物坐标的过程中,定义了一个新函数Judge_Food()来实现。
3.程序流程图与主要函数说明
3.1程序运行的主函数(voidmain):
3.2UpMove(),DownMove(),LeftMove(),RightMove()功能类似,下面以RightMove()为例介绍函数功能:
4.测试效果与分析
4.1初始界面测试
4.2功能测试
4.2.1出现食物
4.4.2出现蛇
4.2.3蛇的移动界面
(a)左移(b)右移
(c)上移(d)下移
4.3游戏结束界面
4.4结果说明
测试结果分为开机界面测试、贪吃蛇行进和吃食物的功能测试以及贪吃蛇撞墙后游戏结束闪烁界面测试。
测试结果为:
以上提及的功能均能正常工作,贪吃蛇在上下左右四个方向行进过程中和从四个方向去吃食物的过程中,均能流畅准确的完成,满足设计的要求。
根据结果,程序仍有需要改进的地方,比如说贪吃蛇的行进速度,和贪吃蛇形状的设计,在此设计过程中,贪吃蛇的速度较为缓慢,为了改进这一状况,这是以后的工作重点。
5.收获与体会
通过本次课程设计,我受益匪浅,收获很多。
从一开始的迷茫,到后来的逐渐清晰,自己对本次设计的框架和思想有了更加深刻的理解,对于ARM的硬件结构有了一个全新的认识。
在本次设计过程中,自己遇到了很多的困难,对很多函数的使用也不了解,但是通过与同学交流并查看相关资料,经过多次尝试,我解决了这些问题,每一次问题的解决都是对自己能力的提升和锻炼。
书本上的知识毕竟只是理论,要与实践结合起来,这样才能更好的学习,希望以后能有更多这样的机会,感谢老师的指导与付出。
附录:
///////////设置屏幕上某点的亮灭函数/////////////////
voidSet_Display(uint8x,uint8y,uint8k)//设置(y,x)点的亮
(1)或者灭(0),显示屏上横为y,竖为x,函数这样和一般坐标系就一致
{
uint8xx,jj,kk,tt;
xx=x;
kk=y/8;
//在第几列
jj=y%8;
//在该列的第几位
tt=0x01;
if(k==1)
{
if(jj!
=0)
tt=tt<
<
(8-jj);
//找到相应的位置赋值
chDispRam[x][kk]=chDispRam[x][kk]|tt;
}
else
chDispRam[x][kk-1]=chDispRam[x][kk-1]|tt;
elseif(k==0)
tt=~tt;
chDispRam[x][kk]=chDispRam[x][kk]&
tt;
else
{
tt=0xfe;
chDispRam[x][kk-1]=chDispRam[x][kk-1]&
tt;
disp_bmp();
}
////////////检测屏幕上某点的亮灭函数//////////////
uint8Test_Light(uint8x,uint8y)//检测坐标(y,x)处亮
(1)或者灭(0)
uint8xx,jj,kk,tt;
xx=x;
kk=y/8;
jj=y%8;
//在列的第几位
tt=0x80;
tt=tt>
>
//找到相应的位置赋值
chDispRam2[x][kk]=chDispRam[x][kk]&
returnchDispRam2[x][kk];
///////////游戏开始后贪吃蛇初始行进函数/////////////////
voidMove()//蛇初始运动方向为向右
while
(1)
Set_Display(SX,++SY,1);
//蛇头向前一点
Judge_Food();
//直线运动,判断食物
Set_Display(SX,SY-SL,0);
//蛇尾灭一个点
switch(Key_Num)//检测是否向上或者向下的按键
{
caseKEY1:
//键1表示向上
Key_Num=0;
UpMove();
break;
caseKEY2:
//键2表示向下
DownMove();
default:
Key_Num=0;
}
///////////贪吃蛇向右转向函数//////////////////
voidRightMove()//向右运动
Judge_Direction();
sx=SX;
sy=SY;
sl=SL;
if(JD==1)//向上运动时
JD=0;
while
(1)//正在向右转弯
{
if(sl!
Set_Display(SX,++SY,1);
Set_Display(sx-(sl-1),sy,0);
if((foodsignal==1)&
&
(sl==2))//目的是在在转弯过程中,吃到食物,蛇长变长
{
SL=SL+1;
sl=sl-2;
}
else
sl--;
else
break;
elseif(JD==2)//向下运动时
Set_Display(sx+(sl-1),sy,0);
while
(1)//转向完毕后直线行进
///////////贪吃蛇向上转向函数///////////////
voidUpMove()
if(JD==3)//向左运动时
while
(1)//正在向上转弯
Set_Display(++SX,SY,1);
Set_Display(sx,sy-(sl-1),0);
if((foodsignal==1)&
sl--;
elseif(JD==4)//向右运动时
Judge_Wall();
Set_Display(++SX,SY,1);
Judge_Food();
Set_Display(SX-SL,SY,0);
switch(Key_Num)//检测是否向左或者向右的按键
caseKEY3:
//键3表示向左
LeftMove();
caseKEY4:
//键4表示向右
RightMove();
//////////////贪吃蛇向左转向函数//////////////////
voidLeftMove()
while
(1)//正在向左转弯
Set_Display(SX,--SY,1);
//运动时蛇头坐标再变化
if((foodsignal==1)&
Set_Display(SX,SY+SL,0);
//////////////贪吃蛇向下转向函数//////////////////
voidDownMove()
while
(1)//正在向下转弯
Set_Display(--SX,SY,1);
Set_Display(sx,sy+(sl-1),0);
/////////判断贪吃蛇行进方向函数////////////////
voidJudge_Direction()//运动方向判断,JD=1是向上,2是向下,3是向左,4是向右
uint8Test_Light();
if(chDispRam2[SX+1][SY]==0)
JD=1;
if(chDispRam2[SX-1][SY]==0)
JD=2;
if(chDispRam2[SX][SY-1]==0)
JD=3;
if(chDispRam2[SX][SY+1]==0)
JD=4;
///////////食物生成函数/////////////
voidFood()//生成食物
foodx=rand();
//控制食物在一定范围内
foodx=foodx%35;
foody=rand();
foody=foody%35;
Set_Display(foodx,foody,1);
//显示随机的到的食物
////////////游戏结束显示/////////////
voidGameOver()//游戏结束显示
LCD_clr();
w_cd(0x38,0);
display(2,2,5,"
GameOver"
);
DELAY(3000000);
////////////判断贪吃蛇是否撞墙///////////////
voidJudge_Wall()//判断蛇是否撞墙
if(SX==62||SX==1||SY==1||SY==127)
//LCD_clr();
GameOver();
/////////直线行进时,判断是否有食物//////////
voidJudge_Food()//直线运动,判断食物
foodsignal=0;
if((SX==foodx)&
(SY==foody))
Food();
++SL;
//////////转向过程中,判断是否有食物/////////////
voidJudge_Food_Turn()//转弯过程中,判断食物
foodsignal=1;
///////////////主函数//////////////////
voidmain()
uint8hanzi[64]="
贪吃蛇"
;
uint8hanzi2[64]="
ARM课程设计"
uint8hanzi3[64]="
张广申"
uint16i=0;
sint8j=0;
uint16ADCBuff,ADCTemp;
SYS_Init();
//////////////////////////////////////
initial();
Write_CH452_comd(CH452_SYSON2W);
//
Write_CH452_comd(CH452_NO_BCD);
//不译码,8个数码管
for(i=0;
i<
3;
i++)
display(2,3,3,hanzi);
DELAY(4000000);
GPBitOut(4,2,1);
/*setP4.2*/
LCD_clr();
GPBitOut(4,2,0);
display(1,2,6,hanzi2);
display(3,4,2,hanzi3);
display(4,2,6,"
S201502182"
DELAY(5000000);
init_dds();
output(1