触摸屏初始化
1、设置AD转换时钟;
1.1使能预分频
1.2设置预分频值(设置的PCLK为66HZ)
1.3关闭第[2]位:静态模式设置为普通模式;否则无法进行AD转换
1.4
设置
AD转换之间的延时,这里使用轮询的方式查看AD是否转换完成,则参考别的代码设置
ADCDLY = 0xffff;
2、设置中断
2.1
将中断处理函数写入中断向量表中对应地址(
VIC1VECTADDR30
),中断发生时从对应地址找出中断处理函数;
2.2
设置中断屏蔽位--即使能其中断源(
VIC1INTENABLE [30]
)(TC中断、关闭
ADC中断);
注:中断包括两个中断:1
、ADC中断,AD转换完成产生中断
。2、tc中断:按下或弹起屏幕产
生中断 本次选用TC中断
3、进入等待中断模式
---->当触摸笔按下或弹起;ADCTSC寄存器的值为0Xd3,且当产生中断之后,等待中断模式被清除,
ADCTSC寄存器的值为0Xd3时,表示等待按下中断;
ADCTSC寄存器的值为0X1d3时,表示等待弹起中断;注意观察ADCTSC寄存器的第[8]位
对应代码:
void ts_init(void)
{
/* 一般的设置:比如时钟 */
ADCCON &= ~((0xff << 6) | (1<<2));
ADCCON |= (1<<14) | (65<<6);
//ADCCLRINT = 1;//清除AD中断
ADCCLRINTPNDNUP = 1;
ADCDLY = 0xffff;
/* 中断设置 */
VIC1VECTADDR30 = irq_pen_down_up;
VIC1INTENABLE |= (1<<30); /* 使能INT_PENDNUP, INT_ADC */
wait_for_pen_down();
}
TC中断处理 (注意处理中断时环境的保存与恢复)
先判断是按下中断还是弹起中断:
一: 若为按下中断则进行以下步奏1、2、3:
1、启动XY坐标自动转换(
使能AD自动转换--ADCTSC[2]
,并启动自动
自动转换--ADCCON[0]
);
图4:ADCTSC[2]
图5:
ADCCON[0]
2、等待转换完成--
ADCCON[15](此步换成检测是否启动自动转换也可---ADCCON[0]被清除)
图6:
ADCCON[15]
3、获取坐标---ADCDAT0[9:0]、ADCDAT1[9:0](可在此设置串口输出)
ADCDAT0[9:0]
ADCDAT1[9:0]
4、进入等待弹起中断
5、清除中断向量表
6、再次进入等待按下中断模式
二:若为弹起中断则直接进入等待按下中断模式;并清除中断向量表
对应代码:
void irq_pen_down_up(void)
{
//1、保存环境
__asm__(
"sub lr, lr, #4\n"
"stmfd sp!, {r0-r12,lr}\n"
);
//2、处理部分
if (ADCDAT0 & (1<<15))//弹起
{
printf("pen up\n\r");
wait_for_pen_down();
}
else
{
printf("pen down\n\r");
auto_measure_xy_mode();
start_adc();
while(ADCCON & 0x01);//设置AD自动转换,启动转换后此位自动清零;貌似ADCCON[0]位未自动清零
x = (ADCDAT0&0X3FF);
y = (ADCDAT1&0X3FF);
wait_for_pen_up();
printf("[x,y] = [%d, %d]\n\r", x, y);
}
//3、清除中断
ADCUPDN = 0;
ADCCLRINTPNDNUP = 0;
VIC1ADDRESS = 0;
VIC0ADDRESS = 0;
//4、恢复环境
__asm__(
"ldmfd sp!, {r0-r12,pc}^\n"
:
:
);
}
注意事项:
使用中断时注意2410与6410的中断模式不一致。6410采用中断向量表的方式存放,将同一中断源对应的中断放入该中断源的中断向量表地址内
注:触摸屏与LCD为两个独立的硬
件,所以存在校准问题
未使用AD中断模式去采样数据。