常见触摸屏可以分为电阻式、电容式、表面声波式等。电阻式是应用较广的一种触摸屏,它的原理是通过测量横向和纵向的电阻值来获得触点的坐标。
s3c2440集成了4线制电阻式的触摸屏接口,触点坐标的检测是通过A/D转换来实现的。s3c2440一共有4种触摸屏接口模式,其中,自动(连续)XY坐标转换模式和等待中
断模式应用比较常见。
1. 普通转换模式
单转换模式是最合适的通用 ADC 转换。此模式可以通过设置 ADCCON(ADC 控制寄存器)初始化并且通过读写ADCDAT0(ADC 数据寄存器 0)就能够完成。
2. 分离的 X/Y 方向转换模式
触摸屏控制器可以工作在两个转换模式之一。分离转换模式如下方法操作。X 方向模式写 X 方向转换数据到ADCDAT0,故触摸屏接口产生中断源给中断控制器。Y 方向模式写
Y方向转换数据到 ADCDAT1,故触摸屏接口产生中断源给中断控制器。
3. 自动(顺序)X/Y 方向转换模式
自动(顺序)X/Y 方向转换模式是系统依次转换触点的X轴坐标和Y轴坐标。触摸屏控制器顺序变换被触点 X 方向和 Y 方向。触摸控制器在写入 X 测量数值到 ADCDAT0低10位
中 和写入 Y 测量数值到ADCDAT1 低10位中后,触摸屏接口产生中断源给中断控制器。
4. 等待中断模式
当笔尖落下时触摸屏控制器产生中断(INT_TC)信号。等待中断模式设置值为 rADCTSC=0xd3; // XP_PU, XP_Dis,XM_Dis,YP_Dis,YM_En
触摸屏控制器产生中断信号(INT_TC)后,必须清除等待中断模式。(XY坐标的测量模式也就是 XY_PST 设置到无操作模式--寄存器ADCTSC的低两位必须清零)
在一般情况下,为实现触摸屏功能,先是设置为等待中断模式,在产生中断后,再设置为自动(连续)XY坐标转换模式,依次读取触点的坐标值。
寄存器 ADCTSC 的第8位能够判断是触笔落下中断还是触笔抬起中断 就如同在windows下应用程序一样鼠标 按下,放开 都会向线程队列中投递消息以区分:
寄存器 ADCTSC 的第3位可以选择上拉电阻的使能,在等待中断模式下,上拉电阻要有效,在触发中断后,上拉电阻要无效。寄存器ADCTSC的第2位用于选择自动
(连续)XY坐标转换模式。触笔抬起/落下中断 状态寄存器ADCUPDN的低2位能够判断触笔在何种状态下引起的中断。
在开始实现触摸屏功能之前,还需要解决一个问题,那就是触摸屏的校正。触摸屏和LCD是两种不同的物理器件。对于一个分辨率为320×240的LCD,它的宽度为320个
像素,高度为240个像素。而触摸屏处理的数据是点的物理坐标,该坐标是通过触摸屏控制器采集得到的。要想实现触摸屏上的物理坐标与LCD上的像素点坐标一一对应上,
两者之间就需要一定的转换,即校正。而且电阻式触摸屏由于自身的原因参数会发生变化,因此需要经常性的校正。比较常见的校正方法是三点校正法,它的原理是:
设LCD上每个点PD的坐标为[XD,YD],触摸屏上每个点PT的坐标为[XT,YT]。要实现触摸屏上的坐标转换为LCD上的坐标,需要下列公式进行转换:
XD=A×XT+B×YT+C YD=D×XT+E×YT+F
因为其中一共有六个参数(A,B,C,D,E,F),因此只需要三个取样点就可以求得这六个参数。这六个参数一旦确定下来,只要给出任意触摸屏上的坐标点PT,代入这个公式,就可以得到它所对应的LCD上像素点的坐标PD。具体的求解过程就不细讲,只给出最终的结果(貌似是线性代数的东东)。已知LCD上的三个取样点为:PD0,PD1,PD2,它们所对应的触摸屏上的三个点为:PT0,PT1,PT2。A,B,C,D,E,F这六个参数最终的结果都是一个分式,而且都有一个共同的分母,为:
K=(XT0-XT2)×(YT1-YT2)-(XT1-XT2)×(YT0-YT2)
A=[(XD0-XD2)×(YT1-YT2)-(XD1-XD2)×(YT0-YT2)] / K B=[(XT0-XT2)×(XD1-XD2)-(XD0-XD2)×(XT1-XT2)] / K C=[YT0×(XT2×XD1-XT1×XD2)+YT1×(XT0×XD2-XT2×XD0)+YT2×(XT1×XD0-XT0×XD1)] / K D=[(YD0-YD2)×(YT1-YT2)-(YD1-YD2)×(YT0-YT2)] / K E=[(XT0-XT2)×(YD1-YD2)-(YD0-YD2)×(XT1-XT2)] / K F=[YT0×(XT2×YD1-XT1×YD2)+YT1×(XT0×YD2-XT2×YD0)+YT2×(XT1×YD0-XT0×YD1)] / K
下面的程序是实现触摸屏功能的简单实例——以触点为中心,绘制出一个红色的边长为10个像素的正方形。触点的坐标是用下面方法得到的:当触笔落下时,进入中断,
然后读取触点处的坐标,直到触笔的抬起,才退出该次中断。由于触摸屏需要校正,因此在使用之前需要进行校正处理。但并不是每次使用都要校正,只要坐标没有发生漂移,就不需要再次校正。所以在进行一次校正后,只要把那几个参数保存起来,下次需要时直接使用上次保存下来的参数即可。在这里,我们利用EEPROM来保存这几个参数,
即A,B,C,D,E,F,K分别保存在以0x20,0x30,0x40,0x50,0x60,0x70,0x80为首地址内存的连续4个字节空间内,另外内存地址0x1F保存一个标识信息,当为0x6A时,表示这几个
参数已计算并保存好了,只需从上述内存地址中读取参数就行,而当为其他值时,就需要进行校正。校正时,需要三个取样点,在这里我们选取LCD上的(32,24),(160,216),(288,120)为这三个取样点,我们在这三个取样点上画一个十字(如下图所示),只需要依次点击这三个点,即可完成触摸屏的校正。
这个模块代码我实验了很久都无法通过,按照操作顺序 先设置为等待 中断模式 之后怎么也无法产生中断。
代码也就没有 git push 了。等以后再研究研究
参考文章:
http://blog.csdn.net/zhaocj/article/details/5510536
s3c2440 文档。