随着智能手机引领触摸屏的趋势,越来越多的应用像医疗液晶显示屏,工业TFT显示器等都将触摸板嵌入到液晶屏中。市场上有多种LCD触摸屏的实现方式,我们以最简单的四线电阻式触摸为例,来解释LCD触摸屏实现的基本原理。
四线电阻式触摸
AnalogDevice的AD7843是一款常见的4线电阻触摸板控制器,我们用它来支持电阻式触摸屏。
应用目标和平台考虑
大多数工业和仪表应用的触摸屏都是用于菜单选择和触摸按钮功能。从触摸屏上做高分辨率的读取不是必要的。
对于7"左右的LCD显示屏来说,4位的分辨率就足够了(可以定义16x16的触摸区域)
AD7846提供12位或8位A/D分辨率,对于我们的例子来说已经足够了。
了解AD7843的操作过程
下图是一个完整的AD7843操作流程(单次采集操作)。基于此,工程师可以设计他们程序的操作顺序。(关于继续采样,请参考AD7834datasheet)
通信包
一个数据包含有24(3x8)时钟脉冲(DCLK)
/CS=0和第一次DIN=1(startbit,S)时,通信开始
前8个DCLK用于命令输入(HosttoAD7843)viaDIN,上升沿触发
后16个DCLK用于A/D结果输出(AD7843toHost),主机可在下降沿读取数据DCLK(DCLK=0providesavalidbitoutputatDOUT)
如要终止通信,可在每8个时钟周期后设/CS=1
设置MODE=1AD7843进行8位采样,在第16个时钟周期后设/CS=1可停止通讯
设置MODE=0AD7843进行12位采样,在第24个时钟周期后设/CS=1可停止通讯
关于/PENIRQ信号
/PENIRQisan"opencollector"()forthehost
Onpoweringon,AD7843provides/PENIRQoutput,theoutputcanbedisabledbysettingconfigbitPD0=1
/PENIRQreflects"touched":nottouched;0:beingtouched
Afterthe"S"inputted,/,changestoHi./PENIRQresumestonormalfunction(commandsettingPD0=0)
/PENIRQisnotrelatedto/CSsignal
AD7843I/O例程
例子使用的是8位命令,输出8位A/D结果
数据在DCLK上升沿写入
DCLK=0时读取数据
所有的读写在第16时钟周期DCLK结束,然后用/CS=1结束通讯
加入8个空的时钟周期,确保/PENIRQ恢复正常工作
ucharTP_IO8(ucharCommand)
//sacommandandreturn8bitconversionresult
//Commandbits(MSBtoLSB):S,A2,A1,A0,MODE,SER/DFR,PD1,PD0
{
uchari;
temp=Command;//copythecommandtobitaccessiblevariable
temp_b3=1;//settheMODEto8bitonly
TP_DOUT=1;//pullupforread
TP_DCLK=0;//preparefordatatranstransfer
_TP_CS=0;//selectthetouchpanelIO
for(i=0;i8;i++)//writecommandwith1stto8thDCLK
{
TP_DIN=temp_b7;TP_DCLK=1;TP_DCLK=0;
temp=temp1;
}
//delayms(1);//delayfor12bitconversion
for(i=0;i8;i++)//readdata
{
temp=temp1;
TP_DCLK=1;TP_DCLK=0;temp_b0=TP_DOUT;
}
_TP_CS=1;
for(i=0;i8;i++)//PenIrqre-enableat21stCLK
{//thus8dummyclockprovided
TP_DCLK=1;TP_DCLK=0;
}
return(temp);
}
应用流程示例
Use/PENIRQtoensuretouchpanelis"beingtouched"
GetXandYA/Dresult(keepupper4bits)
Delayforde-bouncing
Again,use/PENIRQtosettouchpanelis"beingtouched"
GetXandYA/Dresult(keepupper4bits)
Delayforde-bouncing
Onceagain,use/PENIRQtoensuretouchpanelis"beingtouched"andcomparethelasttwosetsofresults
Ittheresultsarethesame,wecanconfirmthetouchpanelisfunctioningcorrectly,andreliableresultisgivenout
Basedonthisresult,wecoulddisplayaboxordoaresponseonscreen.
voidWzitTouchAndResponse(void)
{
ucharx,y;
uchari,j;
ucharVerified_AD;//flagforverifiedA/D
Verified_AD=0;
while(Verified_AD==0)
{
while(_TP_PENQ)//ensureitistouchedthenstartAD
{
}
i=TP_IO8(0xd8)4;//X-Ch,8bit,LoPw,withPenInt
j=TP_IO8(0x98)4;//Y-Ch,8bit,LoPw,withPenInt
delayms(50);//de-bouncing
while(_TP_PENQ)//ensureitistouchedthenstartAD
{
}
x=TP_IO8(0xd8)4;//X-Ch,8bit,LoPw,withPenInt
y=TP_IO8(0x98)4;//Y-Ch,8bit,LoPw,withPenInt
delayms(50);//de-bouncing
if((i==x)(j==y)(!_TP_PENQ))//ensuretworesultsarethesame
{//andstilltouching
Verified_AD=1;
}
}
Box20x15(x,y,touch_Mark);
}
以上程序还可以进一步改进以适应实际应用。
总结
上面的例子是针对低分辨率的应用,其逻辑流程可以用于高分辨率的应用。同时,为了支持触摸操作,并不一定要进行tonescalculation,一个合理的逻辑流程可以简化整个操作过程。