触摸屏的类型
按工作原理分为:
红外式触摸屏:价格低,外框易碎,容易产生光干扰,曲面情况下失真。
电容式触摸屏:设计理论好,图象失真问题很难得到根本解决。
电阻式触摸屏:定位准确,价格高,怕刮易损。
表面声波触摸屏:解决了以往触摸屏的各种缺陷,清晰抗暴,适于各种场合,缺憾是屏表面的水滴、尘土会使触摸屏变得迟钝,甚至不工作。
各种触摸屏基本技术对比
电阻式触摸屏的工作原理
触摸屏组成:
触摸检测部件:安装在显示器屏幕前面,检测用户触摸位置,接受后送触摸屏控制器。
触摸屏控制器:接收触摸点检测装置信息,并将它转换成触点坐标,再送给CPU。
工作原理:
屏体部分是一块与显示器表面非常配合的多层复合薄膜。
由一层玻璃或有机玻璃作为基层,表面涂有透明的导电层(OTI,氧化铟,弱导电体,透光率为80%)。
上面再盖一层外表面硬化处理、光滑防刮的塑料层,它的内表面也涂有一层OTI,在两层导电层之间有许多细小(小于千分之一英寸)的透明隔离点把它们隔开绝缘。
当手指接触屏幕,两层OTI导电层(层间距2.5微米)出现一个接触点,因其中一面导电层接通Y轴方向的5V均匀电压场,使得侦测层的电压由零变为非零,控制器侦测到这个接通后,进行A/D转换,可得触摸点的Y轴坐标。
同理得出X轴的坐标。
电阻屏根据引出线数多少,分为四线、五线等多线电阻触摸屏。
电阻式触摸屏工作原理图解
触摸屏的驱动芯片ADS7843
S3C44B0X通过端口G模拟串行的SIO接口与触摸屏专门的控制芯片ADS7843进行数据传输,来完成对触摸屏触摸位置坐标的读取。
ADS7843完成两件事:
(1)是完成电极电压的切换;
(2)是采集接触点处的电压值,并进行A/D转换。
ADS7843特性:
(1)可编程控制8位或者12位A/D转换模式。
(2)低导通电阻模拟开关。
(3)实现触摸屏的驱动选择控制(X、Y通道)。
(4)供电电压为2.7~5V。
(5)参考电压VREF为1V~+Vcc。
(6)转换电压的输入范围为0~VREF。
(7)最高转换速率为125kHz。
ADS7843引脚配置
ADS7843的控制字
S:数据传输起始标志,必须为1。
A2~A0:通道选择。
MODE:A/D转换精度,“1”=8位,“0”=12位。
SER/DFR:参考电压输入模式,“1”=固定电压(VREF)模式,“0”=差动电压(驱动电极)模式。
PD1、PD0:省电模式,“00”=省电模式允许,在两次A/D转换之间掉电,且中断允许;“01”与“00”相同,只是不允许中断;“10”=保留;“11”=禁止省电模式。
ADS7843 A0~A2的切换作用
ADS7843典型接口 触摸屏在按下时分别给两组电极通电,然后将其对应位置的模拟电压信号经过A/D转换送回处理器。
S3C44B0X选取PG口与ADS7843接口,共使用PG2~PG7的6条口线,也可以选择其他的I/O口。
X+、Y+、X-、Y-引脚直接与触摸屏的相应管脚相连。
ADS7843寄存器参数
PCONG寄存器:
rPCONG = 0x015f
PG7 6 5 4 3 2 1 0
00 00 00 01 01 01 11 11
入 入 入 出 出 出
PENIRQ加内部上拉电阻:
rPUPG&=0x80
读取触摸点坐标程序流程
SER/DFR=1,采用固定电压模式。
首先检测PENIRQ是否为低电平,如果为低电平,则认为有接触;否则认为触摸屏没有接触。
利用软件模拟DIN、DOUT和DCLK上的3线串行传输时序,将读取的X或Y坐标数值的控制字串行送入ADS7843,然后再串行读出坐标值。
最后将X和Y轴坐标值送串口显示即可。
读取触摸点坐标程序
检测PENIRQ,程序如下:
#define TOUCH-MSR-Y Ox9c;
//读Y轴坐标控制字:8位A/D转换、参考电压固定模式、省电模式允许
#define TOUCH-MSR_X Oxdc;
//读x轴坐标控制字:8位A/D转换、参考电压固定模式、省电模式允许
if((rPDATG & 0x80==0) //PG7,PENIRO电平为低
{
_State. Pressed= 1; //说明已经按下
temp = TOUCH_MSR_X;
_State. X = ReadTouch(temp);
temp = TOUCH_MSR_Y;
State. Y = ReadTouch(temp);
}
送控制字并读取结果子程序1 int ReadTouch(unsigned char command)
{
unsigned char temp, i,ack,j,k;
ack=0; //PG7ENIRQ,PG6:BUSY,PG5:DOUT,PG4:CS,PG3:DCLK,PG2:DIN
rPDATG &= Oxe7; //CS置低;DCLK置低,PG4
temp =0x80; //析取要传送的位
for(i=0; i>1; //右移1位
}
送控制字并读取结果子程序2
while((temp= (rPDATG & 0x40) )==1); //等待BUSY变低,PG6
rPDATG &= 0xdf; //DOUT清零,PG5
//开始接收数据
rPDATG|=0x08; //DCLK置高,PG3
delay(2);
rPDATG&=0xf7; //DCLK清零,PG3
delay(2);
for(i=0;i |