摘要:

    在人机界面中,触摸屏越来越流行,一般情况下,都需要一个触摸屏控制器或者触摸屏接口芯片来实现触摸屏的AD转换,但对于某些单片机系统,它并不带有触摸屏控制器,也不想增加外扩触摸屏芯片的成本,则可以用自带的AD来实现触摸屏的转换。本文将以LPC2478平台介绍如何利用自带AD实现触摸屏AD转换及滤波的处理。

介绍:

在开始之前,我们来补充一点触摸屏的知识,下面是一个四线电阻屏

AD 架构主机转换到其他主机 如何实现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-设置为下拉输入;如下图:

AD 架构主机转换到其他主机 如何实现ad转换_AD 架构主机转换到其他主机_02

由于触摸屏的电阻是远小于R1(LPC2478自带下拉电阻)的,因此当触摸屏X Y有接触时,X-端会产生一个高电平,因此触摸事件的发生,就是通过检测这个高电平而得知的。

    当然触摸屏按下和松开会有抖动,需要进行滤波处理,原理很简单,这里就不介绍了,看附件里的代码吧。

    step2:检测X的值

    触摸事件发生后,我们要开始进行AD转换了,首先我们确定X的座标值。

    将X+ X-设置为推挽输出,X+输出‘1’,X-输出‘0’,Y-设置为FLOAT输入,Y+设置为AD输入

   

AD 架构主机转换到其他主机 如何实现ad转换_引脚_03

这样,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;
}

  

关于触摸屏压力的检测

其实,对于触摸屏来说等效电路应该是这样

AD 架构主机转换到其他主机 如何实现ad转换_引脚_04

Rt是接触电阻,由于它是与R3串联接入AD的,因此它可以被忽略,但这个Rt并非是无用,对于检测触摸压力还是有用的,因为对于有些PDA快速手写需要辩别触摸的压力,用下面的方法则可以实现

AD 架构主机转换到其他主机 如何实现ad转换_AD 架构主机转换到其他主机_05

结语:

    用自带AD,省去了外扩触摸屏芯片,节省了成本,也缩小了PCB面积。对于一般的单片机来说都有自带AD,应用还是蛮广泛的。

附件是代码

touchscr .rar   

参考资料:

四线电阻式触摸屏驱动的优化