博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
触摸屏驱动程序设计
阅读量:4285 次
发布时间:2019-05-27

本文共 2528 字,大约阅读时间需要 8 分钟。

触摸屏作为一种输入设备,是目前最简单、方便的一种人机交互方式,具有坚固耐用、反应速度快、节省空间、易于交流等优点。从技术原理来分,触摸屏可以分为以下几类:

①电阻式触摸屏
②电容式触摸屏
③红外线技术触摸屏
④表面声波技术触摸屏
⑤矢量压力传感技术触摸屏
常用的有电阻式触摸屏和电容式触摸屏。


电阻触摸屏结构图为:

这里写图片描述

电阻触摸屏是一块4层的透明的复合薄膜屏,触摸屏由两层塑料薄膜组成,各薄膜层上均涂有一层导电金属(通常是氧化铟锡),中间的空气间隙将二者分开。如上图所示,外面两层白色的,上面为软薄膜,下面白色为玻璃基板,中间两层分别为X、Y两个透明电极层。由上图可知,电阻触摸屏在最上面的触摸屏是软的,所以也称为软屏(相对于电容触摸屏为硬屏)。

计算X,Y触点的坐标分为两步:

①计算Y坐标:在Y+端施加驱动电压VDD,Y-端接地,X+作为引出端测量得到的触点电压。由于电极层均匀导电,触点电压域VDD电压之比相当于触点Y坐标与屏高度之比。
②计算X坐标:在X+端施加驱动电压VDD,X-端接地,Y+作为引出端测量得到的触点电压。由于电极层均匀导电,触点电压域VDD电压之比相当于触点X坐标与屏宽度之比。

相比于电阻屏,电容屏的优点是感应灵敏,支持多点触控,更适合现代产品的要求。电容屏是利用人体的电流感应进行工作的。电容式触摸屏是一块四层复合玻璃屏,玻璃屏的内表面和夹层各涂有一层ITO,最外层是一薄层矽土玻璃保护层,夹层ITO涂层作为工作面,四个角上引出四个电极,内层ITO为屏蔽层以保证良好的工作环境。当手指触摸在金属层上时,由于人体电场,用户和触摸屏表面形成一个耦合电容,对于高频电流来说,电容是直接导体,于是手指从接触点吸走一个很小的电流。这个电流分从触摸屏的四角上的电极中流出,并且流经这四个电极的电流与手指到四角的距离成正比,控制器通过对这四个电流比例的精确计算,得出触摸点的位置。


驱动程序的设计步骤如下:

这里写图片描述

其中S3C2440支持的触摸屏中断模式有两种,一种是TC中断,即按下产生中断,一种是ADC中断,即完成AD转换后产生中断,这里采用的是TC中断。代码如下:

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\n",xdata,ydata);    //7. 再次进入等待按下中断的状态    ADCTSC = 0xd3;}

完成以上设置后还需要在中断判断中添加中断源判断,使程序遇到触摸屏中断时能判断出该中断是触摸屏的中断,并跳转到void tc_handler()执行代码。

你可能感兴趣的文章
OK6410A 开发板 (八) 22 linux-5.11 OK6410A start_kernel 功能角度 第一阶段
查看>>
OK6410A 开发板 (八) 23 linux-5.11 OK6410A start_kernel 功能角度 第二阶段
查看>>
OK6410A 开发板 (八) 24 linux-5.11 OK6410A start_kernel 功能角度 第三阶段
查看>>
OK6410A 开发板 (八) 25 linux-5.11 OK6410A 进程角度 裸机和进程的区别
查看>>
getopt 解析
查看>>
文章标题
查看>>
linux前后台切换
查看>>
nmap
查看>>
uboot执行顺序main_loop
查看>>
uboot编译内容详解
查看>>
uboot Makefile 分析
查看>>
uboot网络验证
查看>>
烧写uboot
查看>>
QT安装
查看>>
QtCreator介绍
查看>>
QT工程实例
查看>>
pkg-config
查看>>
Linux内核分析-1/反汇编(堆栈)
查看>>
Linux内核分析-2/时间片轮转多道程序
查看>>
Linux内核分析-4/5/系统调用
查看>>