ADC觸摸屏轉(zhuǎn)換---那些年我們一起玩mini2440(arm9)裸機(jī)
觸摸屏工作原理:
四線電阻屏結(jié)構(gòu),是在玻璃或丙稀酸基板上覆蓋兩層均勻?qū)щ姷腎TO層,分別作為x電極和y電極,他們之間由均勻排列的透明格點(diǎn)分來(lái)絕緣。X電極和y電極的正負(fù)端由導(dǎo)電線(黑色粗體線)從兩端引出,引出x-,x+,y-,y+.
當(dāng)接觸觸摸屏表面并施加壓力時(shí),上層的ITO導(dǎo)電層和下層的ITO導(dǎo)電層發(fā)生接觸,形成上面右圖的等效電路。
1.y坐標(biāo)計(jì)算:
在y+加驅(qū)動(dòng)電壓V-drive,y-接地。X+作為引出端測(cè)量接觸點(diǎn)的電壓,由于ITO層均勻?qū)щ姡|電電壓與V-drive電壓之比等于Y坐標(biāo)與屏高度之比。
2.x坐標(biāo)計(jì)算:
在x+加驅(qū)動(dòng)電壓V-drive電壓,x-接地。Y+作為引出端測(cè)量接觸點(diǎn)的電壓,由于ITO層均勻?qū)щ?,觸點(diǎn)電壓與V-drive電壓比等于x坐標(biāo)與屏寬度之比。
y=Vx/V-driv *heightx=Vy/ V-driv * width
觸摸屏工作流程(理解好這幾步流程,代碼至少能看懂30%)
1.設(shè)置觸摸屏接口為等待中斷模式,等待觸摸屏被按下。
2.如果中斷(INT_TC)發(fā)生,選擇X,Y坐標(biāo)轉(zhuǎn)換模式(x/y坐標(biāo)分別轉(zhuǎn)換模式,x/y坐標(biāo)自動(dòng)轉(zhuǎn)換),啟動(dòng)AD轉(zhuǎn)換。
3.當(dāng)AD轉(zhuǎn)換完后,通過(guò)中斷(INT_ADC),獲取x/y坐標(biāo),
ADCDAT0 bit[9:0]-x坐標(biāo);
ADCDAT1 bit[9:0]-y坐標(biāo);
4.設(shè)置觸摸屏接口為等待中斷模式,等待觸摸筆離開觸摸屏。
5.返回步驟1,等待下次觸摸筆被按下。
#defineGLOBAL_CLK1
#include
#include
#include"def.h"
#include"option.h"
#include"2440addr.h"
#include"2440lib.h"
#include"2440slib.h"
#include"mmu.h"
#include"profile.h"
#include"memtest.h"
#defineADC_FREQ2500000
//#defineADC_FREQ1250000
intcount=0;
volatileU32preScaler;
intxdata,ydata;
voidTest_Touchpanel(void);
staticvoid__irqAdcTsAuto(void);
staticvoidcal_cpu_bus_clk(void);
voidSet_Clk(void);
/*************************************************
Functionname:delay
Parameter:times
Description:延時(shí)函數(shù)
Return:void
Argument:void
Autor&date:Daniel
**************************************************/
voiddelay(inttimes)
{
inti,j;
for(i=0;i for(j=0;j<400;j++); } /************************************************* Functionname:Main Parameter:void Description:主功能函數(shù) Return:void Argument:void Autor&date:Daniel **************************************************/ intMain(void) { intScom=0; MMU_Init(); Set_Clk(); Uart_Init(0,115200); Uart_Select(Scom); //Uart_Printf("nHelloWorld!n"); Test_Touchpanel(); while(1); return0; } /************************************************* Functionname:Test_Touchpanel Parameter:void Description:觸摸屏初始化 Return:void Argument:void Autor&date:Daniel **************************************************/ voidTest_Touchpanel(void) { rADCDLY=50000;//Normalconversionmodedelayabout(1/3.6864M)*50000=13.56ms /*設(shè)置AD轉(zhuǎn)頻率*/ preScaler=ADC_FREQ; Uart_Printf("ADCconv,freq.=%dHzn",preScaler); preScaler=50000000/ADC_FREQ-1;//PCLK=50M rADCCON=(1<<14)|(preScaler<<6);//ADCPRSEn,PRSCVL //rADCCON=(1<<14)+(preScaler<<6);//ADCPRSEn,ADCPRSValue Uart_Printf("ADCtouchscreentestn"); /*設(shè)置觸摸屏為等待中斷模式,等待觸摸筆被按下*/ rADCTSC=0xd3;//Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En /*clearirq*/ //ClearPending(BIT_ADC); rSRCPND=0x80000000; rINTPND=0x80000000; ClearSubPending(BIT_SUB_TC); pISR_ADC=(U32)AdcTsAuto; /*enableINT_TCirq*/ //EnableIrq(BIT_ADC); rINTMSK=0x7fffffff;//允許中斷 EnableSubIrq(BIT_SUB_TC); } /************************************************* Functionname:AdcTsAuto Parameter:void Description:中斷服務(wù)程序 Return:void Argument:void Autor&date:Daniel **************************************************/ staticvoid__irqAdcTsAuto(void) { U32saveAdcdly; /****************stylus down************************/