摘要:
在人机界面中,触摸屏越来越流行,一般情况下,都需要一个触摸屏控制器或者触摸屏接口芯片来实现触摸屏的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
参考资料: