WinCE开发中如何控制点歌机触摸屏控制线

WinCE下的触摸屏驱动设计与触摸压力判定_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&100W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
WinCE下的触摸屏驱动设计与触摸压力判定
&&WinCE下的触摸屏驱动设计与触摸压力判定
阅读已结束,下载本文需要
定制HR最喜欢的简历
你可能喜欢说明:&&WINCE 触摸屏测试程序
WINCE 触摸屏测试程序(WINCE TOUCH TEST)
文件列表:
TOUCH\Build.log
TOUCH\Build.wrn
TOUCH\makefile
TOUCH\obj\ARMV4I\debug\s3c6410_touch.def
TOUCH\obj\ARMV4I\debug\s3c6410_touch.obj
TOUCH\obj\ARMV4I\debug\_objects.mac
TOUCH\obj\ARMV4I\retail\s3c6410_touch.def
TOUCH\obj\ARMV4I\retail\s3c6410_touch.obj
TOUCH\obj\ARMV4I\retail\vssver2.scc
TOUCH\obj\ARMV4I\retail\_objects.mac
TOUCH\s3c6410_adc_touch_macro.h
TOUCH\s3c6410_touch.cpp
TOUCH\sources
TOUCH\vssver2.scc
TOUCH\obj\ARMV4I\debug
TOUCH\obj\ARMV4I\retail
TOUCH\obj\ARMV4I
近期下载者:
相关文件:WinCE人机交互简洁 触摸屏驱动功不可没
来源:IT168网站
 作者: IT168 潘少红 编辑:
