微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440 触摸屏应用

S3C2440 触摸屏应用

时间:11-21 来源:互联网 点击:

要三个取样点,在这里我们选取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. }


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top