本文主要是介绍电阻屏驱动设计---ok6410,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
触摸屏初始化
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中断模式去采样数据。
这篇关于电阻屏驱动设计---ok6410的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!