(原创)如何用自带AD实现触摸屏转换(触摸屏)(AD转换)
2011-05-11 19:35
274 查看
摘要:
在人机界面中,触摸屏越来越流行,一般情况下,都需要一个触摸屏控制器或者触摸屏接口芯片来实现触摸屏的AD转换,但对于某些单片机系统,它并不带有触摸屏控制器,也不想增加外扩触摸屏芯片的成本,则可以用自带的AD来实现触摸屏的转换。本文将以LPC2478平台介绍如何利用自带AD实现触摸屏AD转换及滤波的处理。
介绍:
在开始之前,我们来补充一点触摸屏的知识,下面是一个四线电阻屏
在屏的四周我们可以看到触摸屏的引线,可分别找出引脚的排列,我的触摸屏排列是 XL,YD,XR,YU,由于我定义的0座标是在左上角,因此我将XL定义为X-,XR定义为X+,YU定义为Y-,YD定义为Y+。
在电路里,我们将X-和Y-接在LPC2478的通用IO上,X+和Y+接到LPC2478的AD引脚上。
现在,我们来看看触摸屏转换的原理
step1:如何检测触摸事件的发生
将X-,X+,Y-,Y+配置成GPIO模式,Y+和Y-设置为推挽输出‘1’,这样Y便成了一个高电平平面,再将X+浮空输入,X-设置为下拉输入;如下图:
由于触摸屏的电阻是远小于R1(LPC2478自带下拉电阻)的,因此当触摸屏X Y有接触时,X-端会产生一个高电平,因此触摸事件的发生,就是通过检测这个高电平而得知的。
当然触摸屏按下和松开会有抖动,需要进行滤波处理,原理很简单,这里就不介绍了,看附件里的代码吧。
step2:检测X的值
触摸事件发生后,我们要开始进行AD转换了,首先我们确定X的座标值。
将X+ X-设置为推挽输出,X+输出‘1’,X-输出‘0’,Y-设置为FLOAT输入,Y+设置为AD输入
这样,AD转换出来的就是X的值。
当然,AD转换也是要滤波的,我采用的是中值滤波法,大家还是看代码吧。
step3:检测Y的值
同step2一样的方法,可检测出Y的值。
step4:AD转换为键值
关于触摸屏压力的检测
其实,对于触摸屏来说等效电路应该是这样
Rt是接触电阻,由于它是与R3串联接入AD的,因此它可以被忽略,但这个Rt并非是无用,对于检测触摸压力还是有用的,因为对于有些PDA快速手写需要辩别触摸的压力,用下面的方法则可以实现
结语:
用自带AD,省去了外扩触摸屏芯片,节省了成本,也缩小了PCB面积。对于一般的单片机来说都有自带AD,应用还是蛮广泛的。
附件是代码
touchscr .rar http://files.cnblogs.com/liu_xf/touchsrc.rar
参考资料:
在人机界面中,触摸屏越来越流行,一般情况下,都需要一个触摸屏控制器或者触摸屏接口芯片来实现触摸屏的AD转换,但对于某些单片机系统,它并不带有触摸屏控制器,也不想增加外扩触摸屏芯片的成本,则可以用自带的AD来实现触摸屏的转换。本文将以LPC2478平台介绍如何利用自带AD实现触摸屏AD转换及滤波的处理。
介绍:
在开始之前,我们来补充一点触摸屏的知识,下面是一个四线电阻屏
在屏的四周我们可以看到触摸屏的引线,可分别找出引脚的排列,我的触摸屏排列是 XL,YD,XR,YU,由于我定义的0座标是在左上角,因此我将XL定义为X-,XR定义为X+,YU定义为Y-,YD定义为Y+。
在电路里,我们将X-和Y-接在LPC2478的通用IO上,X+和Y+接到LPC2478的AD引脚上。
现在,我们来看看触摸屏转换的原理
step1:如何检测触摸事件的发生
将X-,X+,Y-,Y+配置成GPIO模式,Y+和Y-设置为推挽输出‘1’,这样Y便成了一个高电平平面,再将X+浮空输入,X-设置为下拉输入;如下图:
由于触摸屏的电阻是远小于R1(LPC2478自带下拉电阻)的,因此当触摸屏X Y有接触时,X-端会产生一个高电平,因此触摸事件的发生,就是通过检测这个高电平而得知的。
当然触摸屏按下和松开会有抖动,需要进行滤波处理,原理很简单,这里就不介绍了,看附件里的代码吧。
step2:检测X的值
触摸事件发生后,我们要开始进行AD转换了,首先我们确定X的座标值。
将X+ X-设置为推挽输出,X+输出‘1’,X-输出‘0’,Y-设置为FLOAT输入,Y+设置为AD输入
这样,AD转换出来的就是X的值。
当然,AD转换也是要滤波的,我采用的是中值滤波法,大家还是看代码吧。
step3:检测Y的值
同step2一样的方法,可检测出Y的值。
step4:AD转换为键值
/******************************************************************** 函数功能:触摸屏键值转换 入口参数: 返 回: 备 注: ********************************************************************/ void TouchScrConvert(TOUCH_SCR_STATUS *p_status) { Int32U x_pixels; Int32U y_pixels; Int8U f_x=0,f_y=0; //无效值,直接返回== //如果超过范围== //x if(p_status->TouchScrX<=TOUCH_SCR_MIN_X_ADC) { p_status->TouchScrX = 0; f_x=1; } else if(p_status->TouchScrX>=TOUCH_SCR_MAX_X_ADC) { p_status->TouchScrX = TOUCH_SCR_H_SIZE;f_x=1; } //y if(p_status->TouchScrY<=TOUCH_SCR_MIN_Y_ADC) { p_status->TouchScrY = 0; f_y=1; } else if(p_status->TouchScrY>=TOUCH_SCR_MAX_Y_ADC) { p_status->TouchScrY = TOUCH_SCR_V_SIZE; f_y=1; } //-- //-- x_pixels = p_status->TouchScrX; y_pixels = p_status->TouchScrY; if(f_x==0) { x_pixels = (x_pixels - TOUCH_SCR_MIN_X_ADC)*TOUCH_SCR_H_SIZE; x_pixels /= TOUCH_SCR_DELTA_X_ADC; } if(f_y==0) { y_pixels = (y_pixels - TOUCH_SCR_MIN_Y_ADC) * TOUCH_SCR_V_SIZE; y_pixels /= TOUCH_SCR_DELTA_Y_ADC; } p_status->TouchScrX = (Int16U)x_pixels; p_status->TouchScrY = (Int16U)y_pixels; }
关于触摸屏压力的检测
其实,对于触摸屏来说等效电路应该是这样
Rt是接触电阻,由于它是与R3串联接入AD的,因此它可以被忽略,但这个Rt并非是无用,对于检测触摸压力还是有用的,因为对于有些PDA快速手写需要辩别触摸的压力,用下面的方法则可以实现
结语:
用自带AD,省去了外扩触摸屏芯片,节省了成本,也缩小了PCB面积。对于一般的单片机来说都有自带AD,应用还是蛮广泛的。
附件是代码
touchscr .rar http://files.cnblogs.com/liu_xf/touchsrc.rar
参考资料:
四线电阻式触摸屏驱动的优化
相关文章推荐
- [原创]如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何去掉Android Activity自带的原生进入进出动画的实现方式.
- 如何用栈实现递归与非递归的转换
- 如何使用C#自带的GDI+双缓冲类BufferedGraphics实现双缓冲功能
- 如何运用ABBYY FineReader实现JPEG与ePub之间的转换
- 如何实现数字lcd显示效果(原创)
- 『原创』+『参考』如何在.Net CF下实现一个Splash窗体
- Asp.net 如何实现简体到繁体的转换
- 在Golang里如何实现结构体成员指针到结构体自身指针的转换
- PHP实现字节数Byte转换为KB、MB、GB、TB的方法[原创]_php技巧_脚本之家
- 如何实现人民币的大写转换?
- (原创)在 ASP.NET 中,如何巧用 HttpModule ,以实现系统全局登录逻辑判断,高手慎入
- AD10的PCB转换成Protel99SE导致覆铜消失该如何解决和将AD10的pcb转换成protel版本
- 用Visual Studio开发web应用程序,自带的.dbo后台数据库如何用代码实现连接
- [转]如何用栈实现递归与非递归的转换
- 如何实现给字符串加千分符 例如:123456789.01 转换 123,456,789.01
- Win8自带地图程序竟然是英文的如何通过设置来转换成中文
- 如何转换AD FSMO角色