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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

嵌入式系统概论综合设计报告书.docx

1、嵌入式系统概论综合设计报告书嵌入式系统概论综合设计报告书设计题目:基于嵌入式Linux点阵和键盘的贪吃蛇游戏学院:信息工程学院班级: 学号:姓名: 指导老师:中央民族大学二零一三年十二月二十七日一、 设计目的1、 学习了解Linux系统各组成部分的作用以及Linux系统LED点阵驱动和键盘驱动程序的编写;2、 熟悉基本的嵌入式开发过程,进一步掌握Linux下的C语言以及深入理解嵌入式Linux系统编程的步骤;3、 以PXA270EP实验板为基础,用C语言编写贪吃蛇游戏的应用程序实现通过控制8*8LED点阵中各灯亮暗来进行游戏操作。二、 设计内容1、 设计原理:(1)8X8 点阵数码管发光原理:

2、从图中可以看出,8X8 点阵共需要64 个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上。当对应的某一列置1 电平,某一行置0 电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如下图所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述:(图1) (图2)系统电路如上图2所示。显示部分用的是一个88 发光二极管点阵,我们常见的用于发布消息、显示汉字的点阵式LED显示屏通常由若干块LED点阵显示模块组成,88显示点阵模块,每块有64 个独立的发光二极管,为了减少引脚且便于封装,各种LED显示点阵模块都采用阵列形式排布,即在行列线的交点处接有显示LED

3、。在本开发板上,整个LED显示模块是作为一个I/O 进行控制的。如电路原理图所示,DATA0.7, DATA8.15分别对应系统数据线的低16 位,LED_LOCK 信号是由系统总线的写信号和地址信号经简单的逻辑组合而得,在板载的CPLD 内完成,控制该显示模块的I/O 地址为0x08000000。(2)目标板的键盘驱动原理:键盘的结构通常有两种形式:线性键盘和矩阵键盘。在不同的场合下,这两种键盘均得到了广泛的应用。线性键盘由若干个独立的按键组成,每个按键的一端与微机的一个I/O 口相连。有多少个键就要有多少根连线与微机的I/O 口相连,因此,只适用于按键少的场合。矩阵键盘的按键按N 行M 列

4、排列,每个按键占据行列的一个交点,需要的I/O 口数目是N+M,容许的最大按键数是NM。显然,矩阵键盘可以减少与微机接口的连线数、简化结构,是一般微机常用的键盘结构。根据矩阵键盘的识键和译键方法的不同,矩阵键盘又可以分为非编码键盘和编码键盘两种。非编码键盘:非编码键盘主要用软件的方法识键和译键。根据扫描方法的不同,可以分为行扫描法、列扫描法和反转法三种。编码键盘:编码键盘主要用硬件来实现键的扫描和识别,通常使用8279 专用接口芯片,在硬件上要求较高。 PXA270EP采用的是46 的矩阵键盘。其原理图如图3:(图3)键盘扫描程序的流程图如图4:(图4)(图5)(图6)如图5为键盘的真实布线图

5、,如图6只是将线拉直,以便您更好的理解程序扫描所代表的含义,我们说,若要让程序确定您所按下的键是哪个,分别是要在扫描四列四行后,然后再通过扫描所得数据来判断具体是哪个键。程序是先扫描第0 列,依次第1 列,第2 列,第3 列。在扫描第0 列的过程中,再先后扫描第0 行,第1 行,第2 行,第3 行,第4 行,第5 行。若在扫描完第0 列后,没有扫描到任何键按下。则再扫描第1 列,在这过程中,再先后扫描第0 行,第1 行,第2 行,第3 行,第4 行,第5 行。若在扫描完第1 列后,没有扫描到任何键按下。则再扫描第2 列,在这过程中,再先后扫描第0 行,第1 行,第2 行,第3 行,第4 行,第

6、5 行。若在扫描完第2 列后,没有扫描到任何键按下。则再扫描第3 列,在这过程中,再先后扫描第0 行,第1 行,第2 行,第3 行,第4 行,第5 行。在扫描过程中,只要在符合某种条件下,则会停止后续列的扫描操作,而退出程序。通过上面二维表191 判断,将定您现在按下数字9 键,则此时对应In1 位为0,且Out2位为0。若您按下数字2 键,则此时对应的In2 位为0,且Out4 位为0。其它按键的判断结果是以相同的方法判断。In3,In2,In1,In0 的值是通过outbyte = 值,outb(outbyte,ioremap_addr)来指定值。Out5,Out4,Out3,Out2,O

