粤嵌6818开发板触摸屏应用

一、触摸屏应用

1.触摸屏设备的名字

在Linux下,一切皆文件,触摸屏也是一个文件。

触摸屏设备的名字:/dev/input/event0

2.触摸屏的两个专业术语

  • 事件 ->event0

当一些外接控制设备(鼠标、键盘,wifi,触摸屏,按键)接入到嵌入式平台(GEC6818)时,这些外接设备的状态发生了改变(鼠标的左键被按下了,键盘的R键被按下,有人连接上wifi了,触摸屏被滑动了一下,按键被按下了)时,这个动作就称之为事件.

  • 输入子系统 ->input

当事件发生的时候,就是由输入子系统来计算这些事件中产生的值。并将这些值整合到一个名为input_event结构体中。(例如:触摸屏被触摸后,输入子系统就会计算出被触摸的坐标值)

3.代码实现流程

1.打开event0文件

2.读取event0文件的数据

3.判断事件类型,打印出数据

4.关闭文件

4.触摸屏数据对应的类型

如果想知道从event0这个文件中读取出来的这个文件的数据是什么类型的,那么就必须先知道输入子系统计算完这个结果之后,是以什么形式放到这个event0这个文件中。

以前我们学习结构体的时候知道描述一个需要很多值的事件,我们可以使用结构体来描述,所以输入子系统处理好触摸屏数据后,也是将这些数据存放到一个结构体中。

该结构体已经定义好了,是被封装在一个头文件,头文件的路径在: /usr/include/linux/input.h

/* * The event structure itself   //事件结构体 */
struct input_event {       -> 专门用于描述一个事件。 struct timeval time;   -> 事件发生的时间。 __u16 type;            -> 事件的类型  (输入子系统会用这个值来描述刚才发生事件的硬件设备)__u16 code;            -> 事件的编码  -> 对事件进一步的描述 左键/右键  A键/R键  x轴/y轴 __s32 value;           -> 事件的值
};
​
struct timeval {        long    tv_sec;         /* 秒 */        long    tv_usec;        /* 微秒 */};

知道触摸屏数据是存放在一个结构体中后,那么我们可以写一段代码来打印出这些数据看看:

#include <stdio.h>
​
#include <sys/types.h>
​
#include <sys/stat.h>
​
#include <fcntl.h>
​
#include <unistd.h>
​
#include <string.h>
​
#include <linux/input.h>
​
int main()
​
{
​
•    // 1.打开event0文件
​
•    int ts_fd;
​
•    ts_fd = open("/dev/input/event0", O_RDONLY);
​
•    if(ts_fd == -1)
​
•    {
​
•        printf("open ts failed!\n");
​
•        return 0;
​
•    }
​
•    // 2.读取event0文件的数据
​
•    struct  input_event ts_buf;
​
•    read(ts_fd, &ts_buf, sizeof(ts_buf));
​
•    
​
•    // 3.判断事件类型,打印出数据
​
•    printf("type = %d", ts_buf.type);
​
•    printf("code = %d", ts_buf.code);
​
•    printf("value = %d", ts_buf.value);
​
•    // 4.关闭文件
​
•    close(ts_fd);
​
•    return 0;
​
}

其实这个结构体结果的值也被封装在一个头文件中:/usr/include/linux/input-event-codes.h

input_event结构体的四个成员:

1.time(时间戳)

输入事件发生的时间戳,精确到微秒。时间结构体定义如下:

struct timeval
{
__time_t tv_sec; // 秒
long int tv_usec; // 微秒(1微秒 = 10-3毫秒 = 10-6秒)
};

2.type(输入事件类型)

输入事件的类型。比如:

3.code(事件代码)

这个 事件代码用于对事件的类型作进一步的描述。比如:当发生EV_KEY事件时,则可能是键盘被按下了,那么究竟是哪个按键被按下了呢?此时查看code就知道了。当发生EV_REL事件时,也许是鼠标动了,也许是滚轮动了。这时可以用code的值来加以区分。

4.value(数据值)

当code都不足以区分事件的性质的时候,可以用value来确认。比如由EV_REL和REL_WHEEL确认发生了鼠标滚轮的动作,但是究竟是向上滚还是向下滚呢?再比如由由EV_KEY和KEY_F确认了发生键盘上F键的动作,但究竟是按下呢还是弹起呢?这时都可以用value值来进一步判断。

