触摸屏接口硬件编写驱动程序

合集下载

触摸屏驱动程序设计实验报告

触摸屏驱动程序设计实验报告

触摸屏驱动程序设计一.设计目的1,巩固学习嵌入式软件方面的基本知识,进一步熟悉基本概念。

2,熟练常用控件,文件,图形等方面的操作了解基本的流程。

3,运用所用学的嵌入式知识,编写出较为实用的小软件,增进对一些实际问题的软,硬件知识的掌握。

4,培养查阅资料,独立思考问题的能力。

二、要求:编写从A/D转换器的通道x获取模拟数据,并将转换后的数字量以波形的形式在LCD上显示的程序。

三. 实验步骤:四.基本思路及关键问题的解决方法;基本思路:1. 按照步骤程序设计原理说明,使用”CodeWarrior for ARM Developer Suite”软件编写程序并进行编译,建立一个新的文件单击【File】菜单中的【New File】选项,然后出现下面的对话框,输入文件名(加上后缀“.c”),单击保存按钮,在编译过程中如果出现错误,修改程序直到没有错误为止,编译过程中出现警告一般可以不必考虑,但特殊时也要通过修改程序消除警告。

程序编写完成后,将程序所在文件保存到2440test.mcp中,如图所示:2.用开发板测试程序代码:(1)首先设置开发板的拨动开关S2 为Nor Flash 启动,连接好附带的USB 线和电源(可以不必连接串口线)。

(2)设置超级终端(3)开机进入BIOS 模式,此时开发板上的绿色LED1 会呈现闪烁状态,其启动界面,如下图:输入”d”(4)安装USB 下载驱动(5)点击DNW 程序的“USB Port” “Transmit”,选择这个2440test.mcp文件,接着点“打开”,这样就开始下载了五、流程图及电路原理图1.绘制所需的流程图:ADS7843与S3C2410的硬件连接如图1所示,图1 触摸屏输入系统示意图触摸屏驱动程序设计触摸屏驱动程序中重要数据结构typedef struct {unsigned short pressure;unsigned short x;unsigned short y;unsigned short pad;} TS_RET;typedef struct {unsigned int PenStatus;TS_RET buf[MAX_TS_BUF];unsigned int head, tail;wait_queue_head_t wq;spinlock_t lock;} TS_DEV;static struct file_operations s3c2410_fops = {owner: THIS_MODULE,open: s3c2410_ts_open,read: s3c2410_ts_read, release: s3c2410_ts_release,poll: s3c2410_ts_poll, };本设计中触摸屏控制器ADS7843的中断输出通过外部中断5接在中断控制器上,当触摸屏上有触摸事件发生时,会引发中断号为IRQ_EINT5的中断服务程序s3c2410_isr_tc()。

触摸屏ADS7843驱动程序

触摸屏ADS7843驱动程序

