触摸屏获取坐标
1)触摸屏代码的思路
第一步:打开触摸屏的驱动("/dev/input/event0")
第二步:读取触摸屏的坐标
第三步:关闭触摸屏
2)输入子系统模型(了解原理即可,等你学习驱动的时候再深入掌握)
概念:linux把所有输入类型设备(键盘,鼠标,触摸屏)的驱动统一成了一个模型--》输入子系统模型
linux为了统一,就搞出了输入子系统模型这个概念,所有的人开发linux上键盘,鼠标,触摸屏的驱动都必须按照输入子系统模型规定好的参数,变量去写代码
linux提供的跟输入子系统模型有关的头文件
/usr/include/linux/input.h
输入子系统模型中的重要结构体
struct input_event
{
type; //表示事件类型 EV_KEY 键盘的驱动 EV_ABS 触摸屏的驱动
code; //表示按键的键值,x,y坐标 ABS_X ABS_Y
value; //表示坐标值
}
3)开发板触摸屏的坐标跟液晶屏的分辨率不一致
液晶屏的分辨率:800*480
开发板的触摸屏坐标:1024*600
把获取的坐标(x,y)
//x=x/1024*800; y=y/600*480; //由于整形/整形得不到分数,只会得到(0,0)
x=x*800/1024; y=y*480/600; //先乘后除
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
int t_x,t_y;//保存获取的屏幕坐标(x,y)
//读取屏幕坐标(x,y)
int get_ts()
{
struct input_event ts;
//打开触摸屏驱动
int fd_ts=open("/dev/input/event0",O_RDWR);
if(-1==fd_ts)
{
perror("open ts failed\n");
return -1;
}
while(1)
{ //循环读取文件
read(fd_ts,&ts,sizeof(ts));
if(ts.type==EV_ABS)//是触摸屏驱动
{
if(ts.code==ABS_X)//x坐标
t_x=ts.value;
if(ts.code==ABS_Y)//y坐标
t_y=ts.value;
}
//ts.type=EV_KEY--》开关, 按下时ts.value=1;抬手时ts.value=0
if(ts.type==EV_KEY && ts.code==BTN_TOUCH && ts.value==0)
break;
}
//关闭文件
close(fd_ts);
}
int main(int argc,char **argv)
{
while(1)
{
get_ts();
printf("(%d,%d)\n",t_x,t_y);
}
return 0;
}