您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 嵌入式实验报告触摸屏驱动实验
武汉大学计算机学院嵌入式系统设计实验报告题目:触摸屏驱动实验成员:一、实验题目在现有ARM平台上实现触摸屏功能。编制触摸屏驱动,设计一个简单的俄罗斯方块的小游戏,通过触摸屏点击触发按钮动作进行游戏。二、实验目的综合运用ARM平台,掌握驱动程序设计方法,了解触摸屏工作原理。三、实验原理(一)、方块和背景的表示:在俄罗斯方块中共有7种方块,它们都由四个小方块组成,因此我们采用4*4的01数组表示。这7种方块的图形以及对应的矩阵表示如下:1、00001111000000002、00001110001000003、00000111010000004、00000110001100005、00000110110000006、00000111001000007、0000011001100000俄罗斯方块的背景为一个无盖的杯子,我们用一个20个短整型一维数组表示,其中数的低12位每位表示是否有方块,1为有方块,0表示没有。初始时矩阵及其表示的图形如下,其中图中空白区域为活动区域:【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】【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】【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】【1】【1】【1】【1】【1】【1】【1】【1】【1】【1】【1】最后用两个整型变量(x,y)表示方块对应在背景中的位置。其中(x,y)表示方块对应4*4矩阵的左上角小方块据背景左上角的横纵格子数个数,初始值为(3,0)。(二)方块的变形。方块的变形是用旋转的形式:将表示方块的4*4矩阵绕着矩阵的中心顺时针旋转90度,用得到的新矩阵表示变形后的方块。过程如下图依此类推…..(三)变形和下降、左右移动的可行性判断。将变形或者下降、左右移动后的方块映射到背景矩阵的相应位置,如果在背景上的对应位置不为空(即为1),那么变形或者下降、左右移动不可执行。如果是方块触底了,则将方块矩阵映射到背景矩阵相应位置,使其变为背景的一部分。(四)消行。当某一行全部被方块占满(即背景矩阵的该行对应的无符号短整型数前12位全为1),则删除该行,并将该行以上的所有行下降一行。(五)到顶。当方块堆满,即方块堆到背景矩阵的活动区域最上面一行,则游戏结束。四、实验代码#includestdio.h#includefcntl.h#includestdlib.h#includeerrno.h#includesys/mman.h#includelinux/fb.h#includesignal.h#includetermios.h#includestring.h#includesys/types.h#includesys/stat.h#includesys/time.h#includeunistd.h#includesys/ioctl.h#includeunistd.h#includetime.h#includegetopt.h#includelinux/rtc.h#defineFBDEV/dev/fb/0#defineORANGE0xfb00#defineBLUE0x00ff#defineWHITE0xffffstaticchar*default_frameArraybuffer=FBDEV;typedefstruct{unsignedshortpressure;unsignedshortx;unsignedshorty;unsignedshortpad;}TS_EVENT;/*方块*/typedefstruct{intx;inty;intcolor;}block;structfb_dev{intfb;void*fb_mem;intfb_width,fb_height,fb_line_len,fb_size;intfb_bpp;};staticstructfb_devfbdev;unsignedshortframeArray[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};blockO_up,O_down,O_left,O_right;typedefstruct{unsignedshortfr[25];}frame;typedefstruct{unsignedshortx;unsignedshorty;}location;typedefstruct{unsignedshorta[4][4];}Shape;framefra,fullFrame;locationlo;//当前坐标ShapeshapeMove,nextShape,sh[7]={{{{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},{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}}}};voidinit()//产生随机shapeMove{Shapetemp;inti;shapeMove=nextShape;srand(time(NULL));i=rand()%7;nextShape=sh[6-i];lo.x=4;lo.y=0;}voidinitial(){inti;//fra.fr[0]=fra.fr[1]=fra.fr[2]=0;srand(time(NULL));i=rand()%7;nextShape=shapeMove=sh[i];for(i=0;i24;i++){fra.fr[i]=1+(111);}fra.fr[24]=(112)-1;fullFrame=fra;init();}unsignedshortchange(unsignedshortf,unsignedshortx,unsignedshortj){return!!(f&(1(11-x-j)));}voidjudge(Shapesha)//返回1,表示可变换.可,即变换{unsignedshorti,j;for(i=0;i4;i++){for(j=0;j4;j++){if(change(fra.fr[lo.y+i],lo.x,j)&&sha.a[i][j]){return;}}}shapeMove=sha;}voidtransform()//变换形态,也是up(){Shapetemp;inti,j;for(i=0;i4;i++){for(j=0;j4;j++){temp.a[j][3-i]=shapeMove.a[i][j];}}judge(temp);}intbeEnd()//返回1到底{unsignedshorti,j,end;//printf(beEnd()\n);for(i=0;i4;i++){for(j=0;j4;j++){end=change(fra.fr[lo.y+i+1],lo.x,j);if(shapeMove.a[i][j]&end==1)return1;}}return0;}intbeLeft()//返回1到左边{unsignedshorti,j,ledge;for(i=0;i4;i++){for(j=0;j4;j++){ledge=change(fra.fr[lo.y+i],lo.x,j-1)&shapeMove.a[i][j];if(ledge==1)return1;}}return0;}intbeRight()//返回1到右边{unsignedshorti,j,redge;for(i=0;i4;i++){for(j=0;j4;j++){redge=change(fra.fr[lo.y+i],lo.x,j+1)&shapeMove.a[i][j];if(redge==1)return1;}}return0;}voidleft(){if(!beLeft())lo.x--;}voidright(){if(!beRight())lo.x++;}voidcombine(){unsignedshorti,j;//printf(combine()\n);for(i=0;i4;i++){for(j=0;j4;j++){if(shapeMove.a[i][j])fra.fr[lo.y+i]+=(shapeMove.a[i][j](11-lo.x-j));}}}voiddown(){//printf(down()\n);if(!beEnd()){lo.y++;}else{if(lo.y=2)exit(1);combine();init();}}voidview()//生成显示数组{unsignedshorti,j;//printf(view()\n);fullFrame=fra;for(i=0;i4;i++){for(j=0;j4;j++){if(shapeMove.a[i][j]){fullFrame.fr[lo.y+i]+=(shapeMove.a[i][j](11-lo.x-j));}}}for(i=4;i24;i++){frameArray[i-4]=fullFrame.fr[i]/2;}//printf(%u\n,frameArray[1]);}unsignedgetBit(unsignedshortf,intbit){inti=0;unsignedshortt=1;while(ibit){t*=2;i++;}return!!(t&f);}voiddelrow(){inti,j,k;//printf(deldrow()\n);for(i=23;i5;i--){for(j=1;j11;j++)if(getBit(fra.fr[i],j)==0)break;if(j==11){for(k=i;k0;k--)fra.fr[k]=fra.fr[k-1];fra.fr[0]=(111)+1;i++;}}fullFrame=fra;//printf(de
本文标题:嵌入式实验报告触摸屏驱动实验
链接地址:https://www.777doc.com/doc-8023663 .html