触摸屏ADS7843驱动程序设计//===================================================================== // ADS7843 驱动程序(串行)//硬件连接: DCLK ——P0^0;// CS ——P0^1;// DIN ——P0^2;// BUSY ——P0^3// DOUT ——P0^4// PENIRQ——P3^2;// VDD--逻辑电源(+5V)// VSS--GND(0V)//ADS7843.c//writer:谷雨2008年7月23日于EDA实验室//=====================================================================#i nclude //STC单片机头文件#i nclude#define uint unsigned int#define uchar unsigned charsbit DCLK = P0^0; //时钟信号,下降沿有效sbit CS = P0^1; //片选信号,低电平有效sbit DIN = P0^2; //串行数据输入sbit BUSY = P0^3; //忙信号sbit DOUT = P0^4; //串行数据输出sbit PENIRQ = P3^2; //键盘中断请求信号,低电平(负边沿)有效void Tranfer(char Data);uint average(uint a[8]);//===================================================================== ===============//函数名称:void delay(uint us)//函数功能:延时子函数//入口参数:us 延时时间//出口参数:无//===================================================================== ===============void delay(uint us){while(us--);}//===================================================================== ===============//函数名称:void ADS7843_start(void)//函数功能:ADS7843启动//入口参数:无//出口参数:无//===================================================================== ===============void ADS7843_start(void){DCLK=0;CS=1;DIN=1;DCLK=1;CS=0;}//===================================================================== ===============//函数名称:void ADS7843_wr(uchar dat)//函数功能:写ADS7843//入口参数:dat 写入的数据//出口参数:无//===================================================================== ===============void ADS7843_wr(uchar dat){uchar count;DCLK=0;for(count=0;count<8;count++){dat<<=1;DIN=CY;DCLK=0;_nop_();_nop_();_nop_();DCLK=1;_nop_();_nop_();_nop_();}}//===================================================================== ===============//函数名称:uint ADS7843_rd(void)//函数功能:读ADS7843//入口参数:无//出口参数:读回的坐标值//===================================================================== ===============uint ADS7843_rd(void){uchar count=0;uint dat=0;for(count=0;count<12;count++){dat<<=1;DCLK=1; _nop_();_nop_();_nop_(); //下降沿有效DCLK=0; _nop_();_nop_();_nop_();if(DOUT)dat++;}return(dat);}//===================================================================== ===============//函数名称:void intr0_int()//函数功能:外中断0中断服务函数//入口参数:无//出口参数:无//===================================================================== ===============void intr0_int() interrupt 0 using 2{uint X=0,Y=0,a[4],i,avex,avey,x[8],y[8];IE=0; //关中断delay(100); //中断后延时以消除抖动,使得采样数据更准确if(!PENIRQ){for(i=0;i<8;i++) //进行8次数据采集{ADS7843_start();delay(2);ADS7843_wr(0x90);//送控制字10010000 即用差分方式读X坐标delay(2);DCLK=1;_nop_();_nop_();_nop_();_nop_();DCLK=0;_nop_();_nop_();_nop_();_nop_();X=ADS7843_rd(); //读X轴坐标x[i]=X;ADS7843_wr(0xD0); //送控制字11010000 即用差分方式读Y坐标DCLK=1;_nop_();_nop_();_nop_();_nop_();DCLK=0;_nop_();_nop_();_nop_();_nop_();Y=ADS7843_rd(); //读Y轴坐标y[i]=Y;CS=1;}avex=average(x); //X坐标数据处理a[0]=avex/1000; //发上位机观察结果a[1]=(avex-a[0]*1000)/100;a[2]=(avex-a[0]*1000-a[1]*100)/10;a[3]=avex%10;Tranfer(a[0]+48);Tranfer(a[1]+48);Tranfer(a[2]+48);Tranfer(a[3]+48);avey=average(y); //Y坐标数据处理a[0]=avey/1000; //发上位机观察结果a[1]=(avey-a[0]*1000)/100;a[2]=(avey-a[0]*1000-a[1]*100)/10;a[3]=avey%10;Tranfer(a[0]+48);Tranfer(a[1]+48);Tranfer(a[2]+48);Tranfer(a[3]+48);for(i=0;i<10;i++) //延时,在程序中根据具体情况改动delay(10000);}IE=0x81; //开中断}//===================================================================== ===============//函数名称:void init_serial()//函数功能:初始化串口//入口参数:无//出口参数:无//===================================================================== ===============void init_serial(){TMOD=0x22; //定时器T1使用工作方式2TH1=250; //设置初值TL1=250;TR1=1; //开始计时PCON=0x80; //SMOD=1;SCON=0x50; //工作方式1,波特率9600bit/s,允许接收TI=1;}//===================================================================== ===============//函数名称:void Tranfer(char Data)//函数功能:发送数据程序//入口参数:Data 要发送的数据//出口参数:无//===================================================================== ===============void Tranfer(char Data){while(TI==0);SBUF=Data;TI=0;}//===================================================================== ===============//函数名称:int main()//函数功能:主函数//入口参数:无//出口参数:无//===================================================================== ===============int main(){// uint b[4];TCON=0x01; //设置外部中断0下降沿触发EX0=1; //开外中断0EA=1; //开总中断init_serial();while(1);}//===================================================================== ===============//函数名称:uint average(uint a[8])//函数功能:数据处理程序,采集8次的数据,去掉最大值,去掉最小值,然后求平均//入口参数:数组首地址//出口参数:平均值//===================================================================== ===============uint average(uint a[8]){uint max,min,i,ave=0,sum=0;max=a[0];min=a[0];for(i=0;i<8;i++){if(maxif(min>a[i])min=a[i];sum+=a[i];}ave=(sum-min-max)/6;return ave;}。

单片机中的触摸屏接口技术原理与实现

