欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

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

    • 资源ID:5506211       资源大小:709KB        全文页数:19页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    精选优质文档-倾情为你奉上 武汉大学计算机学院嵌入式系统设计实验报告题目: 触摸屏驱动实验 成员:一、实验题目在现有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 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】【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),则删除该行,并将该行以上的所有行下降一行。(五) 到顶。当方块堆满,即方块堆到背景矩阵的活动区域最上面一行,则游戏结束。四、实验代码#include<stdio.h>#include<fcntl.h>#include<stdlib.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> #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;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_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,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.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,表示可变换 .可,即变换 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; /printf("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=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;/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("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;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;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+)pk=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;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/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 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+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();frameArraybuffer_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);/打开frameArraybuffer缓存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)/获取与frameArraybuffer有关的固定信息 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_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.fb_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 -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) 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(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_RDONLY);/打开触摸屏 if(ts<0)fprintf(stderr,"Can not open touch screenn");exit(1); 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(); view(); delrow(); view(); else if (ts_event.x < 2770 && ts_event.y < 1000 && ts_event.x >2440 && ts_event.y >600) /left left(); view(); else if (ts_event.x < 3460 && ts_event.y < 1000 && ts_event.x >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(); return 0;五、实验流程运行make产生可执行文件;打开minicom终端,挂载触摸屏驱动,进入目录,运行程序;运行截图如下: 六、实验问题及解决办法1、触摸屏驱动编译加载问题。刚开始的时候我们找到了驱动程序,尝试着编译加载,可是当我们用insmod加载编译好的模块后,并启动触摸品,触摸屏并没有反应,后来发现机子中自带有触摸屏驱动,就利用该模块进行测试,触摸屏驱动加载正常,开始利用该模块coding2、触摸屏按压时间与读取时间问题。在编程的过程中,我们想通过点击触摸屏的次数来控制流程,但是发现,当我们按压一次时,整个循环却执行了很多次,也就是触摸屏电压的读取时间是非常短的,不能用这个来控制流程,我们采取的解决办法是从有压力一直到压力消失判定为一次按压。七、实验小结通过这次实验,对嵌入式的了解不仅仅限于在课堂上所学到的,对嵌入式有了深层次的认识,同时也再一次复习了使用前嵌入式实验台开发的步骤。通过这一次的课程设计,我们学会了更加努力地专研和思考问题,同时理论和动手实践相结合,更能加深对理论知识的理解和思考,将其转化为自己所能理解的东西,这样能使自己留下更深刻的印象。同时自己动手编写的小游戏,也让我们体会到软件开发的乐趣,也更加清楚地认识到了自己在软件开发及学习上的一些不足之处。最重要的是我们学习到了团队的合作,作为软件开发人员,团队合作是很重要的,我们在做实验中遇到了很多问题,可是通过我们分块讨论问题,解决问题,培养了团队合作的意识,受益匪浅。专心-专注-专业

    注意事项

    本文(嵌入式实验报告触摸屏驱动实验(共19页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开