7、ut1,Out0 的值是通过函数inbyte=inb(ioremap_addr)来获取。例如:outbyte = 0xfe;outb(outbyte,ioremap_addr);则:。In3 In2 In1 In01 1 1 1 1 1 1 0此时:通过inbyte=inb(ioremap_addr)获取值,若读出的值为inbyte = 0xef,则:。Out5 Out4 Out3 Out2 Out1 Out01 1 1 0 1 1 1 1很显然,这时有In0 = 0,Out4 = 0,所以查表,此时,系统判断应该是Enter 键被按下。2、 设计过程:根据对贪吃蛇游戏结构和步骤的分析设计出相

8、应的贪吃蛇流程,设计在目标板上的8*8LED点阵上显示贪吃蛇游戏的主要过程包括:(1)游戏开始(有3、2、1倒计时的显示);(2)随机出现食物,定点出现初始贪吃蛇;(3)贪吃蛇移动;(4)贪吃蛇吃食物;(5)暂停游戏;(6)恢复游戏;(7)贪吃蛇碰边界游戏结束重新开始;(8)数码管显示分数。三、 设计方案1、 贪吃蛇游戏源程序如下:#include #include #include /#include /开线程#include / open() close()#include / read() write()#define DEVICE_NAME /dev/led_ary_ctl#inclu

9、de #define DEVICE_NAME1 /dev/keypad#define DEVICE_NAME_SERIAL_LED /dev/serial_ledunsigned short po8=1,2,4,8,16,32,64,128;/pthread_t tid;int fd_led,fd_key;int score;unsigned short out64;/表示8*8点阵short getx(short z) return z%8;short getz(short x,short y) return x+(y3);/x+y*8unsigned short ck;/ck置为3时,暂停

10、游戏;如果蛇正常的移动了一步,它的值置为0;若蛇死了,它的值置为1;若蛇吃了某个食物,它的值置为2unsigned short fx;/行进方向 0 1 2 3 上下左右unsigned short fod;/foodshort scd;/蛇长度typedef struct sn short wzz;/位置z坐标 struct sn *nxt;/下一个位置Snk;Snk *stz;/蛇头坐标int getrandom(int max)/取得在0,max的随机整数 int num=-1; int ran; while(num0) num=rand(); ran=num%(max+1);/取余得随

11、机数法 return ran;/ 0 1void ledouta(short x,short y)/x表示行号 y表示该行亮的灯的编码,例子:x=0 y=3 则第一行第0,1个亮,x-0,7,y0-255 /int fd; /int ret; unsigned char buf2; buf0=(y); buf1=(1x); return;void ledout() short i,j;short lia; for(i=0;i8;i+) lia=0; for(j=0;j=10) data0=0x00; ret=write(fd,data,1); ret=write(fd,data,1); dat

