专题17-触摸屏显身手
第1课-触摸屏工作原理解析
- 功能与分类
触摸屏作为一种输入设备,是目前最简单、方便的一种人机交互方式,具有坚固耐用、反应速度快、节省空间、易于交流等许多优点。
从技术原理来区别触摸屏,可分为5类:
(1)电阻式触摸屏
(2)电容式触摸屏
(3)红外线技术触摸屏
(4)表面声波技术触摸屏
(5)矢量压力传感技术触摸屏
2. 电容屏原理
当手指触摸屏幕时,两个相互绝缘的导电层在触摸点处连接,顶层的5伏电压就会加到底层触摸点处,底层该点的电压会发生改变。
控制器检测到该点的变化后,将该点的电压进行A/D转换,得到的值与5伏相比,再乘以该轴总长度即可得触摸点靠地那一端的坐标。
3. 电容屏原理
相比于电阻屏,电容屏的优点是感应灵敏,支持多点触摸,更适合现代电子产品的需求。给工作面通上一个很低的电压,当用户触摸屏幕时,手指头吸收走一个很小的电流,这个电流分从触摸屏四个角上的电极中流出,并且理论上流经这四个电极的电流与手指到四角的距离成比例,控制器通过对这四个电流比例的精密计算,得出触摸点的位置。
第2课-电阻屏驱动程序设计
- 初始化
(1) 设置AD转换时钟
(2) 中断屏蔽设置
(3) 进入等待中断模式(按下)
- TC中断处理(按下)
(1) 启动XY坐标自动转化
(2) 等待转化完成,获取坐标
(3) 清除中断
(4) 进入等待TCP中断模式(弹起)
(5) 清除弹起中断
(6) 进入等待中断模式(按下)
int xdata,ydata;
#define ADCCON (*(volatile unsigned *)0x58000000) //ADC control
#define ADCTSC (*(volatile unsigned *)0x58000004) //ADC touch screen control
#define ADCDLY (*(volatile unsigned *)0x58000008) //ADC start or Interval Delay
#define ADCDAT0 (*(volatile unsigned *)0x5800000c) //ADC conversion data 0
#define ADCDAT1 (*(volatile unsigned *)0x58000010) //ADC conversion data 1
/*interrupt registes*/
#define SRCPND (*(volatile unsigned long *)0x4A000000)
#define INTMSK (*(volatile unsigned long *)0x4A000008)
#define INTOFFSET (*(volatile unsigned long *)0x4A000014)
#define SUBSRCPND (*(volatile unsigned long *)0x4A000018)
#define INTSUBMSK (*(volatile unsigned long *)0x4A00001c)
#define INTPND (*(volatile unsigned long *)0x4A000010)
void ts_init()
{
//1. 设置AD转换时钟
ADCCON = (1<<14) | (49<<6);
//2. 设置中断屏蔽位
INTMSK = ~(1<<31);
INTSUBMSK = ~(1<<9);
//3. 进入等待中断的模式
ADCTSC = 0xd3;
}
void tc_handler()
{
//1. 启动xy坐标自动转换
ADCTSC = (1<<2);
ADCCON |= (1<<0);
//2. 等待转换完成
while (!(ADCCON & (1<<15)))
//3. 获取坐标
xdata = ADCDAT0 & 0x3ff;
ydata = ADCDAT1 & 0x3ff;
//4. 清除按下中断
SUBSRCPND |= (1<<9);
SRCPND = (1<<31);
INTPND = (1<<31);
//5. 进入等待弹起中断
ADCTSC = 0xd3;
ADCTSC |= (1<<8);
while(1)
{
if(SUBSRCPND &(1<<9))
break;
}
//6. 清除弹起中断
SUBSRCPND |= (1<<9);
SRCPND = (1<<31);
INTPND = (1<<31);
printf("x is %d,y is %d ",xdata,ydata);
//7. 再次进入等待按下中断的状态
ADCTSC = 0xd3;
}