举一个实例帮助理解输入子系统:

我们先规定
type:
= 0  吃饭
= 1  睡觉
​
code:
= 0  早餐
= 1  午餐
= 2  晚餐
​
= 0  午觉
= 1  晚觉
​
value:
= 0  吃饱了
= 1  没吃饱 
= 0  睡得着 
= 1  睡不着 
​
​
struct input_event{   -> 代表输入子系统分析出来.type = 0.code = 1.value = 1} 
​
我们再获取输入子系统整合的input_event结构体的值
​
struct input_event{   -> 代表输入子系统分析出来: 你刚刚吃晚餐没吃饱.type = 0.code = 2.value = 1} 
​
struct input_event{   -> 代表输入子系统分析出来: 你刚刚睡午觉没睡着.type = 1.code = 0.value = 3} 
 

练习:编写代码,实现打印出触摸点的坐标。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
​
int main()
{int ts_fd;struct input_event ts_buf;ts_fd = open("/dev/input/event0",O_RDONLY);if(ts_fd == -1){printf("open ts failed!\n");return -1;}int x,y;while(1){read(ts_fd, &ts_buf, sizeof(ts_buf));if(ts_buf.type == EV_ABS && ts_buf.code == ABS_X)//判断是否发生X轴绝对位移事件{x = ts_buf.value;}if(ts_buf.type == EV_ABS && ts_buf.code == ABS_Y)//判断是否发生Y轴绝对位移事件{y = ts_buf.value;}if(ts_buf.type == EV_KEY && ts_buf.code == BTN_TOUCH && ts_buf.value == 0)//松手检测{printf("(x, y) = (%d, %d)\n",x,y);}  }close(ts_fd);return 0;
}

作业1:观察打印出的坐标,得出触摸屏和LCD像素对应的关系

黑色边的开发板触摸屏坐标范围是:1024*600

蓝色边的开发板触摸屏坐标范围是:800*480

练习8:通过触摸屏实现显示图片切换。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <linux/input.h>
#include <sys/mman.h>
int ts_fd, lcd_fd;
int ts_x,ts_y;
struct input_event ts_buf;
int *p;
​
char *pic_path[] = {"./1.bmp" , "./2.bmp", "./3.bmp", "./4.bmp", "./5.bmp"};
​
/**函数名:show_bmp*函数功能:显示bmp图片*参数:*  path: 图片的路径*  zs_x:  图片显示的原点x轴坐标*  zs_y:  图片显示的原点y轴坐标*  whide: 图片的宽度(单位像素)*  high: 图片的高度(单位像素)
*/
int show_bmp(char *path, int zs_x, int zs_y, int w, int h)
{// 1、打开bmp文件
​int bmp_fd = open(path, O_RDONLY);if (bmp_fd == -1) {printf("open bmp error!\n");return -1;  }
​//2、 跳过bmp文件头和信息头lseek(bmp_fd, 54, SEEK_SET);  
​//3、读取bmp文件的数据char bmp_buf[w*h*3];read(bmp_fd, bmp_buf, 800*480*3);  // 读取bmp文件数据到bmp_buf
​//4、数据处理int lcd_buf[w*h];int n;for (n = 0; n < 800*480; n++){lcd_buf[n] = bmp_buf[3*n] | bmp_buf[3*n+1]<<8 | bmp_buf[3*n+2]<<16;}
​​int *new_p = p + zs_x + zs_y*800;
​//6、// 5、将数据拷贝到映射空间int x, y;for(y=0;y<h;y++){for(x=0;x<w;x++){*(new_p+x+(h-1-y)*800) = lcd_buf[x+y*w];}
​}
​close(bmp_fd);
}
​
void get_xy()
{// 2.读取event0文件的数据read(ts_fd, &ts_buf, sizeof(ts_buf));
​// 3.判断事件类型,打印出数据if(ts_buf.type == EV_ABS && ts_buf.code == ABS_X)//获取X轴坐标{ts_x = ts_buf.value;//0-1024  ---> 0-800ts_x = ts_x * 800 / 1024;}   if(ts_buf.type == EV_ABS && ts_buf.code == ABS_Y)//获取Y轴坐标{ts_y = ts_buf.value;//0-600ts_y = ts_y * 480 / 600;}       if(ts_buf.type == EV_KEY && ts_buf.code == BTN_TOUCH && ts_buf.value == 0)//松手检测{printf("(x,y) = (%d,%d)",ts_x,ts_y);}
​
}
​
int main()
{// 1.打开fb0、event0文件lcd_fd = open("/dev/fb0", O_RDWR);if(lcd_fd < 0){perror("open fb0");return -1;}
​ts_fd = open("/dev/input/event0", O_RDONLY);if (ts_fd == -1) {perror("open touch failed\n");return -1;}
​// 内存映射p = (int *)mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, lcd_fd, 0);if(p == MAP_FAILED){perror("mmap failed\n");return -1;}int i = 0;while (1){get_xy();if(ts_buf.type == EV_KEY && ts_buf.code == BTN_TOUCH && ts_buf.value == 0)//松手检测{if(ts_x>=0 && ts_x<200)//上一张{i--;if(i<0){i = 4;}show_bmp(pic_path[i], 0, 0, 800, 480);}if(ts_x>=600 && ts_x<800)//下一张{i++;if(i>4){i = 0;}show_bmp(pic_path[i], 0, 0, 800, 480);
​}​
​}}// 4.关闭文件munmap(p, 800*480*4);close(lcd_fd);close(ts_fd);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2871074.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