12、a0 = bufcount/10; ret=write(fd,data,1); data0 = bufcount%10; ret=write(fd,data,1); else if(count 0) data0=0x00; ret=write(fd,data,1); ret=write(fd,data,1); printf(=); data0 = 0x40; ret=write(fd,data,1); data0 = buf0-count; ret=write(fd,data,1); else data0=0x00; ret=write(fd,data,1); ret=write(fd,dat

13、a,1); ret=write(fd,data,1); data0 = bufcount; ret=write(fd,data,1); ret = close(fd);void in_it()/初始化全局变量 short i; for(i=0;inxt=NULL; stz-wzz=0;void loadsnk()/per显示蛇 Snk *tmp; tmp=stz; while(tmp-nxt!=NULL) outtmp-wzz=1; tmp=tmp-nxt; void newfood()/per显示食物,也可以理解为产生食物 short ran; ran=46;/ while(1) if(ou

14、tran!=1) outran=1; fod=ran; return; else ran=getrandom(63); void dspl()/display loadsnk();void initGame()/初始化游戏 in_it(); score=0; fx=3; scd=3; stz-wzz=getz(2,5);/初始化蛇头位置; stz-nxt=(Snk *)malloc(sizeof(Snk); stz-nxt-wzz=getz(1,5); stz-nxt-nxt=(Snk *)malloc(sizeof(Snk); stz-nxt-nxt-wzz=getz(0,5); stz-n

15、xt-nxt-nxt=NULL; loadsnk(); newfood(); serialled(score);void erro() printf(-ERROR-n); ck=0;void eat() printf(-EATFOOD-n); scd+; newfood(); score+; serialled(score);void die() printf(-GAMEOVER-n); ck=0; Snk *tmp; tmp=stz; stz=stz-nxt; while(stz-nxt!=NULL) free(tmp); tmp=stz; stz=stz-nxt; free(tmp); f

16、ree(stz);short move() /正常返回0,死了返回1,吃了返回2 Snk *nst,*tmp; nst=(Snk *)malloc(sizeof(Snk); nst-nxt=stz; switch(fx)/方向 case 0: nst-wzz=stz-wzz-8; if(nst-wzzwzz=stz-wzz+8;if(nst-wzz63)die();return 1;break; case 2:nst-wzz=stz-wzz-1;if(nst-wzz)%8=7|nst-wzzwzz=stz-wzz+1;if(nst-wzz)%8=0)die();return 1;break;

17、default:erro(); stz=nst; if(stz-wzz=fod)/吃了 eat(); return 2; else if(outstz-wzz=1)/吃了自己 die(); return 1; nst=stz-nxt; tmp=stz; while(nst-nxt!=NULL) tmp=nst; nst=nst-nxt; outtmp-nxt-wzz=0; free(tmp-nxt); tmp-nxt=NULL; return 0;void to_up() fx=0;void to_down() fx=1;void to_lift() fx=2;void to_right()

18、fx=3;void reset() initGame();void ds3()/显示3 out0=0; out1=1; out2=1; out3=1; out4=1; out5=1; out6=1; out7=0; out8=0; out9=0;out10=0;out11=0;out12=0;out13=0;out14=1;out15=0; out16=0;out17=0;out18=0;out19=0;out20=0;out21=0;out22=1;out23=0; out24=0;out25=1;out26=1;out27=1;out28=1;out29=1;out30=1;out31=0

19、; out32=0;out33=0;out34=0;out35=0;out36=0;out37=0;out38=1;out39=0; out40=0;out41=0;out42=0;out43=0;out44=0;out45=0;out46=1;out47=0; out48=0;out49=0;out50=0;out51=0;out52=0;out53=0;out54=1;out55=0; out56=0;out57=1;out58=1;out59=1;out60=1;out61=1;out62=1;out63=0;void ds2() out0=0; out1=1; out2=1; out3

20、=1; out4=1; out5=1; out6=1; out7=0; out8=0; out9=0;out10=0;out11=0;out12=0;out13=0;out14=1;out15=0; out16=0;out17=0;out18=0;out19=0;out20=0;out21=0;out22=1;out23=0; out24=0;out25=1;out26=1;out27=1;out28=1;out29=1;out30=1;out31=0; out32=0;out33=1;out34=0;out35=0;out36=0;out37=0;out38=0;out39=0; out40

21、=0;out41=1;out42=0;out43=0;out44=0;out45=0;out46=0;out47=0; out48=0;out49=1;out50=0;out51=0;out52=0;out53=0;out54=0;out55=0; out56=0;out57=1;out58=1;out59=1;out60=1;out61=1;out62=1;out63=0;void ds1() out0=0; out1=0; out2=0; out3=0; out4=1; out5=0; out6=0; out7=0; out8=0; out9=0;out10=0;out11=1;out12

22、=1;out13=0;out14=0;out15=0; out16=0;out17=0;out18=0;out19=0;out20=1;out21=0;out22=0;out23=0; out24=0;out25=0;out26=0;out27=0;out28=1;out29=0;out30=0;out31=0; out32=0;out33=0;out34=0;out35=0;out36=1;out37=0;out38=0;out39=0; out40=0;out41=0;out42=0;out43=0;out44=1;out45=0;out46=0;out47=0; out48=0;out4

23、9=0;out50=0;out51=0;out52=1;out53=0;out54=0;out55=0; out56=0;out57=0;out58=0;out59=1;out60=1;out61=1;out62=0;out63=0;void repat_dis(int times) int i; for (i=0;itimes;i+) ledout();void display_321() ds3(); repat_dis(10); ds2(); repat_dis(10); ds1(); repat_dis(10);void pause1() ck=3;void resume1() ck=

24、0;int main(void) int i=4; int ret_led,ret_key; unsigned char buf2 ; double x; char pre_scancode = 0xff; /fd = open(DEVICE_NAME1, O_RDWR); fd_led=open(DEVICE_NAME, O_RDWR); fd_key=open(DEVICE_NAME1, O_RDWR); if (fd_key = -1) printf(open device %s errorn,DEVICE_NAME1); else if(fd_led=-1) printf(open d

25、evice %s errorn,DEVICE_NAME); else buf0=0x22; reset(); dspl(); ledout(); while (1) if(ck=0|ck=2) if(i=4) i=0; ck=move(); i+; /usleep(100000); read (fd_key,buf,1); if(buf0!= pre_scancode) if(buf0!=0xff) switch(buf0) case 0x08:to_up();break; case 0x04:to_lift();break; case 0x05:to_down();break; case 0x06:to_right();break

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1