/**********************************************************************************
NAME: Touchpanel.c
DESC: ADC & Touch screen test
HISTORY:
2003.09.23:Leon YH KIM: draft ver 1.0
***********************************************************************************/
#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=%03d XP=%04d, YP=%04d\n", count++, xdata, ydata); //输出坐标信息
rADCDLY=saveAdcdly; //延时,等待串口输出
rADCTSC=rADCTSC&~(1<<8); //重新设为触摸笔按下中断,为下次的触摸做准备
rSUBSRCPND|=BIT_SUB_TC; //清除中断标志
rINTSUBMSK=~(BIT_SUB_TC); //重新开启中断
ClearPending(BIT_ADC);
}
参考网址:
阅读(2397) | 评论(0) | 转发(1) |