Date: 21-Nov-2011
1.TOUCH SCREEN控制框图
2.中断控制器控制框图
正确理解INT_ADC中断源是编写触摸屏中断处理程序的关键。INT_ADC有二个次级中断源INT_TC及INT_ADC_S,只要任意一个次级中断源产生并且相应的SUBMASK未起作用,那么SRCPND寄存器上的INT_ADC位就会置位,对应的MASK未起作用,就会触发中断。触笔按下,会产生INT_TC中断,此时再启动ADC转换获取触笔坐标,转换结束产生INT_ADC_S中断。次级中断源信号会在SUBSRCPND对应的位上置位,而且需要手动清除。
3.TOUCH SCREEN寄存器设置
static void TS_Port_Init(void){
//ADC转换延迟时间设置
//ADC转换之前Touch Screen使用3.68Mhz的x-tal clock作为时钟信号源
//那么延迟时间为(1/3.68M)*rADCDLY
rADCDLY=5000;//Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
//ADC工作方式设置
//ADC转换频率计算(必须<PCLK/5)
rADCCON=(1<<14)+(0x31<<6); //ADCPRS En, ADCPRS Value
//Touch Screen工作方式设置->等待触笔按下中断模式
rADCTSC=0xd3; //wait for Interrupe mode,detect stylus down interrupt
}
4.代码分析 Touchscreen.c
#include "2440addr.h"
#include "2440lib.h"
#include "UART.h"
#include "def.h"
#include "option.h"
static U32 count = 0; //Count
//Touch Screen寄存器设置
static void TS_Port_Init(void){
rADCDLY=50000;//Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
rADCCON=(1<<14)+(0x31<<6); //ADCPRS En, ADCPRS Value
rADCTSC=0xd3; //wait for Interrupe mode,detect stylus down interrupt
}
//Touch Screen中断处理程序
static void __irq AdcTsAuto(void){
static U16 xdata=0,ydata=0;
U32 r;
EnterCritical(&r);
if(rSUBSRCPND & BIT_SUB_TC) //触笔按下产生INT_TC中断
{
ClearSubPending(BIT_SUB_TC); //清中断源
UART0_Printf("Stylus down!\n");//输出触笔按下信息
//设置转换模式
rADCTSC |= (1<<2); // X,Y自动连续转换
//启动ADC转换
rADCCON |= (1<<0);
}
if(rSUBSRCPND & BIT_SUB_ADC) //转换完成产生INT_ADC_S中断
{
ClearSubPending(BIT_SUB_ADC); //清中断源
//获取X/Y坐标值
xdata=(rADCDAT0 & 0x3ff);
ydata=(rADCDAT1 & 0x3ff);
UART0_Printf("count=%03d XP=%04d, YP=%04d\n", count++, xdata, ydata); //输出坐标信息
//Touch Screen工作方式设置->等待触笔松开中断模式
rADCTSC = 0xd3;
rADCTSC |= (1<<8);
while(1){
if(rSUBSRCPND & BIT_SUB_TC) //此次中断源为触笔松开所产生
{
ClearSubPending(BIT_SUB_TC);
UART0_Printf("Stylus up!\n");
rADCTSC = 0xd3; //重新设置为等待中断模式,等待按下。
break; //跳出循环
}
}
}
ClearPending(BIT_ADC); //清中断源
ExitCritical(&r);
}
void TouchScreen_Test(void)
{
TS_Port_Init(); //Touch Screen寄存器设置
pISR_ADC = (int)AdcTsAuto; //安装中断处理程序
//开中断使能
EnableIrq(BIT_ADC);
EnableSubIrq(BIT_SUB_TC);
EnableSubIrq(BIT_SUB_ADC);
while(UART0_GetKey()!=ESC_KEY)
{
UART0_Printf("Press Touch Screen...\n");
Delay(1000);
}
//禁止中断
DisableSubIrq(BIT_SUB_ADC);
DisableSubIrq(BIT_SUB_TC);
DisableIrq(BIT_ADC);
}
5.测试程序及结果
#include "UART.h"
#include "TOUCHSCREEN.h"
int Main(void){
UART0_Port_Init(115200); //UART端口初始化
TouchScreen_Test();
while(1){
;
}
return 0;
}