您的位置 首页 硬件

S3C2440 触摸屏使用

s3c2440集成了4线制电阻式的触摸屏接口,触点坐标的检测是通过AD转换来实现的。s3c2440一共有4种触摸屏接口模式,其中,自动(连

s3c2440集成了4线制电阻式的触摸屏接口,触点坐标的检测是经过A/D转化来完结的。s3c2440一共有4种触摸屏接口形式,其间,主动(接连)XY坐标转化形式和等候中止形式应用地比较常见。等候中止形式是在触笔落下时发生一个中止,在这种形式下,A/D触摸屏操控寄存器ADCTSC的值应为0xD3,在体系呼应中止后,XY坐标的丈量形式有必要为无操作形式,即寄存器ADCTSC的低两位有必要清零。主动(接连)XY坐标转化形式是体系顺次转化触点的X轴坐标和Y轴坐标,其间X轴坐标值写入寄存器ADCDAT0的低10位中,Y轴坐标写入寄存器ADCDAT1的低10位中,在这种形式下,体系同样会发生中止信号。在一般情况下,为完结触摸屏功用,先是设置为等候中止形式,在发生中止后,再设置为主动(接连)XY坐标转化形式,顺次读取触点的坐标值。在完结触摸屏功用的进程中,除了上面介绍的几个寄存器外,还会用到以下寄存器。寄存器ADCTSC的第8位能够完结是触笔落下中止仍是触笔抬起中止,假如写过根据视窗应用程序的人对这一点会很熟悉,它就如同单击鼠标操作相同,一次单击操作包含两个动作:按下和开释,这两个动作能够完结不同的指令。寄存器ADCTSC的第3位能够挑选上拉电阻的使能,在等候中止形式下,上拉电阻要有用,在触发中止后,上拉电阻要无效。寄存器ADCTSC的第2位用于挑选主动(接连)XY坐标转化形式。触笔抬起/落下中止状况寄存器ADCUPDN的低2位能够判别触笔在何种状况下引起的中止。A/D延时寄存器ADCDLY能够设置开端中止到真实开端A/D转化这段时刻的延时长度,它的时钟源频率为3.68MHz。

在开端完结触摸屏功用之前,还需求处理一个问题,那就是触摸屏的校对。触摸屏和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)为这三个取样点,咱们在这三个取样点上画一个十字(如下图所示),只需求顺次点击这三个点,即可完结触摸屏的校对。

以上文字从网上摘抄。觉得写得不错,作为笔记记下,我下面贴出的办法为裸奔三部曲中的办法,我验证了一下,不错,差错很小了,不到4个像素点。下面只贴出触摸屏初始化函数和中止函数的代码

[cpp]view plaincopy

  1. voidTouch_Init(void)
  2. {
  3. rADCDLY=50000;//正常转化形式下延时
  4. rADCCON=(1<<14)|(ADCPRS<<6);//使能AD转化预分频器
  5. rADCTSC=0xd3;//等候中止形式,正常AD转化,XP上拉使能,XP,XM,YP输出制止,YM输出使能
  6. if(rSRCPND&BIT_ADC)rSRCPND|=BIT_ADC;
  7. if(rINTPND&BIT_ADC)rINTPND|=BIT_ADC;
  8. if(rSUBSRCPND&BIT_SUB_TC)rSUBSRCPND|=BIT_SUB_TC;
  9. if(rSUBSRCPND&BIT_SUB_ADC)rSUBSRCPND|=BIT_SUB_ADC;//铲除中止标志
  10. rINTMSK&=~BIT_ADC;
  11. rINTSUBMSK&=~(BIT_SUB_TC);//使能中止
  12. pISR_ADC=(unsigned)AdcTsAuto;//中止服务程序进口
  13. }

[cpp]view plaincopy

  1. void__irqAdcTsAuto(void)
  2. {
  3. unsignedinti;
  4. U32PtX[6],PtY[6];
  5. shorttemp;
  6. if(rADCDAT0&0x8000)
  7. {
  8. rADCTSC&=0xff;//Setstylusdowninterruptbit
  9. }
  10. rADCTSC=(1<<3)|(1<<2);//XP上拉制止,主动次序X,Y丈量
  11. //rADCDLY=50000;
  12. rADCCON|=0x1;//使能AD转化
  13. for(i=0;i<5;i++)
  14. {
  15. while(rADCCON&0x1);//判别使能ADC转化后被清零
  16. while(!(rADCCON&0x8000));//等候转化完毕
  17. while(!(rSRCPND&(BIT_ADC)));//checkifADCisfinishedwithinterruptbit
  18. PtX[i]=(rADCDAT0&0x3ff);
  19. PtY[i]=(rADCDAT1&0x3ff);
  20. }
  21. PtX[5]=(PtX[0]+PtX[1]+PtX[2]+PtX[3]+PtX[4])/5;
  22. PtY[5]=(PtY[0]+PtY[1]+PtY[2]+PtY[3]+PtY[4])/5;
  23. xdata=PtX[5];
  24. ydata=PtY[5];
  25. xdata*=0.272;
  26. ydata*=0.480;
  27. ydata=480-ydata;
  28. temp=ydata;
  29. ydata=xdata;
  30. xdata=temp;
  31. xdata=(xdata-20.0303)/0.8972;
  32. ydata=(ydata-37.86667)/0.7486;//将触摸屏的AD转化值转化为LCD像素点的值
  33. //checkStylusUpInterrupt.
  34. rSUBSRCPND|=BIT_SUB_TC;
  35. ClearPending(BIT_ADC);
  36. rINTSUBMSK=~(BIT_SUB_TC);
  37. rINTMSK=~(BIT_ADC);//清中止标志,再次使能中止
  38. rADCTSC=0xd3;//再次设置等候中止形式,这一次是判别触笔的抬起
  39. rADCTSC=rADCTSC|(1<<8);//检测笔尖抬起中止信号
  40. while(1)//tocheckPen-upstate
  41. {
  42. if(rSUBSRCPND&(BIT_SUB_TC))//checkifADCisfinishedwithinterruptbit
  43. {
  44. break;//ifStylusisup(1)state
  45. }
  46. }
  47. Uart_Printf(“count=%03dXP=%04d,YP=%04d\n”,count++,xdata,ydata);//X-positionConversiondata
  48. //rADCDLY=50000;
  49. rADCTSC=rADCTSC&~(1<<8);//DetectstylusDowninterruptsignal.
  50. rSUBSRCPND|=BIT_SUB_TC;
  51. rINTSUBMSK=~(BIT_SUB_TC);//Unmasksubinterrupt(TC)
  52. ClearPending(BIT_ADC);//再次清A/D中止
  53. }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/262832.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部