S3C2440對于觸摸屏的相關(guān)interface有以下幾個模式:1.普通轉(zhuǎn)換模式,手冊是這么說的:most likely used for General Purpose ADC Conversion.(不了解這個,所以用原文)
本文引用地址:http://cafeforensic.com/article/201611/322379.htm2.分開X/Y轉(zhuǎn)換模式,就是分開來轉(zhuǎn)換X位置和Y位置。X位置的信息會保存在ADCDAT0的低10位,而Y位置信息則保存在ADCDAT1的低10位。
3.自動X/Y轉(zhuǎn)換模式,就是會把和X和Y一起轉(zhuǎn)換,然后X,Y位置信息保存跟上面一樣,也是在ADCDAT0,ADCDAT1的低10位。(我想一般會用這個模式)
4.等待中斷模式,也就是等待觸摸屏的中斷,ADCTSC=0xd3就是等待筆尖放下時產(chǎn)生中斷,而ADC=0xd3|(1<<8)就是筆尖抬起時產(chǎn)生中斷。
參考手冊弄出來也不難,只是提醒一下ADCUPDN這個寄存器是會標記當前的中斷是筆尖放下還是抬起的。只是讀完之后就要記得把它清0,在這個地方卡了很久,后來想到手冊既然沒說這個寄存器會自動清0,那就自己手動幫他清0吧。果然是這樣。
下面列出關(guān)鍵代碼,使用自動X/Y轉(zhuǎn)換模式:
void __irq lhg_tsINT(void) //中斷函數(shù)
{
rINTSUBMSK |= ((U32)0x1<<9); //關(guān)閉中斷服務(wù)
if ( rADCUPDN&(U32)0x01 )//現(xiàn)在是down
{
ts=0; //這是一個全局變量,調(diào)試時會來登記一下觸摸屏是否轉(zhuǎn)換了新的XY坐標
rADCUPDN=0;
uart_print_str("/r/ndown");//自己做的串口打印函數(shù)
//產(chǎn)生X、Y坐標
rADCTSC = (1<<3)|(1<<2); //上拉電阻無效,自動XY坐標轉(zhuǎn)換模式開啟
rADCCON|=0x1;//開始A/D轉(zhuǎn)換
while( rADCCON & 0x1 ); //等待AD轉(zhuǎn)換開始
//rADCDLY = 40000; //這里比較郁悶,網(wǎng)上有人用這個值,據(jù)手冊里說低15位有效,www.linuxidc.com默認值是0xff,屏蔽掉,不刪免得以后忘記有這個寄存器。
while( !(rADCCON & ((U32)0x1<<15)) ); //等待AD轉(zhuǎn)換結(jié)束
x=(rADCDAT0&0x3ff); //保存x位置
y=(rADCDAT1&0x3ff);//保存y位置
//等待筆觸抬起
//rADCCON=(1<<14)+(9<<6);//設(shè)置A/D預(yù)分頻
rADCTSC =0xd3|(1<<8);//再次設(shè)置等待中斷模式,這一次是判斷觸筆的抬起
}
if ( (rADCUPDN>>1)&(U32)0x01 )//現(xiàn)在是up
{
rADCUPDN=0;
uart_print_str("/r/nup");
ts=1;//標志有xy轉(zhuǎn)換
rADCCON=(1<<14)+(9<<6);//設(shè)置A/D預(yù)分頻
rADCTSC=0xd3;//設(shè)置觸摸屏為等待中斷模式。
}
rSRCPND |= (U32)0x1<<31; //清中斷標志
rSUBSRCPND |=(U32)0x01<<9;
rINTPND |= (U32)0x1<<31;
rINTSUBMSK &= ~((U32)0x1<<9); //打開中斷服務(wù)
}
void init_lhg_ts(void) //初始化觸摸屏
{
uart_print_str("/r/nTouchScreen init");
//確定中斷入口地址
pISR_ADC = (U32)lhg_tsINT;
rADCCON=(1<<14)+(9<<6);//設(shè)置A/D預(yù)分頻
rADCTSC=0xd3;//設(shè)置觸摸屏為等待中斷模式。
//清中斷標志
rSRCPND |= (U32)0x1<<31;
rSUBSRCPND |= (U32)0x01<<9;
rINTPND |= (U32)0x1<<31;
rINTSUBMSK &= ~((U32)0x1<<9);//打開中斷服務(wù)
rINTMSK &= ~((U32)0x1<<31);//打開中斷屏蔽
}
評論