触摸屏在现代生活中普遍使用,它通过压力或其他事件判断屏幕被触摸,从而将数据输入、上报给系统处理。触摸屏并不是lcd,而是在lcd上表面有一层adc,它的规格大小跟lcd屏幕大小一样,而且厚度很薄,所以会让我们误以为触摸屏就是lcd本身。
通过开发板的原理图及数据手册,对触摸屏一章仔细阅读分析,便可以知道怎么使用触摸屏。触摸屏分为4种模式:
当然还有一种省电模式。
当要测量xy位置坐标时,原理大概如图:
在Linux中,触摸屏驱动也是依据输入子系统实现的,所以一般步骤为:
1.分配一个input_dev结构体
2.设置能产生哪一类事件以及这类事件中的哪些事件。(按键类(触摸按键事件),相对位移类(x/y绝对位移,绝对位移压力))
3.利用input_register_device注册
4.硬件相关操作
硬件操作的主要操作有:
设置分频系数和 ADCDLY
注册INT_TC中断和AD中断
使能时钟
测量xy坐标时还需要启动adc
总结:
判断触摸屏被按下还是松开,是根据寄存器ADCDAT0的第15位,这一位如是为1,则是被松开,为0则是被按下。
在测量xy坐标时,读取ADCDAT0的低10位,即可得到x的坐标,读取ADCDAT1的低10位,即可得到y坐标
如何处理触摸屏被长按或滑动的情况?启动定时器!
如何上报触摸屏事件:
上报事件:
input_report_abs(struct input_dev *dev, unsigned int code, int value);
input_report_key(struct input_dev *dev, unsigned int code, int value);
如:
input_report_abs(s3c_ts_dev, ABS_PRESSURE, 0);
input_report_key(s3c_ts_dev, BTN_TOUCH, 0);
input_sync(s3c_ts_dev);
触摸屏的数据如何更精确?
优化措施:
1.设置ADCDLY为最大值, 这使得电压稳定后再发出IRQ_TC中断
2.如果ADC完成时, 发现触摸笔已经松开, 则丢弃此次结果
3.多次测量求平均值
4.软件过滤
5.启动定时器处理长按/滑动的情况
例子:
几种模式
上报事件:
input_report_abs(myts_dev, ABS_X, (x[0]+x[1]+x[2]+x[3])/4);
input_report_abs(myts_dev, ABS_Y, (y[0]+y[1]+y[2]+y[3])/4);
input_report_abs(myts_dev, ABS_PRESSURE, 1);
input_report_key(myts_dev, BTN_TOUCH, 1);
input_sync(myts_dev);
本文出自 “君峰俊宇” 博客,请务必保留此出处http://10274409.blog.51cto.com/10264409/1730688
原文:http://10274409.blog.51cto.com/10264409/1730688