article from : http://blog.sina.com.cn/s/blog_684e87fa0101005c.html
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"
#define REQCNT 30
#define ADCPRS 9
//YH0627,AD转换器预分频器值
#define LOOP 1
void __irq AdcTsAuto(void);
//中断程序
int count=0;
//触摸屏次数的记录
volatile int xdata, ydata;
//x、y坐标
void Test_Touchpanel(void)
{
;ADC转换之前Touch Screen使用3.68MHZ的X-TAL CLOCK作为时钟信号源
;ADC转换延迟时间设置
;那么延迟时间为(1/3.68M)*rADCDLY
开始中断前的第一步(延迟):
rADCDLY=50000;
//Normal conversion mode delay about (1/3.6864M)*50000=13.56ms,即ADC延时寄存器,设置等待转换测量时间(从中断开始,到转换开始时间)
开始中断前的第二步(使能):
rADCCON=(1<<14)+(ADCPRS<<6);
//预分频:PCLK/10,分频位使能,A/D 转换器频率 = PCLK / (预分频值+1);//转换时间 = 1/(AD转换频率/ 5 周期)
Uart_Printf("ADC touch screen test\n");
开始中断前的第三步(配置):
rADCTSC=0xd3;
//Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En.为等待触笔按下中断模式
开始中断前的第四步(开中断):
pISR_ADC = (int)AdcTsAuto;
//安装中断处理程序,把真正的中断函数写进去
rINTMSK=~BIT_ADC;
//ADC中断屏蔽位无效,ADC总中断INT_ADC开启
rINTSUBMSK=~(BIT_SUB_TC);
//ADC触摸屏子中断开启
Uart_Printf("\nType any key to exit!!!\n");
Uart_Printf("\nStylus Down, please...... \n");
Uart_Getch();
//该函数作用在于等待用户的触摸,然后触发中断,其实为等待触摸中断,直到用户从键盘随便输入一个字符后,结束该死循环,然后往下继续执行
最后关闭中断:
rINTSUBMSK|=BIT_SUB_TC;
//关闭ADC触摸屏子中断
rINTMSK|=BIT_ADC;
//关闭ADC总中断
Uart_Printf("Touch Screen Test is Finished!!!\n");
}
==============================================================================
中断开始了!!!!
==============================================================================
;进入中断,进行转换,每触摸一下屏幕,就进入该函数,进行A/D转换,一个触摸中断为:触摸笔按下到触摸笔抬起,不抬起的话,中断就没结束.
void __irq AdcTsAuto(void)
{
int i;
U32 saveAdcdly;
1.设置为按下触发中断
if(rADCDAT0&0x8000)
//ADCDAT0[15]=1光标提起状态,ADCDAT0[15]=0光标按下状态
{
//Uart_Printf("\nStylus Up!!\n");
rADCTSC&=0xff;
// Set stylus down interrupt bit
}
//else
//Uart_Printf("\nStylus Down!!\n");
2.重新配置
rADCTSC=(1<<3)|(1<<2);
//得到转换数据,XP上拉禁止,自动连续XY坐标转换模式开启,清XY_PST
saveAdcdly=rADCDLY;
rADCDLY=40000;
//Normal conversion mode delay about (1/50M)*40000=0.8ms,即重设等待转换测量时间
rADCCON|=0x1;
//start ADC
while(rADCCON & 0x1);
//检测ADC转换是否开始,开始后,该位会被自动清零
while(!(rADCCON & 0x8000));
//等待转换结束,可以读取转换后的数值了
while(!(rSRCPND & (BIT_ADC)));
//判断ADC的中断悬挂位BIT_ADC,若为1,则说明该中断已经产生,可以处理按下的数据了
xdata=(rADCDAT0&0x3ff);
//读取X方向的转换数值
ydata=(rADCDAT1&0x3ff);
//YH 0627, To check Stylus Up Interrupt.
rSUBSRCPND|=BIT_SUB_TC;
//清除子中断标志
ClearPending(BIT_ADC);
rINTSUBMSK=~(BIT_SUB_TC);
//重新打开中断,为触摸笔抬起中断做准备
rINTMSK=~(BIT_ADC);
//这一次的中断设为触笔抬起中断,触摸笔抬起了,一个触摸中断才算结束,才可以读取数据
rADCTSC =0xd3;
//再设为等待中断模式
rADCTSC=rADCTSC|(1<<8);
//设置为触笔抬起中断,但不读取此中断的数据,因为按下和抬起是同一点,上面已经处理了按下的数据
while(1)
//等待触笔的抬起
{
if(rSUBSRCPND & (BIT_SUB_TC))
//判断ADC子中断
BIT_SUB_TC
{
//Uart_Printf("Stylus Up Interrupt~!\n");
break;
//说明笔尖已经抬起,一个触摸中断终于结束,下面读取数据
,跳出循环
}
}
Uart_Printf("count=d XP=d, YP=d\n", count++, xdata, ydata);
//输出坐标信息
rADCDLY=saveAdcdly;
//延时,等待串口输出
rADCTSC=rADCTSC&~(1<<8);
//重新设为触摸笔按下中断,为下次的触摸做准备
rSUBSRCPND|=BIT_SUB_TC;
//清除中断标志
rINTSUBMSK=~(BIT_SUB_TC);
//重新开启中断
ClearPending(BIT_ADC);
}