单片机中的触摸屏接口技术原理与实现

单片机中的触摸屏接口技术原理与实现触摸屏接口技术是现代电子设备中广泛应用的一项重要技术。

在单片机系统中,触摸屏接口技术可以实现用户对设备的交互操作,提升用户体验。

本文将介绍触摸屏接口技术的原理和实现方法。

触摸屏接口技术的原理触摸屏接口技术的原理是基于电容或电阻效应实现的。

常见的触摸屏包括电容式触摸屏和电阻式触摸屏。

电容式触摸屏是利用触摸屏面板上存在的感应电容实现的。

当手指或触控笔接触触摸屏面板时,触摸屏上的感应电容会发生变化。

通过测量感应电容的变化,可以确定触摸位置。

电容式触摸屏的优点是灵敏度高、触感好,适合多点触控操作。

其缺点是对温度和湿度敏感。

电阻式触摸屏是利用触摸屏面板上存在的两层导电薄膜之间的接触实现的。

当手指或触控笔按压触摸屏面板时,两层导电薄膜之间发生接触,形成电路闭合。

通过测量电路参数的变化,可以确定触摸位置。

电阻式触摸屏的优点是适应性强,可以用手指、触控笔等多种方式进行触控。

其缺点是灵敏度相对较低,多点触控能力较差。

触摸屏接口技术的实现在单片机系统中,触摸屏接口技术的实现首先需要通过硬件电路与触摸屏进行连接。

常见的连接方式有串行接口和并行接口。

串行接口是通过少量的引脚实现与触摸屏的通信。

通常采用的协议是SPI(串行外设接口)或I2C(串行总线接口)。

使用串行接口可以减少引脚数量,适用于引脚资源有限的单片机系统。

但由于数据传输速度较慢,对系统性能要求较高。

并行接口是通过多个引脚实现与触摸屏的通信。

通常采用的协议是8080或6800并行总线接口。

使用并行接口可以实现高速数据传输,适用于对数据传输速度要求较高的应用场景。

但由于引脚数量较多,对系统引脚资源有一定要求。

在接口电路中,需要实现触摸屏的电源供应、数据传输和指令控制等功能。

具体实现方式根据触摸屏的设计和单片机系统的需求而定。

触摸屏接口技术的驱动程序通常由单片机系统开发人员编写。

驱动程序主要包括触摸屏芯片的初始化配置、数据传输和触摸事件处理等功能。

威纶触摸屏EasyBuilder pro编程与操作三(硬件设定与工程的建立)

威纶触摸屏EasyBuilder pro编程与操作三(硬件设定与工程的建立)

威纶EasyBuilder pro触摸屏编程与操作模块三硬件设定与工程的建立任务一硬件设定【学习目标】1、熟练完成HMI的IO端口设置、DIP设置、系统工具列与系统设定等相关操作。

【相关知识】一、I/O 端口HMI支持的通讯接口,依不同机种而有差异,详细规格请参阅各机型的规格表。

(一)、SD 卡插槽:SD 卡提供工程文件上传及下载,包括配方数据、事件记录与资料取记录,亦可备份或记录历史资料。

(二)、串行接口:连接PLC 或其他设备,接口规格为:RS-232 / RS-485 2W/RS-485 4W / CAN Bus。

(三)、以太网接口:提供工程文件上传及下载,包括配方数据、事件记录与资料取样记录。

亦可连接具网络通讯功能的设备,如PLC、PC 等。

(四)、USB Host:支持各种USB 接口的设备,如鼠标键盘、U盘、打印机、条码机等。

(五)、USB Client:提供工程文件上传及下载,包括配方数据、事件记录与资料取样记录。

当首次操作HMI前,必须在HMI上完成以下各项系统设定,设定完成后即可使用EasyBuilder Pro工程软件开发工程文件。

二、DIP设置每台HMI背后都有一组复位按钮及指拨开关,做不同模式切换时,将可触发对应功能。

若遗失HMI的系统设定密码时,可以藉由调整指拨开关将HMI恢复成出厂设置。

详细设定步骤如下:(一)、将DIP Switch 1 切至ON,其余指拨开关保持为OFF,然后重新启动HMI。

此时HMI 将进入触控校正模式。

(二)、在HMI会出现“+”光标。

使用触控笔或者手指点选“+”光标的中心点【持续按住2秒钟左右】进行五点校正。

