<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > S3C2440 觸摸屏應(yīng)用

          S3C2440 觸摸屏應(yīng)用

          作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
          s3c2440集成了4線制電阻式的觸摸屏接口,觸點(diǎn)坐標(biāo)的檢測是通過A/D轉(zhuǎn)換來實現(xiàn)的。s3c2440一共有4種觸摸屏接口模式,其中,自動(連續(xù))XY坐標(biāo)轉(zhuǎn)換模式和等待中斷模式應(yīng)用地比較常見。等待中斷模式是在觸筆落下時產(chǎn)生一個中斷,在這種模式下,A/D觸摸屏控制寄存器ADCTSC的值應(yīng)為0xD3,在系統(tǒng)響應(yīng)中斷后,XY坐標(biāo)的測量模式必須為無操作模式,即寄存器ADCTSC的低兩位必須清零。自動(連續(xù))XY坐標(biāo)轉(zhuǎn)換模式是系統(tǒng)依次轉(zhuǎn)換觸點(diǎn)的X軸坐標(biāo)和Y軸坐標(biāo),其中X軸坐標(biāo)值寫入寄存器ADCDAT0的低10位中,Y軸坐標(biāo)寫入寄存器ADCDAT1的低10位中,在這種模式下,系統(tǒng)同樣會產(chǎn)生中斷信號。在一般情況下,為實現(xiàn)觸摸屏功能,先是設(shè)置為等待中斷模式,在產(chǎn)生中斷后,再設(shè)置為自動(連續(xù))XY坐標(biāo)轉(zhuǎn)換模式,依次讀取觸點(diǎn)的坐標(biāo)值。在實現(xiàn)觸摸屏功能的過程中,除了上面介紹的幾個寄存器外,還會用到以下寄存器。寄存器ADCTSC的第8位能夠?qū)崿F(xiàn)是觸筆落下中斷還是觸筆抬起中斷,如果寫過基于視窗應(yīng)用程序的人對這一點(diǎn)會很熟悉,它就好像單擊鼠標(biāo)操作一樣,一次單擊操作包括兩個動作:按下和釋放,這兩個動作可以完成不同的命令。寄存器ADCTSC的第3位可以選擇上拉電阻的使能,在等待中斷模式下,上拉電阻要有效,在觸發(fā)中斷后,上拉電阻要無效。寄存器ADCTSC的第2位用于選擇自動(連續(xù))XY坐標(biāo)轉(zhuǎn)換模式。觸筆抬起/落下中斷狀態(tài)寄存器ADCUPDN的低2位能夠判斷觸筆在何種狀態(tài)下引起的中斷。A/D延時寄存器ADCDLY可以設(shè)置開始中斷到真正開始A/D轉(zhuǎn)換這段時間的延時長度,它的時鐘源頻率為3.68MHz。

          在開始實現(xiàn)觸摸屏功能之前,還需要解決一個問題,那就是觸摸屏的校正。觸摸屏和LCD是兩種不同的物理器件。對于一個分辨率為320×240的LCD,它的寬度為320個像素,高度為240個像素。而觸摸屏處理的數(shù)據(jù)是點(diǎn)的物理坐標(biāo),該坐標(biāo)是通過觸摸屏控制器采集得到的。要想實現(xiàn)觸摸屏上的物理坐標(biāo)與LCD上的像素點(diǎn)坐標(biāo)一一對應(yīng)上,兩者之間就需要一定的轉(zhuǎn)換,即校正。而且電阻式觸摸屏由于自身的原因參數(shù)會發(fā)生變化,因此需要經(jīng)常性的校正。比較常見的校正方法是三點(diǎn)校正法,它的原理是:

          本文引用地址:http://www.ex-cimer.com/article/201611/319210.htm

          設(shè)LCD上每個點(diǎn)PD的坐標(biāo)為[XD,YD],觸摸屏上每個點(diǎn)PT的坐標(biāo)為[XT,YT]。要實現(xiàn)觸摸屏上的坐標(biāo)轉(zhuǎn)換為LCD上的坐標(biāo),需要下列公式進(jìn)行轉(zhuǎn)換:

          XD=A×XT+B×YT+C

          YD=D×XT+E×YT+F

          因為其中一共有六個參數(shù)(A,B,C,D,E,F),因此只需要三個取樣點(diǎn)就可以求得這六個參數(shù)。這六個參數(shù)一旦確定下來,只要給出任意觸摸屏上的坐標(biāo)點(diǎn)PT,代入這個公式,就可以得到它所對應(yīng)的LCD上像素點(diǎn)的坐標(biāo)PD。具體的求解過程就不細(xì)講,只給出最終的結(jié)果。已知LCD上的三個取樣點(diǎn)為:PD0,PD1,PD2,它們所對應(yīng)的觸摸屏上的三個點(diǎn)為:PT0,PT1,PT2。A,B,C,D,E,F這六個參數(shù)最終的結(jié)果都是一個分式,而且都有一個共同的分母,為:

          K=(XT0-XT2)×(YT1-YT2)-(XT1-XT2)×(YT0-YT2)

          那么這六個參數(shù)分別為:

          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

          下面的程序是實現(xiàn)觸摸屏功能的簡單實例——以觸點(diǎn)為中心,繪制出一個紅色的邊長為10個像素的正方形。觸點(diǎn)的坐標(biāo)是用下面方法得到的:當(dāng)觸筆落下時,進(jìn)入中斷,然后讀取觸點(diǎn)處的坐標(biāo),直到觸筆的抬起,才退出該次中斷。由于觸摸屏需要校正,因此在使用之前需要進(jìn)行校正處理。但并不是每次使用都要校正,只要坐標(biāo)沒有發(fā)生漂移,就不需要再次校正。所以在進(jìn)行一次校正后,只要把那幾個參數(shù)保存起來,下次需要時直接使用上次保存下來的參數(shù)即可。在這里,我們利用EEPROM來保存這幾個參數(shù),即A,B,C,D,E,F,K分別保存在以0x20,0x30,0x40,0x50,0x60,0x70,0x80為首地址內(nèi)存的連續(xù)4個字節(jié)空間內(nèi),另外內(nèi)存地址0x1F保存一個標(biāo)識信息,當(dāng)為0x6A時,表示這幾個參數(shù)已計算并保存好了,只需從上述內(nèi)存地址中讀取參數(shù)就行,而當(dāng)為其他值時,就需要進(jìn)行校正。校正時,需要三個取樣點(diǎn),在這里我們選取LCD上的(32,24),(160,216),(288,120)為這三個取樣點(diǎn),我們在這三個取樣點(diǎn)上畫一個十字(如下圖所示),只需要依次點(diǎn)擊這三個點(diǎn),即可完成觸摸屏的校正。

          以上文字從網(wǎng)上摘錄。覺得寫得不錯,當(dāng)做筆記記下,我下面貼出的方法為裸奔三部曲中的方法,我驗證了一下,不錯,誤差很小了,不到4個像素點(diǎn)。下面只貼出觸摸屏初始化函數(shù)和中斷函數(shù)的代碼

          [cpp]view plaincopy
          1. voidTouch_Init(void)
          2. {
          3. rADCDLY=50000;//正常轉(zhuǎn)換模式下延時
          4. rADCCON=(1<<14)|(ADCPRS<<6);//使能AD轉(zhuǎn)換預(yù)分頻器
          5. rADCTSC=0xd3;//等待中斷模式,正常AD轉(zhuǎn)換,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;//清除中斷標(biāo)志
          10. rINTMSK&=~BIT_ADC;
          11. rINTSUBMSK&=~(BIT_SUB_TC);//使能中斷
          12. pISR_ADC=(unsigned)AdcTsAuto;//中斷服務(wù)程序入口
          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轉(zhuǎn)換
          13. for(i=0;i<5;i++)
          14. {
          15. while(rADCCON&0x1);//判斷使能ADC轉(zhuǎn)換后被清零
          16. while(!(rADCCON&0x8000));//等待轉(zhuǎn)換結(jié)束
          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轉(zhuǎn)換值轉(zhuǎn)換為LCD像素點(diǎn)的值
          33. //checkStylusUpInterrupt.
          34. rSUBSRCPND|=BIT_SUB_TC;
          35. ClearPending(BIT_ADC);
          36. rINTSUBMSK=~(BIT_SUB_TC);
          37. rINTMSK=~(BIT_ADC);//清中斷標(biāo)志,再次使能中斷
          38. rADCTSC=0xd3;//再次設(shè)置等待中斷模式,這一次是判斷觸筆的抬起
          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=%04dn",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. }



          關(guān)鍵詞: S3C2440觸摸屏驅(qū)動代

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();