嵌入式实验报告触摸屏驱动实验(共19页).doc

上传人:飞****2 文档编号:5506211 上传时间:2022-01-09 格式:DOC 页数:19 大小:709KB
返回 下载 相关 举报
嵌入式实验报告触摸屏驱动实验(共19页).doc_第1页
第1页 / 共19页
嵌入式实验报告触摸屏驱动实验(共19页).doc_第2页
第2页 / 共19页
点击查看更多>>
资源描述

《嵌入式实验报告触摸屏驱动实验(共19页).doc》由会员分享,可在线阅读,更多相关《嵌入式实验报告触摸屏驱动实验(共19页).doc(19页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精选优质文档-倾情为你奉上 武汉大学计算机学院嵌入式系统设计实验报告题目: 触摸屏驱动实验 成员:一、实验题目在现有ARM平台上实现触摸屏功能。编制触摸屏驱动,设计一个简单的俄罗斯方块的小游戏,通过触摸屏点击触发按钮动作进行游戏。二、实验目的综合运用ARM平台,掌握驱动程序设计方法,了解触摸屏工作原理。三、实验原理(一) 、方块和背景的表示: 在俄罗斯方块中共有7种方块,它们都由四个小方块组成,因此我们采用4*4的01数组表示。这7种方块的图形以及对应的矩阵表示如下:1、 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 2、 0 0 0 0 1 1 1 0 0 0 1 0 0

2、0 0 03、 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 04、 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 05、 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 06、 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 07、 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 俄罗斯方块的背景为一个无盖的杯子,我们用一个20个短整型一维数组表示,其中数的低12位每位表示是否有方块,1为有方块,0表示没有。初始时矩阵及其表示的图形如下,其中图中空白区域为活动区域: 【1】【0】【0】【0】【0】【0】【0】【0】【0】【0

3、】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0

4、】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0

5、】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【1】【1】【1】【1】【1】【1】【1】【1】【1】【1】【1】【1】 最后用两个整型变量(x,y)表示方块对应在背景中的位置。其中(x,y)表示方块对应4*4矩阵的左上角小方块据背景左上角的横纵格子数个数,初始值为(3,0)。(二) 方块的变形。方块的变形是用旋转的形式:将表示方块的4*4矩阵绕着矩阵的中心顺时针旋转90度,用得到的新矩阵表示变形后的方块。过程如下图 依此类推.(三) 变形和下降、左右移动的可行

6、性判断。将变形或者下降、左右移动后的方块映射到背景矩阵的相应位置,如果在背景上的对应位置不为空(即为1),那么变形或者下降、左右移动不可执行。如果是方块触底了,则将方块矩阵映射到背景矩阵相应位置,使其变为背景的一部分。(四) 消行。当某一行全部被方块占满(即背景矩阵的该行对应的无符号短整型数前12位全为1),则删除该行,并将该行以上的所有行下降一行。(五) 到顶。当方块堆满,即方块堆到背景矩阵的活动区域最上面一行,则游戏结束。四、实验代码#include#include#include#include#include#include#include #include #include #inc

7、lude #include #include #include #include #include #include #include #include #define FBDEV /dev/fb/0#define ORANGE 0xfb00#define BLUE 0x00ff#define WHITE 0xffffstatic char * default_frameArraybuffer=FBDEV;typedef structunsigned short pressure;unsigned short x;unsigned short y;unsigned short pad;TS_E

8、VENT;/* 方块*/typedef structint x;int y;int color;block;struct fb_dev int fb; void *fb_mem; int fb_width,fb_height,fb_line_len,fb_size; int fb_bpp;static struct fb_dev fbdev;unsigned short frameArray20=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;block O_up,O_down,O_left,O_right;typedef struct unsigned sho

9、rt fr25;frame;typedef struct unsigned short x;unsigned short y;location;typedef struct unsigned short a44;Shape; frame fra,fullFrame;location lo;/当前坐标 Shape shapeMove,nextShape,sh7=0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0

10、,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0;void init()/产生随机shapeMoveShape temp; int i;shapeMove=nextShape;srand(time(NULL);i=rand()%7;nextShape=sh6-i;lo.x=4;lo.y=0;void initial() int i;/fra.fr0=fra.fr1=fra.fr2=0;srand(time(NULL);i=rand()%

11、7;nextShape=shapeMove=shi;for (i=0;i24;i+)fra.fri=1+(111);fra.fr24=(112)-1;fullFrame=fra;init();unsigned short change(unsigned short f,unsigned short x,unsigned short j)return !(f&(1(11-x-j);void judge(Shape sha)/返回1,表示可变换 .可,即变换 unsigned short i,j;for (i=0;i4;i+)for (j=0;j4;j+)if(change(fra.frlo.y+

12、i,lo.x,j)&sha.aij)return;shapeMove=sha; void transform()/变换形态,也是up() Shape temp;int i,j;for (i=0;i4;i+)for (j=0;j4;j+)temp.aj3-i=shapeMove.aij;judge(temp); int beEnd()/返回1 到底 unsigned short i,j,end; /printf(beEnd()n); for (i=0;i4;i+) for (j=0;j4;j+) end=change(fra.frlo.y+i+1,lo.x,j); if(shapeMove.ai

13、j&end=1) return 1; return 0; int beLeft()/返回1 到左边 unsigned short i,j,ledge; for (i=0;i4;i+) for (j=0;j4;j+) ledge=change(fra.frlo.y+i,lo.x,j-1)&shapeMove.aij; if(ledge=1) return 1; return 0; int beRight()/返回1 到右边 unsigned short i,j,redge; for (i=0;i4;i+) for (j=0;j4;j+) redge=change(fra.frlo.y+i,lo.

14、x,j+1)&shapeMove.aij; if(redge=1) return 1; return 0; void left() if (!beLeft() lo.x-; void right() if (!beRight() lo.x+; void combine() unsigned short i,j;/printf(combine()n); for (i=0;i4;i+) for (j=0;j4;j+) if (shapeMove.aij) fra.frlo.y+i+=(shapeMove.aij(11-lo.x-j); void down() /printf(down()n); i

15、f(!beEnd() lo.y+; elseif (lo.y=2)exit(1);combine();init(); void view()/生成显示数组 unsigned short i,j;/printf(view()n);fullFrame=fra; for (i=0;i4;i+) for (j=0;j4;j+) if (shapeMove.aij) fullFrame.frlo.y+i+=(shapeMove.aij(11-lo.x-j); for (i=4;i24;i+)frameArrayi-4 = fullFrame.fri/2;/printf(%un,frameArray1);

16、unsigned getBit(unsigned short f,int bit)int i=0;unsigned short t=1;while(i5;i-)for(j=1;j0;k-)fra.frk = fra.frk-1;fra.fr0 = (111)+1;i+;fullFrame=fra;/printf(deldrowEnd()n);for (i=4;i24;i+)frameArrayi-4 = fullFrame.fri/2;void drawNext() int i,j,m,k; unsigned short int *p=(unsigned short int *)fbdev.f

17、b_mem; for(i=0;i=50&i55)for(j=470;j=55)for(k=470;k475;k+)pk=WHITE;for(k=577;k582;k+)pk=WHITE; for(i=0;i4;i+) for(m=0;m20;m+,p+=fbdev.fb_line_len/2) for(j=0;j4;j+)if(nextShape.aij = 1)for(k=0;k20;k+)pj*24+k+480=ORANGE;for(k=470;k475;k+)pk=WHITE;for(k=577;k582;k+)pk=WHITE; for(m;m24;m+,p+=fbdev.fb_lin

18、e_len/2)for(k=470;k475;k+)pk=WHITE;for(k=577;k582;k+)pk=WHITE; for(i=0;i=5)for(j=470;j582;j+)pj = WHITE;elsefor(k=470;k475;k+)pk=WHITE;for(k=577;k582;k+)pk=WHITE;void drawOperate(block a) int i,j; unsigned short int *p=(unsigned short int *)fbdev.fb_mem; for(i=0;ia.y;i+,p+=fbdev.fb_line_len/2); for(

19、i=a.y;ia.y+60;i+,p+=fbdev.fb_line_len/2) for(j=a.x;ja.x+60;j+) pj=a.color; void drawEdge() int i,j; unsigned short int *p=(unsigned short int *)fbdev.fb_mem; for(i=0;ifbdev.fb_height;i+,p+=fbdev.fb_line_len/2) for(j=110;j115;j+) pj=WHITE; for(j=360;j365;j+) pj=WHITE; void drawBlock() int i,j,m,k; un

20、signed short int *p=(unsigned short int *)fbdev.fb_mem; for(i=0;i20;i+,p+=fbdev.fb_line_len/2) for(m=0;m20;m+,p+=fbdev.fb_line_len/2) for(j=0;j10;j+)/if(m = 0)/printf(%u ,getBit(frameArrayi,9-j);if(getBit(frameArrayi,9-j) = 1)for(k=0;k20;k+)pj*24+k+120=ORANGE; /printf(n);for(m;m23;m+,p+=fbdev.fb_lin

21、e_len/2); drawEdge(); drawOperate(O_up); drawOperate(O_down); drawOperate(O_left); drawOperate(O_right);drawNext();void func() /捕捉到定时器产生的SIGALARM信号时的操作,/printf(func()n); down(); view(); delrow(); view();frameArraybuffer_open();drawBlock();/signal(SIGALRM,func);int frameArraybuffer_open(void)int fb;s

22、truct fb_var_screeninfo fb_vinfo;struct fb_fix_screeninfo fb_finfo;char * fb_dev_name;if(!(fb_dev_name=getenv(frameArrayBUFFER)fb_dev_name=default_frameArraybuffer;fb=open(fb_dev_name,O_RDWR);/打开frameArraybuffer缓存if(fb0)printf(device %s open failedn,fb_dev_name);return -1;if(ioctl(fb,FBIOGET_VSCREEN

23、INFO,&fb_vinfo)/获取与frameArraybuffer有关的可变信息printf(Cant get VSCREENINFO:%sn,strerror(errno);close(fb);return -1;if (ioctl(fb,FBIOGET_FSCREENINFO,&fb_finfo)/获取与frameArraybuffer有关的固定信息 printf(Cant get FSCREENINFO:%sn,strerror(errno); return 1;fbdev.fb_bpp = fb_vinfo.red.length + fb_vinfo.green.length +

24、fb_vinfo.blue.length + fb_vinfo.transp.length;fbdev.fb_width = fb_vinfo.xres;fbdev.fb_height = fb_vinfo.yres;fbdev.fb_line_len = fb_finfo.line_length;fbdev.fb_size = fb_finfo.smem_len;/映射区大小/printf(frameArray buffer : %d(%d)x%d,%dbpp 0x%xbyten,fbdev.fb_width,fbdev.fb_line_len,fbdev.fb_height,fbdev.f

25、b_bpp,fbdev.fb_size);if (fbdev.fb_bpp != 16) printf(frameArray buffer must be 16bpp moden);exit(0);fbdev.fb_mem = mmap(NULL, fbdev.fb_size, PROT_READ|PROT_WRITE, MAP_SHARED, fb, 0);/建立文件到内存的映射if (fbdev.fb_mem = NULL | (int) fbdev.fb_mem = -1)fbdev.fb_mem = NULL;printf(mmap failedn);close(fb);return

26、-1;fbdev.fb = fb;memset(fbdev.fb_mem, 0x0, fbdev.fb_size);return 0;void frameArraybuffer_close()if (fbdev.fb_mem)munmap(fbdev.fb_mem, fbdev.fb_size);/删除映射fbdev.fb_mem = NULL;if (fbdev.fb)close(fbdev.fb);fbdev.fb = 0; void set_non_blocking(int sd)/设置非阻塞 int opts; opts = fcntl(sd, F_GETFL); if(opts 0)

27、 exit(0); opts = opts | O_NONBLOCK; if(fcntl(sd, F_SETFL, opts) 0) exit(0);int main(void) int i,fd,temp,num=0,flag=0; static int ts = -1; static TS_EVENT ts_event;struct itimerval value;value.it_value.tv_sec=1;value.it_value.tv_usec=0;value.it_interval.tv_sec=1;value.it_interval.tv_usec=0;setitimer(

28、ITIMER_REAL,&value,NULL);signal(SIGALRM,func); O_up.x = 500; O_up.y = 300; O_up.color = ORANGE; O_down.x = 500; O_down.y = 375; O_down.color = ORANGE; O_left.x = 425; O_left.y = 375; O_left.color = ORANGE; O_right.x = 575; O_right.y = 375; O_right.color = ORANGE; ts=open(/dev/touchscreen/0raw,O_RDON

29、LY);/打开触摸屏 if(ts0&flag = 0) / printf(up.color:x:%d,y:%dn,ts_event.x,ts_event.y); if (ts_event.x 3115 & ts_event.y 2785 & ts_event.y 1100) /up transform(); view(); else if (ts_event.x 3115 & ts_event.y 2785 & ts_event.y 600) /down down(); view(); delrow(); view(); else if (ts_event.x 2770 & ts_event.

30、y 2440 & ts_event.y 600) /left left(); view(); else if (ts_event.x 3460 & ts_event.y 3130 & ts_event.y 600) /right right(); view(); flag = 1;frameArraybuffer_open(); drawBlock(); if(ts_event.pressure = 0)flag = 0;/sleep(1);/func();/frameArraybuffer_open(); / drawBlock(); frameArraybuffer_close(); re

31、turn 0;五、实验流程运行make产生可执行文件;打开minicom终端,挂载触摸屏驱动,进入目录,运行程序;运行截图如下: 六、实验问题及解决办法1、触摸屏驱动编译加载问题。刚开始的时候我们找到了驱动程序,尝试着编译加载,可是当我们用insmod加载编译好的模块后,并启动触摸品,触摸屏并没有反应,后来发现机子中自带有触摸屏驱动,就利用该模块进行测试,触摸屏驱动加载正常,开始利用该模块coding2、触摸屏按压时间与读取时间问题。在编程的过程中,我们想通过点击触摸屏的次数来控制流程,但是发现,当我们按压一次时,整个循环却执行了很多次,也就是触摸屏电压的读取时间是非常短的,不能用这个来控制流

32、程,我们采取的解决办法是从有压力一直到压力消失判定为一次按压。七、实验小结通过这次实验,对嵌入式的了解不仅仅限于在课堂上所学到的,对嵌入式有了深层次的认识,同时也再一次复习了使用前嵌入式实验台开发的步骤。通过这一次的课程设计,我们学会了更加努力地专研和思考问题,同时理论和动手实践相结合,更能加深对理论知识的理解和思考,将其转化为自己所能理解的东西,这样能使自己留下更深刻的印象。同时自己动手编写的小游戏,也让我们体会到软件开发的乐趣,也更加清楚地认识到了自己在软件开发及学习上的一些不足之处。最重要的是我们学习到了团队的合作,作为软件开发人员,团队合作是很重要的,我们在做实验中遇到了很多问题,可是通过我们分块讨论问题,解决问题,培养了团队合作的意识,受益匪浅。专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 教育教学

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com