所有十字皆被准确触控之后,“+”光标会消失。

校准参数会保留在系统里。

(三)、完成校正动作后,系统会询问用户是否将HMI的系统设定密码恢复为出厂设定,选择[Yes]。

(四)、再次确认用户是否要将HMI的系统设定密码恢复为出厂设置。

当输入[yes] 按下[OK]后,HMI内所有的工程文件及历史资料将全部被清除。

51单片机程序触摸屏芯片ADS7843驱动

51单片机程序触摸屏芯片ADS7843驱动

51单片机程序触摸屏芯片ADS7843驱动#include "reg51.h"#include "intrins.h"sbit DCLK=P1^6;sbit CS=P2^2;sbit DIN=P2^3;sbit DOUT=P2^4;sbit BUSY=P2^5;delay(unsigned char i--){while(i--);}void start() //SPI开始{DCLK=0;CS=1;DIN=1;DCLK=1;CS=0;}WriteCharTo7843(unsigned char num) //SPI写数据{unsigned char count=0;DCLK=0;for(count=0;count<8;count++){num<<=1;DIN=CY;DCLK=0; _nop_();_nop_();_nop_(); //上升沿有效DCLK=1; _nop_();_nop_();_nop_();}}ReadFromCharFrom7843() //SPI 读数据{unsigned char count=0;unsigned int Num=0;for(count=0;count<12;count++){Num<<=1;DCLK=1; _nop_();_nop_();_nop_(); //下降沿有效DCLK=0; _nop_();_nop_();_nop_();if(DOUT) Num++;}return(Num);}void ZhongDuan() interrupt 0 //外部中断0 用来接受键盘发来的数据{unsigned int X=0,Y=0;delay(10000); //中断后延时以消除抖动,使得采样数据更准确start(); //启动SPI// while(BUSY); //如果BUSY信号不好使可以删除不用delay(2);WriteCharTo7843(0x90); //送控制字 10010000 即用差分方式读X坐标详细请见有关资料// while(BUSY); //如果BUSY信号不好使可以删除不用delay(2);DCLK=1; _nop_();_nop_();_nop_();_nop_();DCLK=0; _nop_();_nop_();_nop_();_nop_();X=ReadFromCharFrom7843(); //读X轴坐标WriteCharTo7843(0xD0); //送控制字 11010000 即用差分方式读Y坐标详细请见有关资料DCLK=1; _nop_();_nop_();_nop_();_nop_();DCLK=0; _nop_();_nop_();_nop_();_nop_();Y=ReadFromCharFrom7843(); //读Y轴坐标CS=1;}main(){TMOD=0x11; // 记数器0 计数器1 都以 16 位记数TCON=0x00;IE=0x83; //1000 0001 EA=1中断允许,IP=0x01;while(1);//等待触摸中断}。

教程触摸屏程序制作步骤教程

教程触摸屏程序制作步骤教程

教程触摸屏程序制作步骤教程前言随着科技的发展,越来越多的设备开始采用触摸屏界面,因此学习如何制作触摸屏程序成为了必备技能之一。

本教程将介绍触摸屏程序制作的基本步骤,帮助初学者快速入门。

所需材料•开发板(例如Raspberry Pi)•触摸屏•USB 电源线•HDMI 线(可选)•计算机步骤1. 连接触摸屏首先,将触摸屏插入开发板,并用 USB 电源线连接电源和开发板。

如果需要,则连接 HDMI 线。

连接后,打开开发板电源和触摸屏。

2. 安装操作系统接下来,需要在开发板上安装操作系统。

根据开发板的型号和制造商的不同,操作系统的安装过程也略有不同。

请参考您的设备说明或在线教程,了解操作系统的安装方法。

3. 安装触摸屏驱动安装好操作系统后,需要安装触摸屏驱动程序。

一般来说,设备制造商会提供相应的驱动程序和说明文档。

请按照文档中的指示安装驱动程序。

4. 编写代码现在,您可以开始编写触摸屏程序了。

编写代码前,请确保您已经安装了正确的编程环境和开发库,并已经熟悉相应的编程语言。

具体编写方法因编程语言不同而有所不同,但一般来说,您需要编写以下代码:1.初始化触摸屏2.监听触摸事件3.处理触摸事件5. 测试程序编写完成后,请测试您的程序,确保它能够正确地运行并响应触摸事件。

