(原创)如何用自带AD实现触摸屏转换(触摸屏)(AD转换)

在人机界面中,触摸屏越来越流行,一般情况下,都需要一个触摸屏控制器或者触摸屏接口芯片来实现触摸屏的AD转换,但对于某些单片机系统中,它并不带有触摸屏控制器,也不想增加外扩触摸屏芯片的成本,则可以用自带
强烈推介IDEA2021.1.3破解激活,IntelliJ IDEA 注册码,2021.1.3IDEA 激活码  

摘要:

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

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

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

    step2:检测X的值

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

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

    (原创)如何用自带AD实现触摸屏转换(触摸屏)(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;
}

只听到从山间传来架构君的声音:
长河起秋云,汉渚风凉发。有谁来对上联或下联?

  

关于触摸屏压力的检测

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

(原创)如何用自带AD实现触摸屏转换(触摸屏)(AD转换)

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

(原创)如何用自带AD实现触摸屏转换(触摸屏)(AD转换)

结语:

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

附件是代码

touchscr .rar   https://files.cnblogs.com/liu_xf/touchsrc.rar

参考资料:

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

本文来源,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/42182
0

发表评论