对于touch screem的使用:
3. Auto(Sequential) X/Y Position Conversion Mode (AUTO_PST=1, XY_PST=0)
Auto (Sequential) X/Y Position Conversion Mode is operated in the following method: Touch screen controller
sequentially converts X-Position and Y-Position that is touched. After Touch screen controller writes Xmeasurement
data to ADCDAT0 and writes Y-measurement data to ADCDAT1, Touch screen interface
generates Interrupt (INT_ADC). The measurement states are automatically changed. When X-Position is
detected, XP and XM switch is automatically on and ADC channel selection bits are automatically changed
to ’5’. And then when X-Position is detected, YP and YM switch is automatically on and ADC channel selection
bits are automatically changed to ’7’. After Auto X/Y position conversion, mode is changed for pull-up interrupt
detection (ADCTSC = 0x173)
首先pen down;
检测到中断,清标志位
启动AD转换,确定x/y位置
清AD中断
等待pen up
检测到中断,清标志位
做一些我们想要的操作
恢复到等待pen down的模式
1.设置ADC转化要用的时钟
2.配置中断允许和清除标志位
3.进入等待中断模式
在ADCCON中设置

[16]使用10bitAD转化;[15]只读,用来读取AD转化是否完成;[14]使能AD预分频;[13:6]设置AD预分频,保证AD的时钟频率小于PCLK的1/5,我们PCLK为50MHz,所以我们用1MHz,填入49;
void ts_init()
{
ADCCON=(1<<14)|(49<<6);
ADCCLRINT=0; //清除ADC中断
ADCCLRINTPNDNUP=0; //清除pen中断
ADCDLY=0xffff; //ADC Start or Interval Delay Register,为ADC转化延时
VIC1INTENABLE=(0b1<<30); //使能ADC关于pen的中断
ADCTSC=0xd3; //进入等待pen中断的模式
}
在中断处理文件里面往VIC1VECTADDR30地址添加中断处理函数,即执行ts_handler

Note: 1) While waiting for Touch screen Interrupt, XP_SEN bit must be set to ‘1’, namely ‘Switch disable’
and PULL_UP bit must be set to ‘0’, namely ‘XP Pull-up enable’.
2) AUTO_PST bit should be set ‘1’ only in Automatic & Sequential X/Y Position conversion.
3) If you don’t use AIN[7], you must tie AIN [7] to VDDA_ADC or ADCTSC register must be setting to 0xd3.
void ts_handler()
{
//clear the IFs
ADCUPDN=0; //进入中断处理函数后先通过特殊的寄存器清除中断标记(这里比较特殊,通过配置寄存器清除中断标志位),这三个寄存器
ADCCLRINT=0;
ADCCLRINTPNDNUP=0;
VIC0ADDRESS=0; //清除中断
VIC1ADDRESS=0;
ADCTSC=(1<<2); //进入AD转换,并且自动区分x/y
ADCCON=(0b1<<0)|(1<<14)|(49<<6); //开始AD转换
while(!((ADCCON>>15)&1)); //等待AD转换完成(通过检测ADCCON的第15位)
xdat=ADCDAT0&0x3ff; //在ADCDAT0和ADCDAT1中的最低10位读取x/y值
ydat=ADCDAT1&0x3ff;
ADCTSC=0x1d3; //进入等待pen弹起的模式
while(1) //TC[9] 等待pen弹起
{
if((ADCUPDN>>1)&0b1)
break;
}
ADCCLRINT=0; //清除pen弹起产生的中断
ADCCLRINTPNDNUP=0;
ADCUPDN=0;
VIC0ADDRESS=0;
VIC1ADDRESS=0;
printf("\n\rx=%d , y=%d\n\r",xdat,ydat); //在串口输出x/y的位置
ADCTSC=0xd3; //恢复等待pen按下的操作,为等待下一次pen的按下
}
在这里有一个注意的是在ADCCLRINT,ADCCLRINTPNDNUP写入数据会清除中断,但是在ADCUPDN里面还会有标志位,这个寄存器是可读可写的,要把它改为0
贴上完整代码
#define ADCCON *((volatile unsigned long*)0x7E00B000)
#define ADCTSC *((volatile unsigned long*)0x7E00B004)
#define ADCDAT0 *((volatile unsigned long*)0x7E00B00C)
#define ADCDAT1 *((volatile unsigned long*)0x7E00B010)
#define ADCCLRINT *((volatile unsigned char*)0x7E00B018)
#define ADCCLRINTPNDNUP *((volatile unsigned char*)0x7E00B020)
#define ADCUPDN *((volatile unsigned char*)0x7E00B014)
#define VIC1INTENABLE *((volatile unsigned long*)0x71300010)
#define VIC0INTENABLE *((volatile unsigned long*)0x71200010)
#define ADCDLY *((volatile unsigned long*)0x7E00B008)
#define VIC0ADDRESS *((volatile unsigned long*)0x71200F00)
#define VIC1ADDRESS *((volatile unsigned long*)0x71300F00)
int xdat=0,ydat=0;
void ts_init()
{
ADCCON=(1<<14)|(49<<6);
ADCCLRINT=0;
ADCCLRINTPNDNUP=0;
ADCDLY=0xffff;
VIC1INTENABLE=(0b1<<30);
ADCTSC=0xd3;
}
void ts_handler()
{
ADCUPDN=0;
ADCCLRINT=0;
ADCCLRINTPNDNUP=0;
VIC0ADDRESS=0;
VIC1ADDRESS=0;
ADCTSC=(1<<2);
ADCCON=(0b1<<0)|(1<<14)|(49<<6);
while(!((ADCCON>>15)&1));
xdat=ADCDAT0&0x3ff;
ydat=ADCDAT1&0x3ff;
ADCTSC=0x1d3;
while(1) //TC[9]
{
if((ADCUPDN>>1)&0b1)
break;
}
ADCCLRINT=0;
ADCCLRINTPNDNUP=0;
ADCUPDN=0;
VIC0ADDRESS=0;
VIC1ADDRESS=0;
printf("\n\rx=%d , y=%d\n\r",xdat,ydat);
ADCTSC=0xd3;
}
void delay()
{
unsigned int i,j;
for(i=0;i<=100;i++)
for(j=0;j<=60;j++);
}