可以使用调试工具来帮助您查找问题并进行调试。

6. 调优程序最后,您可以进一步优化您的代码,以提高程序性能和稳定性。

您可以使用性能分析工具来帮助您找到并优化瓶颈。

本教程简要介绍了触摸屏程序制作的基本步骤,希望能够帮助初学者快速入门。

当然,触摸屏程序的制作是一个非常复杂的过程,需要不断实践和学习。

祝您在学习和实践中取得好成果!。

第16章 触摸屏设备驱动程序

第16章  触摸屏设备驱动程序

16.2.2
S3C2440触摸屏接口的工作模式
S3C2440触摸屏接口有4种工作模式。在不同的工作模 式下,触摸屏设备完成不同的功能。在某些情况下,几种工 作模式需要互相配合,才能够完成一定的功能。这4种工作 模式分别是: 1.正常转换模式 2.等待中断模式 3.独立的X/Y位置转换模式 4.自动X/Y位置转换模式
16.3.6
S3C2440触摸屏驱动模块的remove函 数
remove()函数是Linux设备驱动程序中一个非常重要的 函数,这个函数实现了与probe()函数相反的功能。体现了 Linux内核中,资源分配和释放的思想。资源应该在使用时 分配,在不使用时释放。触摸屏设备驱动程序的remove()函 数由s3c2410ts_remove()函数来实现。这个函数中释放了申 请的中断、时钟、内存等。
16.4
测试触摸屏驱动程序
测试触摸屏驱动程序是否工作正确,最简单的一种方 法是在驱动程序中加入一些打印坐标的信息,从这些坐标中 分析触摸屏设备驱动程序是否工作正常。touch_timer_fire() 函数会不断的调用去读输入缓冲区中的数据,在 touch_timer_fire()函数中加入第14到21行,就能够打印出调 试信息。
第16章
触摸屏设备驱动程序
由于触摸屏设备使用简单、价格相对低廉,它的应用随处 可见。在消费电子产品、工业控制系统、甚至航空领域都所有应 用。随着触摸屏设备技术的成熟和价格的日益下降,在我们的日 常生活中也经常使用带触摸屏的设备。例如银行的ATM机、机 场的查询等级系统、手机、MP3、掌上电脑等。正因为触摸屏设 备应用如此广泛,所以掌握触摸屏设备驱动程序的编写对驱动开 发者来说非常重要。本章将对触摸屏设备驱动程序进行详细的介 绍。

基于DragonBoard 410c开发板的触摸屏驱动编写

基于DragonBoard 410c开发板的触摸屏驱动编写

基于DragonBoard 410c开发板的触摸屏驱动编写前言:让大家初步了解对高通MSM8916平台的输入子系统的实现,给大家提供Dragon Board 410c平台开发输入系统设备的思路。

(如:按键设备、触摸屏、轨迹球等)在高通MSM8916平台中,具有触摸屏、轨迹球和简单按键功能,这些功能是由Android 系统内中的驱动程序实现的,并且需要用户空间的内容来协助实现。

一、触摸屏驱动编写高通MSM8916平台的触摸屏驱动程序的实现文件是drivers/input/touchscreen/synapTIcs_i2c_rmi4.c,此文件的核心是函数synapTIcs_ts_probe(),在该函数中需要进行触摸屏工作模式的初始化,对作为输出设备的触摸屏驱动在Linux平台下的设备名注册,同事初始化触摸时间触发时引起的中断操作。

