单片机课程设计报告Word下载.docx
《单片机课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告Word下载.docx(31页珍藏版)》请在冰豆网上搜索。
本课程设计是以一款高性能的三星芯片s5pv210ah为核心,在Linux环境下生成可执行文件,通过LCD显示屏触摸操作,完成2048游戏开发。
通过本课程设计,可以体现嵌入式技术的优越性。
关键词:
嵌入式;
LCD屏;
Linux;
游戏开发;
一.总设计流程
二、设计要求及内容
(一)c语言源代码编写
经过分析,该游戏的开发主要以下分为五大部分:
1、linux文件IO
通过如下代码,我们将实现linux文件的输入与输出:
fd=open("
/dev/fb0"
O_RDWR);
if(fd==-1)
{
perror("
openfailed:
"
);
//打开失败
return-1;
}
以及在程序结束时,我们使用完该文件关闭文件代码:
close(fd);
2、bmp图片格式解析
为实现2048游戏的开发,对图片进行操作是必不可少的,通过找寻一些带数字的BMP格式的图片,将这些图片按照游戏规则显示显示在屏幕上。
如下的代码即为如何将一张BMP格式的图片显示在LCD屏幕上。
voidLCD_Draw_Bmp(intx0,inty0,char*bmpname)
{
intfd;
inti=0;
intx,y;
unsignedcharpixels[100*100*3];
fd=open(bmpname,O_RDONLY);
lseek(fd,54,SEEK_SET);
read(fd,pixels,100*100*3);
close(fd);
//Ï
Ô
Ê
¾
Í
¼
Æ
¬
for(y=0;
y<
100;
y++)
for(x=0;
x<
x++)
unsignedcharr,g,b;
intcolor;
b=pixels[i++];
g=pixels[i++];
r=pixels[i++];
color=(r<
<
16)|(g<
8)|(b);
LCD_Draw_Point(x0+x,y0+99-y,color);
}
3、触摸事件操作
触摸屏事件的操作,即游戏玩家在玩游戏时,通过手指在屏幕上进行上下左右滑动进行游戏操作,接着屏幕根据手势操作进行反应。
为实现该效果,我们在此加入了如下的代码及函数。
intGet_Finger_Move_Direction()
intfd=open("
/dev/event0"
O_RDWR);
if(fd==-1)
printf("
file\"
/dev/event0\"
openfailed"
structinput_eventev;
intresult;
intdirect;
intstartX=-1,startY=-1;
intendX,endY,deltaX,deltaY;
while
(1)
result=read(fd,&
ev,sizeof(ev));
if(result!
=sizeof(ev))
continue;
if((ev.type==EV_ABS)&
&
(ev.code==ABS_X))
if(startX==-1)
startX=ev.value;
endX=ev.value;
(ev.code==ABS_Y))
if(startY==-1)
startY=ev.value;
endY=ev.value;
(ev.code==ABS_PRESSURE)&
(ev.value==0))
deltaX=abs(endX-startX);
deltaY=abs(endY-startY);
if(deltaX>
deltaY)
if(endX>
startX)
direct=MOVE_RIGHT;
break;
else
direct=MOVE_LEFT;
if(endY>
startY)//
direct=MOVE_DOWN;
direct=MOVE_UP;
close(fd);
returndirect;
LINUX文件下会提供我们一个屏幕操作的接口,我们只需调用该接口文件,通过判断是X操作还是Y操作,通过不同的返回值,根据判断即可判断出屏幕滑动操作是往上下左右那个方向。
4、C二维数组及矩阵变换算法
该算法是本游戏的核心算法,也是2048游戏开发的难点所在,通过分析,发现我们主要是对matrix_2048[X][Y]矩阵进行变换操作,该变换操作可分为上下左右四种,为这四种操作分别写一子函数,其中向左移动时,该矩阵变换规律实现的代码如下:
voidMove_left()//向左移动操作
inti,j,k;
Zero_b();
for(i=0;
i<
4;
i++)//通过一个buffer数组实现将不为的数左移
k=0;
for(j=0;
j<
j++)
if(matrix_2048[i][j]!
=0)
buffer[i][k]=matrix_2048[i][j];
k++;
i++)
if(buffer[i][j]!
=matrix_2048[i][j])
{
Flag_Move=1;
}
if(buffer[i][j]==buffer[i][j+1]&
(j+1)<
4)
buffer[i][j]=2*buffer[i][j];
for(k=j+2;
k<
4&
buffer[i][k]!
=0;
k++)
buffer[i][k-1]=buffer[i][k];
buffer[i][k-1]=0;
matrix_2048[i][j]=buffer[i][j];
该算法的核心思想是把不为0的数先往左移,然后判断相邻的数是否相等,如果相等即前前面一个数乘以2,后面的数被依次被更以后的数所覆盖,最终实现左移操作。
5、随机函数
2048游戏的实现离不开随机函数,当玩家进行一项滑动的操作时,屏幕上需在空白随机出现“2”或者“4”的图片,但是出现前者的概率应大于后者,在这里,为实现随机函数,我们取计算机的时间为随机数的种子,通过调用sandom()函数实现,具体代码如下:
voidGet_Random()
intindex_x=0,index_y=0,index_rad;
intrad[4]={2,2,4,2};
inti,j;
intnum=0;
inttable[4][4];
index_rad=random()%4;
table[i][j]=17;
if(matrix_2048[i][j]==0)
table[i][j]=num;
num++;
num=random()%num;
if(table[i][j]==num)
matrix_2048[i][j]=rad[index_rad];
为提高取随机数的效率,我们采用了对空白格子编号的方法,通过计算出空白格子个数,再对其进行取随机编号数,可一次性得到应该在哪个空白位置出现随机出现图片。
(二)生成可执行文件生成
C语言源代码编号后,需要将该源代码生成可执行文件,我们通过在电脑上安装虚拟机软件,并在虚拟机上运行Linux操作系统,在该系统终端我们进行一些命令操作得到了可在我们的嵌入式芯片执行的文件。
生成可执行文件命令:
arm-linux-gcc<
文件名.c>
-o<
文件名>
(三)烧录
得到了可执行文件后,我们最后就是将该可执行文件烧录进入我们的芯片中执行,在此我们借用了一个名为secureCRT绿色烧录软件。
在此这里有一些该软件下进行操作的部分命令:
rz:
用串口命令下载文件到开发板上面去
chmod+x<
:
给这个文件加上可执行权限(excutable)
./<
:
运行可执行文件
以下是该软件工作时的截图:
三、结束语
通过这次的课程设计,我深刻的感受到了嵌入式技术的魅力,比起单片机,嵌入式技术有着明显的优势,从处理速度上即可明显的看出二者优异。
我很高兴能够顺利的完成此次课程设计,但是这次之所以能够顺利地完成是与老师和同学的帮助离不开的。
在刚开始时,我们组就遇到了不少的困难,老师每天讲的内容,总是有一些跟不上,多亏了老师的耐心的讲解,以及课后自己去认真专研,才逐渐消化了课上的知识,跟上了老师的脚步。
在此,我想感谢一下此次课程设计的老师和我一起学习的同学。
虽然这次课程设计结束了,但是我觉得我还是有必要继续学习下去,去更加深刻的了解什么是嵌入式技术。
四、参考文献
【1】深圳托普微科技开发有限公司.LM2028LCDModuleUserManual[EB/OL].http:
//www.topwaydisplay.corn,2O04.12-20.
【2】谢自美,电子线路设计、实验、测试,华中理工大学出版社,2003。
【3】宋春荣,通用集成电路速查手册,山东科学技术出版社,1995。
【4】ArnoldBerger,嵌入式系统设计,吕骏译,北京:
电子工业出版社,2002
五、附录
源程序:
#include<
sys/types.h>
sys/stat.h>
fcntl.h>
sys/mman.h>
stdio.h>
errno.h>
unistd.h>
#inc