4.1_7 文件共享

文章目录 4.1_7 文件共享&#xff08;一&#xff09;基于索引结点的共享方式&#xff08;硬链接&#xff09;&#xff08;二&#xff09;基于符号链的共享方式&#xff08;软链接&#xff09; 总结 4.1_7 文件共享 注意&#xff1a;多个用户共享同一个文件&#xff0c;意味着系…

单片机第四季-第二课:uCos2源码-BSP

1&#xff0c;初始uCos2 文件中uC开头的为uCos相关的。 2&#xff0c;uCos2源码工程建立 建立Source Insight工程 寻找main函数 (1)RTOS其实就是一个大的裸机程序&#xff0c;也是从main开始运行的 (2)main之前也是有一个汇编的启动文件的 (3)main中调用了很多初始化函数 bsp部…

《你就是孩子最好的玩具·升级版》笔记(一)尊重孩子的感受

目录 简介 经典摘录 简介 作者是&#xff08;美&#xff09;金伯莉布雷恩。奠定父母与孩子一生亲密关系的情感引导书。 什么是情感引导&#xff1f; 情感引导式教育的核心&#xff0c;就是教我们的孩子如何去合理地认知以及表达自己的感受&#xff0c;书中更侧重于在这方面为…

【NBUOJ刷题笔记】递推_递归+分治策略2

0. 前言 PS&#xff1a;本人并不是集训队的成员&#xff0c;因此代码写的烂轻点喷。。。本专题一方面是巩固自己的算法知识&#xff0c;另一方面是给NBU学弟学妹们参考解题思路&#xff08;切勿直接搬运抄袭提交作业&#xff01;&#xff01;&#xff01;&#xff09;最后&…

【matlab】如何批量修改图片命名

【matlab】如何批量修改图片命名 (●’◡’●)先赞后看养成习惯😊 假如我的图片如下,分别是1、2、3、4、5的命名 需求一:假如现在我需要在其后面统一加上_behind字符串,并且保留原命名,同时替换掉原先的图片,也就是不copy新的一份,直接在原文件夹中处理,我们可以进行…

软件杯 深度学习 python opencv 动物识别与检测

文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…

openEuler学习总结1(仅供学习参考)

华为的openEuler内核是源于Linux。 openEuler操作系统安装流程 第一步&#xff1a;开启虚拟化 第二步&#xff1a;安装一个虚拟化软件virtualbox 第三步&#xff1a;镜像 第四步&#xff1a;配置 设置虚拟机所在的目录 把网卡类型选择成桥接网卡 挂载镜像 设置完成&#xff0…

YOLOv9详解

1.概述 在逐层进行特征提取和空间转换的过程中&#xff0c;会损失大量信息&#xff0c;例如图中的马在建模过程中逐渐变得模糊&#xff0c;从而影响到最终的性能。YOLOv9尝试使用可编程梯度信息PGI解决这一问题。 具体来说&#xff0c; PGI包含三个部分&#xff0c;&#xff0…

