




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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
2、1 0 0 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
3、】【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
4、】【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
5、】【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度,用得到的新矩阵表示变形后的方块。过程如下图 依此类推
6、.(三) 变形和下降、左右移动的可行性判断。将变形或者下降、左右移动后的方块映射到背景矩阵的相应位置,如果在背景上的对应位置不为空(即为1),那么变形或者下降、左右移动不可执行。如果是方块触底了,则将方块矩阵映射到背景矩阵相应位置,使其变为背景的一部分。(四) 消行。当某一行全部被方块占满(即背景矩阵的该行对应的无符号短整型数前12位全为1),则删除该行,并将该行以上的所有行下降一行。(五) 到顶。当方块堆满,即方块堆到背景矩阵的活动区域最上面一行,则游戏结束。四、实验代码#include<stdio.h>#include<fcntl.h>#include<std
7、lib.h>#include<errno.h>#include<sys/mman.h>#include<linux/fb.h>#include <signal.h>#include <termios.h>#include <string.h> #include <sys/types.h> #include <sys/stat.h>#include <sys/time.h> #include <unistd.h> #include <sys/ioctl.h>
8、#include <unistd.h> #include <time.h> #include <getopt.h> #include <linux/rtc.h> #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;
9、unsigned short y;unsigned short pad;TS_EVENT;/* 方块*/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_
10、left,O_right;typedef struct unsigned short 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
11、,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;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.
12、fr1=fra.fr2=0;srand(time(NULL);i=rand()%7;nextShape=shapeMove=shi;for (i=0;i<24;i+)fra.fri=1+(1<<11);fra.fr24=(1<<12)-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,表示可变换 .可,即变
13、换 unsigned short i,j;for (i=0;i<4;i+)for (j=0;j<4;j+)if(change(fra.frlo.y+i,lo.x,j)&&sha.aij)return;shapeMove=sha; void transform()/变换形态,也是up() Shape temp;int i,j;for (i=0;i<4;i+)for (j=0;j<4;j+)temp.aj3-i=shapeMove.aij;judge(temp); int beEnd()/返回1 到底 unsigned short i,j,end; /pri
14、ntf("beEnd()n"); for (i=0;i<4;i+) for (j=0;j<4;j+) end=change(fra.frlo.y+i+1,lo.x,j); if(shapeMove.aij&end=1) return 1; return 0; int beLeft()/返回1 到左边 unsigned short i,j,ledge; for (i=0;i<4;i+) for (j=0;j<4;j+) ledge=change(fra.frlo.y+i,lo.x,j-1)&shapeMove.aij; if(ledge
15、=1) return 1; return 0; int beRight()/返回1 到右边 unsigned short i,j,redge; for (i=0;i<4;i+) for (j=0;j<4;j+) redge=change(fra.frlo.y+i,lo.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
16、;/printf("combine()n"); for (i=0;i<4;i+) for (j=0;j<4;j+) if (shapeMove.aij) fra.frlo.y+i+=(shapeMove.aij<<(11-lo.x-j); void down() /printf("down()n"); if(!beEnd() lo.y+; elseif (lo.y<=2)exit(1);combine();init(); void view()/生成显示数组 unsigned short i,j;/printf("
17、view()n");fullFrame=fra; for (i=0;i<4;i+) for (j=0;j<4;j+) if (shapeMove.aij) fullFrame.frlo.y+i+=(shapeMove.aij<<(11-lo.x-j); for (i=4;i<24;i+)frameArrayi-4 = fullFrame.fri/2;/printf("%un",frameArray1);unsigned getBit(unsigned short f,int bit)int i=0;unsigned short t=1
18、;while(i<bit)t*=2;i+;return !(t&f); void delrow()int i,j,k;/printf("deldrow()n");for(i=23;i>5;i-)for(j=1;j<11;j+)if(getBit(fra.fri,j)=0)break;if(j = 11)for(k=i;k>0;k-)fra.frk = fra.frk-1;fra.fr0 = (1<<11)+1;i+;fullFrame=fra;/printf("deldrowEnd()n");for (i=4;
19、i<24;i+)frameArrayi-4 = fullFrame.fri/2;void drawNext() int i,j,m,k; unsigned short int *p=(unsigned short int *)fbdev.fb_mem; for(i=0;i<60;i+,p+=fbdev.fb_line_len/2)if(i>=50&&i<55)for(j=470;j<582;j+)pj = WHITE;if(i>=55)for(k=470;k<475;k+)pk=WHITE;for(k=577;k<582;k+)p
20、k=WHITE; for(i=0;i<4;i+) for(m=0;m<20;m+,p+=fbdev.fb_line_len/2) for(j=0;j<4;j+)if(nextShape.aij = 1)for(k=0;k<20;k+)pj*24+k+480=ORANGE;for(k=470;k<475;k+)pk=WHITE;for(k=577;k<582;k+)pk=WHITE; for(m;m<24;m+,p+=fbdev.fb_line_len/2)for(k=470;k<475;k+)pk=WHITE;for(k=577;k<582
21、;k+)pk=WHITE; for(i=0;i<10;i+,p+=fbdev.fb_line_len/2)if(i>=5)for(j=470;j<582;j+)pj = WHITE;elsefor(k=470;k<475;k+)pk=WHITE;for(k=577;k<582;k+)pk=WHITE;void drawOperate(block a) int i,j; unsigned short int *p=(unsigned short int *)fbdev.fb_mem; for(i=0;i<a.y;i+,p+=fbdev.fb_line_len/
22、2); for(i=a.y;i<a.y+60;i+,p+=fbdev.fb_line_len/2) for(j=a.x;j<a.x+60;j+) pj=a.color; void drawEdge() int i,j; unsigned short int *p=(unsigned short int *)fbdev.fb_mem; for(i=0;i<fbdev.fb_height;i+,p+=fbdev.fb_line_len/2) for(j=110;j<115;j+) pj=WHITE; for(j=360;j<365;j+) pj=WHITE; void
23、 drawBlock() int i,j,m,k; unsigned short int *p=(unsigned short int *)fbdev.fb_mem; for(i=0;i<20;i+,p+=fbdev.fb_line_len/2) for(m=0;m<20;m+,p+=fbdev.fb_line_len/2) for(j=0;j<10;j+)/if(m = 0)/printf("%u ",getBit(frameArrayi,9-j);if(getBit(frameArrayi,9-j) = 1)for(k=0;k<20;k+)pj*
24、24+k+120=ORANGE; /printf("n");for(m;m<23;m+,p+=fbdev.fb_line_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();frameArraybuf
25、fer_open();drawBlock();/signal(SIGALRM,func);int frameArraybuffer_open(void)int fb;struct 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);/打开frameArra
26、ybuffer缓存if(fb<0)printf("device %s open failedn",fb_dev_name);return -1;if(ioctl(fb,FBIOGET_VSCREENINFO,&fb_vinfo)/获取与frameArraybuffer有关的可变信息printf("Can't get VSCREENINFO:%sn",strerror(errno);close(fb);return -1;if (ioctl(fb,FBIOGET_FSCREENINFO,&fb_finfo)/获取与frameA
27、rraybuffer有关的固定信息 printf("Can't get FSCREENINFO:%sn",strerror(errno); return 1;fbdev.fb_bpp = fb_vinfo.red.length + fb_vinfo.green.length + 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_len
28、gth;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.fb_bpp,fbdev.fb_size);if (fbdev.fb_bpp != 16) printf("frameArray buffer must be 16bpp moden");exit(0);fbdev.fb_mem = mmap(NUL
29、L, 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 -1;fbdev.fb = fb;memset(fbdev.fb_mem, 0x0, fbdev.fb_size);return 0;void frameArraybuffer_close()if (fbdev.fb_m
30、em)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) exit(0); opts = opts | O_NONBLOCK; if(fcntl(sd, F_SETFL, opts) < 0) exit(0);int main(void) int i,fd,t
31、emp,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(ITIMER_REAL,&value,NULL);signal(SIGALRM,func); O_up.x = 500; O_up.y = 300; O_up.color = ORANGE;
32、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_RDONLY);/打开触摸屏 if(ts<0)fprintf(stderr,"Can not open touch screenn");exit(1)
33、; set_non_blocking(ts); initial(); frameArraybuffer_open();drawBlock(); while(1) read(ts,&ts_event,sizeof(TS_EVENT);/printf("nizaima %dn",ts_event.pressure); if(ts_event.pressure>0&&flag = 0) / printf("up.color:x:%d,y:%dn",ts_event.x,ts_event.y); if (ts_event.x < 3115 && ts_event.y < 1500 && ts_event.x >2785 && ts_event.y >1100) /up transform(); view(); else if (ts_event.x < 3115 && ts_event.y < 1000 && ts_event.x >2785 && ts_event.y >600) /down down();
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年南阳市第十一人民医院(南阳市第二人民医院鸭河医院)招聘专业技术人员50人模拟试卷及答案详解(网校专用)
- 2025春季首都机场集团校园招聘考前自测高频考点模拟试题及答案详解(有一套)
- 2025安徽交运集团滁州汽运有限公司凤阳城交分公司招聘2人考前自测高频考点模拟试题附答案详解(考试直接用)
- 2025年庆阳石化分公司春季招聘(5人)考前自测高频考点模拟试题附答案详解(突破训练)
- 2025广东佛山市季华中学招聘编制教师2人模拟试卷及答案详解(夺冠)
- 2025广东韶关市在选调生招录中同步开展事业单位人员招聘25人模拟试卷及答案详解(历年真题)
- 2025年铜川市为县以下医疗卫生机构定向招聘笔试考前自测高频考点模拟试题及答案详解参考
- 2025福建省晋江圳源环境科技有限责任公司招聘6人考前自测高频考点模拟试题及一套参考答案详解
- 2025安徽芜湖市中西医结合医院(湾沚区总医院)招聘第三方救护车驾驶员(第二批)1人模拟试卷参考答案详解
- 2025昆明市甸沙乡卫生院招聘乡村医生(2人)模拟试卷及参考答案详解一套
- 浙江省计算机二级MS考试题库(浓缩400题)
- 木心全集讲稿系列:文学回忆录
- 肿瘤微环境中的细胞间通信
- 课程设计-MATLAB与通信仿真设计题目及程序
- 第6课 推动形成全面对外开放新格局高一思想政治《中国特色社会主义》同(高教版2023基础模块)
- 社会调查研究抽样课件
- 矩阵论同步学习辅导 张凯院 西北工业大学出版社
- 英语英语句子成分和基本结构
- GB/T 24218.1-2009纺织品非织造布试验方法第1部分:单位面积质量的测定
- GB/T 10357.1-2013家具力学性能试验第1部分:桌类强度和耐久性
- GB 10068-2000轴中心高为56mm及以上电机的机械振动振动的测量、评定及限值
评论
0/150
提交评论