【Windows嵌入式有奖征文系列】& 【IT168 专稿】随着Iphone的流行,触摸屏成为许多移动电子产品的标配,使到触摸屏驱动的开发在嵌入式设备中也变得越来越重要了。嵌入式移动设备因其体积小的特点决定了需要一种最为便利的输入工具。利用触摸屏用户可以很方便的对嵌入式移动设备进行相应的操作,而且操作简单直观,是极方便的人机交互设备。& 1.WinCE驱动程序模型分类& WinCE系统在驱动设计上有一个很方便的功能,就是原始设备制造商(OEMs)和独立硬件开发商(IHVs)可以自主开发设备驱动程序来支持他们的硬件。因此,在动手进行触摸屏驱动程序开发之前,深入了解WinCE系统驱动方式是非常有必要的。& (1)从驱动加载方式上的分类& 要编写WinCE驱动程序首先要确定它是属于哪类驱动。一般来说,WinCE平台上使用的设备可分为两类:内建设备和可安装设备。因此,从驱动加载方式上WinCE可分为内建设备驱动(Built-In Driver)和可加载驱动(Loadable Driver)。& WinCE系统可直接使用内建设备,因为内建设备驱动程序是与WinCE的核心组件紧密相连的,也就是内建设备驱动程序是被静态地链接到GWES(Graphics Windowing and Events& Subsystem)的。这些驱动对应的设备通常在系统启动时,在GWES的进程空间内被加载,主要是与显示和输入有关的驱动。& 因为它们不是以独立的DLL形式存在,所以要求每一个内建驱动程序都必须与设备驱动程序接口(DDI)的特定接口保持一致。内建设备包括显示、触摸屏、音频、串行埠、LED、电池和PC卡插座等。内建驱动程序一般设计为动态链接库,但有两个例外:电池和LED驱动程序由于小而设计为静态库。它们一般储存在ROM或闪存内。& 可加载设备是指可与平台连接和分离的第三方接口设备,可由用户随时安装和卸载。这种外围设备的驱动也被称为流驱动,这些驱动可以在系统启动时、或者启动后的任何时候由设备管理器动态加载。通常这类驱动是以DLL动态链接库的形式存在,加载后的这些驱动程序也只能以用户态的角色运行。在WinCE中典型的可加载驱动有:PCMCIA driver(PCMCIA.dll)、Serial driver(SERIAL.dll)、ATAFLASH driver(ATA.dll)、Ethernet driver(NE2000.dll,SMSC100FD.dll)。& 与内建驱动程序不同的是,所有可加载流驱动程序都共享一个公用接口,而且功能也与应用程序所用的文件API中的功能匹配。因此,控制可加载设备的流接口驱动程序一般由应用程序存取。也就是说,流接口驱动程序是由一个特殊文件来将设备功能展现给应用程序的,该文件可被打开、读取、写入和关闭。通常只有OEMs才会对内建设备驱动程序进行修改,其它自由设备生产商由于只提供附加的硬件设备,对内建设备驱动程序不会有过多涉及。& (2)从驱动程序层次上分类& WinCE最大的好处是具有可定制性,当它自带的驱动程序不能满足用户的要求时,用户可以自己编写相应的驱动程序。因此按照结构分,WinCE驱动程序又可分为分层的驱动程序和不分层的驱动程序。分层的驱动程序由两个设置好的层组成:上层是模型设备驱动程序(Model Device Driver, MDD),下层是依赖平台的驱动程序(Platform Dependent Driver, PDD)。& 分层的驱动程序中的MDD通常是无需修改可直接使用,MDD的作用是链接PDD层并定义它希望调用的函数接口:设备驱动程序提供器接口(Device Driver Service Provider Interface, DDSI)。同时MDD又把不同的函数集提供给WinCE内核,这些函数叫做设备驱动程序接口(Device Driver Interface, DDI)。不分层的驱动程序是把PDD与MDD写在一起,没有做严格的区分,通常这种驱动比较简单,比如ATADISK。简单的说,内建驱动和加载式流驱动是从驱动与系统其它模块(调用者)的接口形式上做的分类;而不分层和分层是从驱动实现方式上的分类。& 在开发过程中,MDD层驱动是不需要被修改的。但和MDD层驱动不同的是,PDD层驱动必须被修改成和特定硬件相匹配的代码。程序员可以自己开发一个PDD程序,但多数情况下建议开发者在Platform Builder提供的样例驱动程序上进行修改。在Win CE系统中触摸屏驱动是一种分层驱动。
IT168企业级
扫一扫关注
行车视线文章推荐后使用快捷导航没有帐号?
请完成以下验证码
查看: 2247|回复: 4
问一个wince5.0触摸屏驱动的问题 ?
在线时间2 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
系统环境:pxa270 + wince 5.0
问题相关:
(1)系统使用了一个定时器Timer1 ,定时大概为1ms ~ 3ms ,在有按钮事件时,持续响应中断
(2)触摸屏驱动中使用定时器Timer2 ,原厂的驱动是100次/s中断,现在为了保证Timer1 能正常工作,将Timer2 调成了45次/s ,这个值是反复调整的结果,即能保证Timer1 能正常工作的最大值
(3)LCD 及 触摸板 尺寸分辨率 : 800 * 600 ,640 * 480 时,工作时问题不大
& &在使用分辨率320 *240 时,按屏时将比较不灵敏,通过打印调试信息,在点击【短暂按屏时】发现中断能够响应,但是采用的坐标数据不正确被忽略,持续按钮如果达到500ms(这个是估算) 会有正确的采样数据,因此现在的现象是,按屏时需要实实在在的按屏,点击时很多时候无法响应
触摸屏使用的是UCB1400 芯片
(1)有没有办法提高屏在320*240 下的数据采用的正确性,比如调整采样时的参考电压?等
(2)有没有可能wince5.0触摸屏驱动不使用定时器
(3) Timer1 实际上是在在响应按钮事件时,发送1ms ~ 3ms 系列的高电平/低电平,有没有替代的办法?
有奖直播:TI MSP430TM集成可配置信号链模块在传感测量领域的应用
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
MARK, 没有做过,等高人出现
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
引用 1 楼 hudaweikevin 的回复:
MARK, 没有做过,等高人出现
继续,前面的测试中会发现触摸屏在采用正常的采样速率时,短事件快速点击同一点的按钮,第二次的采用大多无效,而如果快速点击的是不同点的按钮,在第二次采样有效,简单一点说,就是快速点击同按钮时,按钮间断一次响应一次,不同按钮则没有这个问题,大家的驱动是这样吗?
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
定时器是用来判断触摸笔是点击还是滑动的,所以没有是不行的。
至于提高精度我觉得主要是采样时间间隔,电压,以及阀值设置等等。以及采样次数等。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
引用 3 楼 gooogleman 的回复:
定时器是用来判断触摸笔是点击还是滑动的,所以没有是不行的。
至于提高精度我觉得主要是采样时间间隔,电压,以及阀值设置等等。以及采样次数等。
判断点击的,滑动可以不考虑,看ucb1400 文档,驱动可以设置成pressure 模式/interrupt 模式,有没有pressure 模式触摸屏驱动可以参考?
前面提到采样次数如果继续加大的话,Timer1工作将不正常?ucb1400 内部参考电压可以调整吗?
谢谢继续建议,有疑问也可以问,都会回复
EEWORLD 官方微信
Powered by博客访问: 193069
博文数量: 66
博客积分: 2636
博客等级: 少校
技术积分: 762
注册时间:
本文向您介绍WinCE中采用分层驱动程序结构实现的触摸屏驱动,包括对触摸屏驱动模型的讲解、触摸屏驱动程序的实现及接口实现等知识。
1.触摸屏驱动程序的模型
1.1 分层触摸屏驱动程序结构
本触摸屏驱动采用分层驱动程序结构,其驱动模型如下图所示,这种结构将驱动程序代码区分为上层模型设备驱动层(MDD),下层是依赖平台的驱动层(PDD)。其中MDD层通常无需修改就可以直接使用,该部分提供面向GWES的DDI的接口,而MDD通过指定的DDSI函数接口调用PDD,这就是我们通常驱动要实现的部分。PDD部分和MDD部分除了DDSI函数集接口外,还要实现一些指定的变量的定义或变量初始化动作(比如,gIntrTouch和gIntrTouchChanged在PDD层定义,但主要在MDD层使用。),也就是说MDD层和PDD层之间并不一定是以严格的分层模型来实现的,有时候也要通过共享变量的方式来完成交互。
500)this.width=500;" border=0>
1.2 DDI函数集(MDD层)
TouchPanelPowerHandler(BOOL boff)
Touch Screen的电源管理函数,boff:TRUE表示关闭电源,FALSE表示打开电源,其只是调用DdsiTouchPanelPowerHandler()函数,该函数在进入或退出poweroff状态时产生。
TouchPanelCalibrationAPoint()
该函数用于校准输入的触摸屏坐标,把触摸屏坐标转换为显示坐标,利用了公式Sx=A1*Tx+B1*Ty+C和Sy=A2*Tx+B2*Ty+C2。
TouchPanelReadCalibrationPoint()
在执行触摸屏校准程序时,用这个函数获得在当前校准点的十字形上点击的触摸屏坐标。
TouchPanelReadCalibrationAbord()
该函数在校准取消时被调用(在触摸屏校准程序运行过程中取消校准),仅仅设置状态位和事件后返回。
TouchPanelDisable()
禁用触摸屏(touch panel)设备,该函数关闭ISR,停止中断和注销事件及其他同步手段,此函数调用了DdsiTouchPanelDisable()函数。
TouchPanelEnable(PFN_TOUCH_PANEL_CALLBACK&&& pfnCallback)
PfnCallback是指向处理touch panel事件的回调函数,该函数的执行动作:
⑴创建事件hTouchPanelEvent和hCalibrationSampleAvailable,其中当触笔按下或抬起,或者定时器中断时会触发hTouchPanelEvent事件,而在校准状态下当有校准数据输入时会触发hCalibrationSampleAvailable事件。
⑵初始化临界区,初始化所需的触摸屏中断gIntrTouch和gIntrTouchChanged,并且把它们关联到事件hTouchPanelEvent中。
⑶创建IST TouchPanelpISR,并设定其优先级。
TouchPanelSetCalibration()
该函数通过运行触摸屏校准程序时的校准动作获得显示坐标(Sx,Sy)和触笔在十字形上按下的触摸坐标(Tx,Ty)用于计算校准参数A1,B1,C1和A2,B2,C2。
TouchPanelGetDeviceCaps()
用于查询触摸屏设备支持的具体功能,通过DDSI函数查询相应的信息,当查询屏幕坐标信息时保存屏幕信息,供后面程序计算校准参数所用。
TouchPanelSetMode()
用于设置触摸屏的工作模式(采用低采样率还是高采样率),当设置IST优先级时直接通过内核API来完成,而直接将其他设置交给DdsiTouchPanelSetMode()函数来处理。
1.3 &WinCE&DDSI函数集(PDD层)
DdsiTouchPanelGetDeviceCaps(INT iIndex, LPVOID lpOutput)
查询touch panel设备的相关信息。
IIndex:查询的索引值,其取值如下:
TPDC_SAMPLE_RATE_ID:查询采样率信息。
TPDC_CALIBRATION_POINT_COUNT_ID:查询用于校验的点的个数。
TPDC_CALIBRATION_POINT_ID:查询需要校验的点的坐标。
LpOutput:根据iIndex值分别指向相关的信息。
DdsiTouchPanelSetMode()
设置Touch Panel工作模式。
iIndex:模式索引
TPSM_SAMPLERATE_HIGH_ID:高采样率
TPSM_SAMPLERATE_LOW_ID:低采样率
lpInput:指向包含相关信息的内存
DdsiTouchPanelEnable()
该函数所执行的动作:
⑴为需要用到的I/O,ADC,PWM和INT寄存器分配内存空间。
⑵配置触摸屏控制器、中断控制器和PWM的寄存器。
⑶申请触摸屏中断gIntrTouch和定时器中断gIntrTouchChanged,并且对它们进行初始化,为物理中断号分配相应的系统逻辑中断号。。
DdsiTouchPanelDisable()
屏蔽触摸屏中断和释放为I/O,ADC,PWM和INT寄存器分配的WinCE内存空间。
DdsiTouchPanelAttach()
只是简单地返回1。
DdsiTouchPanelDetach()
只是简单地返回0。
DdsiTouchPanelGetPoint (TOUCH_PANEL_SAMPLE_FLAGS * pTipStateFlags,
&&&&&&&&&&&&&&&&&&&&&& INT * pUncalX,
&&&&&&&&&&&&&&&&&&&&&& INT * pUncalY )
获得Touch Panel上被按下的点的状态和坐标。
◆pTipStateFlags:当前触摸点的状态,比如无效点,有效点,被按下的点等。
◆pUnCalX:触摸点的X坐标
◆pUnCalY:触摸点的Y坐标
DdsiTouchPanelPowerHandler(BOOL&& bOff)
设置touch panel的电源状态,boff:TRUE表示关闭电源,FALSE表示打开电源,
2.触摸屏驱动程序的实现
Windows CE5.0触摸屏驱动程序采用中断方式对触摸笔的按下状态进行检测,如果检测到触摸笔按下将产生中断并触发一个事件通知一个工作线程开始采集数据。同时,驱动将打开一个硬件定时器,只要检测到触摸笔仍然在按下状态将定时触发同一个事件通知工作线程采集数据,直到触摸笔抬起后关闭该定时器,并重新检测按下状态。驱动中采用了触摸屏中断以及定时器中断2个中断源,不仅可以监控触摸笔按下和抬起状态,而且可以检测触摸笔按下时的拖动轨迹。触摸屏驱动流程下图所示
3.四线电阻式触摸屏的工作原理
四线电阻式触摸屏的结构如图1,在玻璃或丙烯酸基板上覆盖有两层透平,均匀导电的ITO层,分别做为X电极和Y电极,它们之间由均匀排列的透明格点分开绝缘。其中下层的ITO与玻璃基板附着,上层的ITO附着在PET薄膜上。X电极和Y电极的正负端由“导电条”(图中黑色条形部分)分别从两端引 出,且X电极和Y电极导电条的位置相互垂直。引出端X-,X+,Y-,Y+一共四条线,这就是四线电阻式触摸屏名称的由来。当有物体接触触摸屏表面并施以 一定的压力时,上层的ITO导电层发生形变与下层ITO发生接触,该结构可以等效为相应的电路,
计算触点的X,Y坐标分为如下两步:
1. 计算Y坐标,在Y+电极施加驱动电压Vdrive, Y-电极接地,X+做为引出端测量得到接触点的电压,由于ITO层均匀导电,触点电压与Vdrive电压之比等于触点Y坐标与屏高度之比。
2. 计算X坐标,在X+电极施加驱动电压Vdrive, X-电极接地,Y+做为引出端测量得到接触点的电压,由于ITO层均匀导电,触点电压与Vdrive电压之比等于触点X坐标与屏宽度之比。
测得的电压由ADC转化为触摸点的原始坐标(数值范围由所选用的A/D转换器位数决定)后,还要根据具体使用的液晶屏实际像素进行转换,转换后通过校准直接转化为屏幕上的坐标,供GWES使用。
4.触摸屏的接口部分
◆X+:连接触摸屏控制器的TSXP,。
◆X-:连接触摸屏控制器的TSXM。
◆Y+:连接触摸屏控制器的TSYP。
◆Y-:连接触摸屏控制器的TSYM。
在触摸屏接口使用时,TSXM或TSYM应该接触摸屏接口的。
5.配置控制器硬件
5.1 ADCCON-----ADC控制寄存器
ECFLG:ADCCON[15],AD转换结束标志,只读,0表示AD转换在过程中;1表示AD转换结束。
PRSCEN:ADCCON[14],AD转换器预分频器使能,在此使能,故为1。
PRSCVL:ADCCON[13:6],AD转换器预分频器值,在此为49。
SEL_MUX:ADCCON[5:3],模拟信号输入通道选择,在此选择XP,故为7。
STDBM:ADCCON[2],备用操作模式选择,在此选择普通操作模式,故为0。
READ_START:ADCCON[1],通过读取来启动A/D转换,在此选择通过读取操作无效来启动A/D转换,故为0。
ENABLE_START,ADCCON[0],通过使能该位来启动A/D转换,在此选择无操作。此位在A/D转换开始后被使能。
5.2 ADCTSC-----ADC触摸屏控制寄存器
UD_SEN:ADCTSC[8],在此选择检测到触笔按下就产生中断信号,故为0。
YM_SEN:ADCTSC[7],YM开关使能,在此选择YM输出驱动有效(GND),故为1。
YP_SEN:ADCTSC[6],YP开关使能,在此选择YP输出驱动无效(AIN5),故为1。
XM_SEN:ADCTSC[5],XM开关使能,在此选择XM输出驱动无效(Hi-Z),故为0。
XP_SEN:ADCTSC[4],XP开关使能,在此选择XP输出驱动无效(AIN7),故为1。
PULL_UP:ADCTSC[3],上拉开关使能,在此选择XP上拉有效,故为0。
AUTO_PST:ADCTSC[2],初始化时,在此选择自动连续测量X坐标和Y坐标,故为0,但如果开始转换时,应该置1。
XY_PST:ADCTSC[1:0],手动测量X坐标和Y坐标,在此选择等待中断模式,故为3。
注:当等待触摸屏中断时,XP_SEN位(XP输出无效)应该置为1,且PULL_UP(XP上拉使能)位应该置为0。
5.3 ADCDLY-----ADC开始延时寄存器
DELAY:ADCDLY[154:0],因为选择等待中断模式,此值表示,当触笔按下出现在睡眠模式时,产生一个用于推出睡眠模式的信号,有几个毫秒的时间间隔。在此此值为40000?????????(40s,太长了吧?)
SUBINTMSK-----WinCE中子中断屏蔽寄存器
该寄存器有11位,每位和一位中断源相关。触摸屏中断请求有效,故第十位应设为0。
v_pINTregs->INTSUBMSK &= ~(1<<IRQ_SUB_TC);
5.4 TCFG1-----5路多路器及DMA模式选择寄存器
MUX3:TCFG1[15:12],为PWM计时器3选择多路输入,并初始化其值,每个定时器都有一个时钟分频器,其可以生成5钟不同的分频信号(1/2,1/4,1/8,1/16和TCLK),在此选择1/16分频。
v_pPWMregs->TCFG1 &= ~(0xf << 12); /* Timer3's Divider Value&& */
v_pPWMregs->TCFG1 |= (3&& << 12);&&&& /* 1/16&&&
TCNTB3-----PWM定时器3计数缓存寄存器,选择定时器3为时钟,比如定义10ms中断一次,提供触摸屏采样时间基准,即10ms触摸屏采样一次。在此为17×,在此PCLK=400MHz/6,可以得出timer3的时钟频率=PCLK/(244+1).16,可以算数触摸屏就是10ms产生一次定时中断,进行一次采样。
6.判断触摸屏是否被触摸和中断处理
我们采用中断等待模式,当触笔按下时,触摸屏控制器产生中断信号(INT_TC)给中断控制器,中断处理程序捕捉到这个物理中断后,调用已注册的ISR来决定如何处理这个硬件中断。ISR向内核返回对应于这个物理中断的逻辑中断号,比如我们用触笔按下触摸屏时,产生INT_TC物理中断,ISR把物理中断号映射成逻辑中断信号,然后操作系统根据物理中断号触发所关联的WinCE事件内核对象gIntrTouch,从而等待这个事件内核对象的IST(TouchPanelpISR,这个名字不是很合理应该改为TouchPanelpIST)来开始执行中断处理。
我们在驱动中采用了两个中断源,一个是触摸屏中断(包括触笔按下或抬起中断,根据ADC触摸屏控制寄存器ADCTSC的UD_SEN位来决定,在代码中的名字是gIntrTouch),也就是说当触笔按下或抬起时会产生物理中断INT_TC,其对应的逻辑中断号为SYSINTR_TOUCH;另一个是定时器中断(在此采用timer3),只要检测到触笔仍然在按下状态,将定时(在此是10ms,在代码中的名字是gIntrTouchChanged)产生定时中断INT_TIMER3,其对应的逻辑中断号为SYSINTR_TOUCH_CHANGED。这两个中断产生时都会触发同一个事件hTouchPanelEvent,然后等待这个时间的IST(TouchPanelpISR)线程将开始执行。
以下是产生中断的条件
⑴ 触笔按下时,产生触摸屏中断。
⑵ 触笔抬起时,也产生触摸屏中断。
⑶ 触笔按下产生触摸屏中断的同时,驱动打开硬件定时器timer3,只要检测到触笔仍然在按下状态,将定时(每隔10ms产生定时器中断)中断。
判断触笔对于触摸屏的活动情况的流程如下:&
7. 获得稳定、去抖动的位置测量数据
在获得触摸点的原始坐标(数值范围由所选用的A/D转换器位数决定)后,还要根据具体使用的液晶屏实际像素进行转换,转换后通过校准直接转化为屏幕上的坐标,以方便图形界面的后续开发,然后通过回调函数把屏幕坐标和采样状态这些参数传递给GWES
人机界面中对触摸屏的操作有以下3钟:
⑴ 触摸笔在触摸屏上的位置不变。
⑵ 触摸笔在触摸屏上连续滑过。
⑶ 触摸笔在触摸屏上有大幅度的跳跃。
7.1 触摸屏采样程序
当触笔按下时,就开始进行触摸屏触摸坐标的采样,同时打开定时中断,为10ms后的定时器中断做好准备。下面是采样过程:
⑴ 通过对ADC控制寄存器ADCCON和ADC触摸屏控制寄存ADCTSC的设置,启动自动测量X坐标和Y坐标。
⑵ 等待AD转换完成,通过对ADCCON的ECFLG的访问可以判断AD转换完成与否。
⑶ AD转换完成后,就通过对ADC转换数据寄存器ADCDAT0和ADCDAT1的读取触摸屏坐标的Y坐标和X坐标值。
⑷ 回到第一步,连续取得5组数据,求和并计算其平均值,如果平均值和这5组数据中最近一次数据的差值大于我们规定的阈值(这个阈值应该需要根据我们采用的LCD屏的分辨率来决定)时,认为此次采样值无效,同时对修改寄存器ADCTSC的设置,让其处于等待中断模式,为下次中断(触笔抬起中断做好准备)。
7.2 触摸屏滤波程序
通过函数TSP_GetXY()得到触笔按下位置的触摸屏坐标后,到把校准后的坐标通过回调函数传递给GWES,其中此回调函数是通过GWES调用TouchPanelEnable(pfnCallback)函数传递进来的,这过程有以下步骤:
⑴ 通过函数TSP_GetXY()得到触笔按下位置的触摸屏坐标。
⑵ 根据具体使用的液晶屏实际像素对触摸屏坐标进行转换,也即通过函数
TSP_TransXY()转换TSP_GetXY()函数得到的触摸屏坐标,用到公式
X=W*(x-x1)/(x2-x1),Y=H*(y-y1)/(y2-y1),其中(x1,y1)和(x2,y2)分别表示显示区域左上角和右上角对应的触摸屏的采样坐标,在此显示屏的分辨率为240×320,代码中(x1,y1)和(x2,y2)值为(85,105)和(965,980),这些值是分辨率240×4和320×4后确定的,相应地我们也需要对W和H做处理:W=4*W,H=4*H,(x,y)是触摸屏上任意一点的采样坐标(在这里有一个地方有疑问,右下角坐标的x值为什么是965,它不是大于240×4了吗?)。
⑶ 对由⑵得到的坐标值进行判断,如果x坐标值大于等于240×4,或者y坐标值大于等于320×4(也就是⑵转换前的x坐标值大于等于965,y坐标值大于等于980)时,我们认为这次采样值无效,或者如果最近两次采样值的相应的x坐标值差额或y坐标值差额分别小于等于15和40,则表示触笔在这两次采样的时间内一直在同一个位置,故忽略最近的采样值;如果如果最近两次采样值的相应的x坐标值差额或y坐标值差额分别大于15和40,则表示触笔在这两次采样的时间内触笔在滑动,此次采样有效。
⑷通过TouchPanelCalibrateAPoint()函数把有效的触摸屏按下点的坐标转换成相应的显示设备点坐标,用到Sx=A1*Tx+B1*Ty+C和Sy=A2*Tx+B2*Ty+C2这两个公式,其中A1,B1,C1和A2,B2,C2在执行触摸屏校准程序的时候通过TouchPanelSetCalibration()函数计算出来。
⑸通过⑷转换得到显示坐标,对这些值进行边界检查,如果此x坐标值大于等于。
⑹通过TouchPanelEnable(pfnCallback)函数传递进来的函数指针进行回调,同时传递采样状态,校准后得到的显示坐标给GWES。
触笔按下的触摸屏坐标经过校准后,通过callbak函数采样状态和位置变化信息通过GWES发送给更高层的图形软件。
8.校准触摸屏
触摸屏的校准过程如下:
⑴ 调用TouchPanelEnable函数来启动触摸屏采样。
⑵ 调用TouchPanelGetDeviceCaps函数来获得校准触点的个数。
⑶ 去校准点,对于每一个校准点都有一下过程:
I:调用TouchPanelGetDeviceCaps函数来得到校准点的坐标。
II:在上述校准点处画十字,等待用户点击.
III:用户点击十字图形后,调用TouchPanelReadCalibrationPoint函数来获得上述校准点处触摸屏对应的坐标。
⑷ 当取完所需用的校准点,调用TouchPanelSetCalibration函数来计算校准系数A1,B1,C1和A2,B2,C2。
完成上述步骤后,WinCE平台下的触摸屏驱动开发就已基本完成,实际操作中还需考虑具体的硬件环境。
阅读(2035) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。}

我要回帖

更多关于 触摸屏触摸控制反了 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信