【你也能从零基础学会网站开发】Web建站之jQuery进阶篇 jQuery常见属性和方法概述与使用

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 jQuery创建新的…

vulhub中Apache Shiro 认证绕过漏洞复现(CVE-2010-3863)

Apache Shiro是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 在Apache Shiro 1.1.0以前的版本中&#xff0c;shiro 进行权限验证前未对url 做标准化处理&#xff0c;攻击者可以构造/、//、…

交流互动系统|基于springboot框架+ Mysql+Java+Tomcat的交流互动系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

redis学习-String类型的命令介绍以及特殊情况分析

目录 1. set key value 2. get key 3. append key string 4. strlen key 5. incr key 和 decr key 6. incrby key num 和 decrby key num 7. getrange key start end 8. setrange key start string 9. setex key time value 10. setnx key value 11. mset key1 val…

【Web开发】CSS教学(超详细,满满的干货)

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Web开发】CSS教学(超详细,满满的干货) &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 CSS一. 什么是CSS?1.1 基本语法规范1.2 引入方式1.3 规范 二. CSS选…

【第三章-1】面向对象——类与对象基本概念

目录 1.引例 2.类class 3. 面向对象中什么是对象&#xff1f; 4.类和对象的关系 5.面向对象编程 6.IDEA创建类与对象 7.成员变量 8.IDEA上代码练习成员变量 9.什么是方法 10.包Package&#xff08;详细参考&#xff09; 11.访问修饰符 12.面向对象与面向过程 1.引例…

Docker入门二(应用部署、迁移与备份、DockerFile、docker私有仓库、Docker-Compose)

文章目录 一、应用部署1.MySQL部署2.Redis部署3.Nginx部署 二、迁移与备份1.容器做成镜像2.镜像备份和恢复(打包成压缩包&#xff09; 三、DockerFile0.镜像从哪里来&#xff1f;1.什么是DockerFile2.DockerFile 构建特征3.DockerFile命令描述4.构建一个带vim的centos镜像案例5…

PC-DARTS: PARTIAL CHANNEL CONNECTIONS FOR MEMORY-EFFICIENT ARCHITECTURE SEARCH

PC-DARTS&#xff1a;用于内存高效架构搜索的部分通道连接 论文链接&#xff1a;https://arxiv.org/abs/1907.05737 项目链接&#xff1a;https://github.com/yuhuixu1993/PC-DARTS ABSTRACT 可微分体系结构搜索(DARTS)在寻找有效的网络体系结构方面提供了一种快速的解决方案…

[java基础揉碎]断点调试

一个实际需求: 1.在开发中&#xff0c;新手程序员在查找错误时&#xff0c;这时老程序员就会温馨提示&#xff0c;可以用断点调试&#xff0c; 一步一步的看源码执行的过程&#xff0c;从而发现错误所在。 2.重要提示:在断点调试过程中&#xff0c;是运行状态&#xff0c;是以…

TCP-IP 知识汇总

开放式系统互联模型------国际化标准组织ISO提出----协议组&#xff08;协议模型&#xff09; 应用层&#xff1a;接收用户数据&#xff0c;人机交互的接口 表示层&#xff1a;将编码转换为二进制&#xff08;加密、解密&#xff09;---统一格式 会话层&#xff1a;针对传输…

一维差分(模板)

差分是前缀和的逆运算&#xff0c;对于一个数组a&#xff0c;其差分数组b的每一项都是a [ i ]和前一项a [ i − 1 ]的差。 注意&#xff1a;差分数组和原数组必须分开存放&#xff01;&#xff01;&#xff01;&#xff01; #include <iostream> using namespace std;t…

PCL安装(C++)并配置vs

准备工作&#xff1a; 1.PCL下载包(此教程使用PCL1.11.0) 3.visual studio(此教程使用vs2019) PCL下载&#xff1a; 1、找到自己适合的PCL版本,我选择的是PCL1.11.0。 1.1 Github下载&#xff1a;Releases PointCloudLibrary/pcl GitHub 1.2 百度网盘&#xff1a;https://pan…