此函数的实现代码如下:staTIc int synapTIcs_rmi4_probe(struct i2c_client *client,const struct i2c_device_id *dev_id){int retval = 0;unsigned char ii;unsigned char attr_count;struct synaptics_rmi4_f1a_handle *f1a;struct synaptics_rmi4_fn *fhandler;struct synaptics_rmi4_fn *next_fhandler;struct synaptics_rmi4_data *rmi4_data;struct synaptics_rmi4_device_info *rmi;struct synaptics_rmi4_platform_data *platform_data =client-dev.platform_data;struct dentry *temp;if (!i2c_check_functionality(client-adapter,I2C_FUNC_SMBUS_BYTE_DATA)){dev_err(client-dev,%s: SMBus byte data not supported\n,__func__);return -EIO;}if (client-dev.of_node) {platform_data = devm_kzalloc(client-dev,sizeof(*platform_data),GFP_KERNEL);if (!platform_data) {dev_err(client-dev, Failed to allocate memory\n);return -ENOMEM;}retval = synaptics_rmi4_parse_dt(client-dev, platform_data);if (retval)return retval;} else {platform_data = client-dev.platform_data;}if (!platform_data) {dev_err(client-dev,%s: No platform data found\n,__func__);return -EINV AL;}rmi4_data = kzalloc(sizeof(*rmi4_data) * 2, GFP_KERNEL);if (!rmi4_data) {dev_err(client-dev,%s: Failed to alloc mem for rmi4_data\n,__func__);return -ENOMEM;}rmi = (rmi4_data-rmi4_mod_info);rmi4_data-input_dev = input_allocate_device();//创建设备if (rmi4_data-input_dev == NULL) {dev_err(client-dev,%s: Failed to allocate input。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

尽管触摸屏正在迅速普及开来,但大多数开发人员以前从来没有开发过触摸屏产品。

本文详细介绍了触摸屏产品的设计步骤,指导读者了解使触摸屏首次工作需要的软硬件细节。

触摸屏如今随处可见。

工业控制系统、消费电子产品,甚至医疗设备上很多都装备了触摸屏输入装置。

我们平时不经意间都会用到触摸屏。

在ATM机上取款、签署包裹,办理登机手续或查找电话号码时都可能会用到触摸屏。

本文介绍了二种较新的CPU,它们都内建了对触摸屏输入的支持。

本文将介绍如何编写软件驱动程序,从而能够使用这些微处理器配置、校准触摸屏以及对触摸屏输入持续响应。

最终将提供可免费下载和使用的工作代码,作为读者进一步设计的基础。

触摸屏作为输入手段的优点和缺点没有一种输入方式是十全十美的,对某些特定的应用和产品类型来说,触摸屏不是最好的输入手段。

为了让读者清楚的了解触摸屏的特性,下面先概括使用触摸屏作为输入手段的优点和缺点。

首先是优点:触摸屏不可否认的具有酷的感觉,立刻就能使产品的使用变得更有乐趣。

同时触摸屏也非常直观。

当用户想要选择A选项时,他伸出手指碰一下A 选项就可以了。

这还不够直观吗?连两岁的婴儿都知道怎样伸手去触摸他(或她)想要的东西。

最后要说的是,触摸屏作为输入装置和系统固定在了一起。

如果用户忘记遥控器或鼠标放的位置,就会无法进行输入。

而如果具有触摸屏的设备放在用户前面,用户马上就可以用触摸屏进行输入。

再说缺点,触摸屏可能会在不合适的场合下被错误的使用。

这里我是指对安全性要求严格的设备,对于这些设备,如果没有适当的预防措施,使用触摸屏会非常危险。

下面我将概括一些最明显的潜在的问题,如果读者想作更进一步的了解,可以参考更多的资料。

第一个问题是视差,即屏幕上看到的对象的位置与其在触摸面板上的实际有效位置之间的差异。

图1说明了这个问题。

我能想到的最佳例子是典型的“免下车”ATM机。

这种ATM机不会根据汽车的高度升高或降低自己的高度,因此如果你坐在较高的SUV或卡车里,那么你就会从抬高的位置俯视显示屏。

为了保护昂贵的显示器件免受恶意破坏,ATM机都会在用户和显示屏之间放置几层强化玻璃。

触摸屏是不能这样保护的。

如果真这样做的话,用户就无法进行触摸了。

因此触摸屏放在表层上,而显示屏放在表层下的几层玻璃后面。

这就造成了触摸层和显示层之间的物理隔离。

如果用户以某个角度观看屏幕,就意味着用户按压触摸屏进行选择的位置会与用户接口软件预期的输入位置之间存在一定的距离偏差。

人们能很快适应这种偏差。

经过几次尝试和错误,使用者学习在触摸屏的表面找到显示信息的映射位置,然后触摸到正确的位置。

ATM设计师也认识到这一点,他们会采用大面积的按键,并尽量使它们相互远离,因此有助于防止错误按键的误触发。

当图1:视差(横截面图)。

然,不小心按下错误的ATM按键不会使你得癌症或使你失明。

但如果这样的失误发生在医疗控制设备上,并且系统设计师没有在系统内置足够的安全预防措施,那么以上两种后果确实都有可能发生。

通过缩短显示层和触摸层之间的物理距离可以尽量减少视差。

在CRT或LCD前面总会有玻璃存在。

最好的方法是将对触摸敏感的电子元件嵌入到玻璃里,并且这层玻璃做得尽可能薄。

这样就减少了触摸输入层和显示层之间的相隔距离。

像Palm这样的手持设备就可以采用这样的策略,因为它们不必太担心机械强度不够或者遭受恶意破坏。

随着相隔距离的缩小(用户觉得真的触摸到了图形元件),精度会大大提高。

第二个明显的问题是,在用户触摸屏幕的过程中,触摸屏幕的物体(触控笔、手指)至少会遮挡屏幕上的一小部分面积,从而影响用户的观察。

在工厂自动化应用中这种情况更容易发生,因为用户很可能使用手指或手套而非触控笔,即使是使用触控笔,在屏幕上做选择动作也会不时遮挡住一部分你给用户展示的信息。

例如,想象一下你想展示一个滑动控制条给用户调节数值(如速度或音量),并且你将用户选择的数值以数字形式显示在滑动控制条的左边。

这样做一般工作情况会很好,但当左撇子用户操作你的系统时,只有移开他的手指他才能看到所选的值。

因此你必须在你的用户界面设计中考虑这类因素。

触摸屏硬件原理简介我们在开始编写触摸屏驱动程序之前,必须对硬件的工作原理有个基本的了解。

许多不同的触摸技术会把屏幕某个位置的压力或接触转换成有意义的数字坐标。

典型的触摸技术包括电阻触摸屏、声表面波触摸屏、红外线触摸屏和电容触摸屏。

如果想详细了解这些技术,你可以登录或网站。

这里侧重介绍电阻触摸屏。

电阻触摸屏非常普及,你会发现许多评估板和开发套件中都集成了电阻触摸屏。

电阻触摸屏普及的主要原因是价格便宜,而且在电气上可以直接接入用户的系统中。

之所以叫电阻触摸屏,是因为它们本质上就是电阻分压器。

它们由两个电阻薄层组成,这两个薄层被非常薄的绝缘层隔开,绝缘层通常以塑料微粒子的形式存在。

当你触摸屏幕时,会使两个电阻薄层变形到足以使它们之间发生电气连接。

然后由软件通过检测分压器上产生的电压计算出两层的短接位置,并最终确定触摸位置。

电阻触摸屏分为几种类型,比如"四线","五线"和"八线"。

线越多,精度就越高,温度漂移也越少,但基本的操作是一样的。

在最简单的四线设计中,有一层称为"X轴"的电阻层,上面加有一定的电压,另一个称为"Y轴"的电阻层作为接受层测量对应X轴位置的电压值。

这一过程再反过来执行一遍,即Y轴层加电,X 轴层用于电压检测。

图2是电阻触摸屏的简单等效电路。

注意必须获取二个完全独立的读数,即X轴位置和Y轴位置数据。

这些数据在四线或五线电阻触摸屏中是无法同时读取的。

软件必须先读一个轴,然后再读另外一个轴。

读取的顺序则无关紧要。

将电阻触摸屏产生的电压转换成数字需要用到模数转换器(ADC)。

直到不久前这个ADC几乎一直是主CPU的外围器件。

Burr Brown NS7843或NS7846就是这种ADC控制器。

该器件为12位的模数转换器,其内嵌的逻辑电路通过交替给一个薄层加电,再从另外一层转换来控制触摸屏。

虽然可以使用诸如GPIO之类的信号线来完成薄层加电的切换,但该器件能够分担许多任务,还能提供产生触摸或笔压中断的方式。

最近有几家CPU制造商开始在主CPU中集成ADC模块和专用的触摸屏控制电路。

在消费类设备、远程信息通信或一些面向其它市场的产品中,LCD显示屏和触摸屏非常普遍,当想把CPU用于这类产品中时,在CPU中集成ADC和触摸屏控制电路的做法会非常有意义。

基于两种CPU的参考板本文设计两种集成了触摸屏控制功能的CPU的参考板。

这二种CPU都基于ARM 处理器架构。

第一块板是飞思卡尔的MX9823ADS评估板,采用了飞思卡尔的MC9328MX1处理器。

该评估板可以直接从飞思卡尔的分销商处定购。

评估套件包括QVGA(240x320)彩色LCD和触摸屏。

第二块板采用了夏普LH79524 ARM处理器。

这块夏普的参考板以及集成的显示和触摸套件都可以从LogicPD公司处定购。

有几种可更换的显示套件供选择,分辨率范围从QVGA到800x600像素不等。

本文中不提供每个驱动程序的详细代码,而是介绍驱动程序的设计和流程,并重点介绍其中的重要部分。

读者可以从ftp:///pub/2005/07maxwell 下载每个驱动程序的全部源代码。

总的来看,软件提供的功能完成以下这些步骤:1. 配置控制器硬件2. 判断屏幕是否被触摸3. 获得稳定的、去抖动的位置测量数据4. 校准触摸屏5. 将触摸状态和位置变化信息发送给更高层的图形软件下面开始详细介绍每个步骤。

硬件配置触摸驱动程序要做的第一件事是配置硬件。

对这些集成控制器来说,这意味着通过向映射到存储器的寄存器中写入数据将控制器配置成某个确定状态。

这一过程是由每个驱动程序中的TouchConfigureHardware()函数完成的。

为了配置硬件,需要事先做好某些决定。

例如,驱动程序应该使用中断驱动吗?为了获得能够响应并且精确的触摸位置信息需要什么样的转换速率?让我们看看做出这些决定的具体过程吧。

关于触摸驱动程序是否应该使用中断驱动,事实上在范例的驱动程序中用的就是中断驱动方式。

坦率地讲,我之所以这样做是因为使用中断很有趣。

千万不要由这个例子推断出采用中断永远是最好或最正确的设计方式,也不要听信别人说不采用中断驱动方式的触摸驱动程序就是"错误的"。

之所以这样说只是因为"轮询"对嵌入式系统程序员来说似乎变成了贬义词。

我曾经问过一位客户,他的输入设备采用的是轮询还是中断服务方式。

回答是"这是嵌入式系统,我们不做任何轮询"。

我当时感觉问这个问题时我就像一个傻瓜,但进一步探讨后发现查询其实也是一种合理且值得考虑的方式。

如果使用的是RTOS ,并且所有任务经常为了等待某类外部事件而被中断,处理器经常处于空闲的循环状态,没有什么有意义的事做。

这种情况下使用空闲任务查询触摸屏上的输入也许是更好的设计方式。

根据你的总体系统需求,查询也可能是一个值得考虑的合理的设计方式。

配置中断的方法因具体操作系统而异。

读者会发现对于每一个支持的RTOS 都有被(#ifdef)限定的代码段。

在所有情况下驱动程序实际会使用二种不同的中断: 1 当屏幕被初次触摸时唤醒主机的中断,称为PEN_DOWN 中断图2:触摸屏电路简单等效电路。

2 当完成一组模数数据转换时的第二种中断信号后文会详细介绍这些中断和它们产生的过程。

接下来的问题是我们希望以多快的速度从ADC接收采样输入读数。

采样速度会影响我们需要如何配置时钟来驱动触摸屏和ADC。

我们希望时钟有足够快的速度来提供可响应的输入和实现精确的跟踪,但也不要太快,以至于影响转换精度,或让系统消耗超过所需的功率。

根据我的经验,触摸屏至少需要以20Hz或50ms间隔的速度向更高层软件提供位置更新数据,只要高层软件跟得上,速度越快越好,我们不太担心功耗问题。

如果触摸输入响应比这慢得多,那么在用户的触摸输入和显示屏上可观察到的响应之间会出现明显和烦人的迟滞现象。

20Hz的更新速度听起来并不是太有挑战性,但提供20Hz的更新速度实际上要求采样速度接近200Hz,具体数值取决于我们在确定输入稳定之前准备采用多少读数。

为了去抖动和对触摸输入位置值进行平均,我们需要进行过采样。

电阻触摸屏,特别是便宜的那种,一般会有很大的噪声和抖动。

在向更高层软件发送位置更新数据之前,驱动程序需要多次采样每个轴上的输入。

我们提供的驱动程序默认情况下将以最少200Hz(5ms)的采样速率配置各自处理器上的ADC时钟。

这样就能让驱动程序对输入原始数据进行充分的去抖动和过滤,并仍能向高层用户接口软件提供20Hz的实际位置更新速率。

相关文档
最新文档