若电脑触摸屏校正软件时不小心校正错误,会有什么后果,可以在开发板中尝试一下

1489人阅读
没想到飞凌的开发板,默认出货的时候是没有校屏的。包括WINCE。这里分享下校屏的经验。
WINCE的校屏参数是保存在注册表中的。打开BSP包中的platform.reg,找到如下代码:
IF&BSP_NOTOUCH&!&&
[HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/TOUCH]&&
&"MaxCalError"=dword:7&&
&"CalibrationData"="626,464&,813&190,108&"&&
&&&"Order"=dword:1&&
ENDIF&BSP_NOTOUCH&!&&
这里的CalibrationData即是校屏数据。由于WINCE开机后触摸偏移太大,根本没法点击进入校屏程序,有两种方法:
方法一:如果您手上有USB鼠标,将USB鼠标插入USB的HOST接口,这时就可以通过鼠标进入校屏界面了。点开始,控制面板,笔针。
方法二:这种方法不适合初学者,适合程序开发人员。首先同步开发板,将校屏应用程序拷到开发板某目录,再通过VS2005,任意打开一个应用程序,将程序入口指向拷备的应用程序,再F5,即运行了该校屏程序。详细步骤这里就不一一列举了。
校完屏后,如果校正的注册表丢失,再重烧系统后,又会出现偏移。批量生产时就更不用说了。那怎么办呢?其实,当您校完屏后,保存的校正数据已经保存起来了。通过remote register editer查看注册表信息,进入如下路径:HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/TOUCH记录CalibrationData的数据,将platform.reg里的错误数据用该数据替换。注意,files目录下的和release目录下的platform.reg都要修改!更改后再make一下,生成的NK,就是正确的数据了。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:197445次
积分:3351
积分:3351
排名:第9395名
原创:130篇
转载:62篇
评论:31条
(6)(1)(8)(11)(24)(4)(2)(3)(1)(1)(2)(1)(11)(20)(1)(67)(19)(1)(1)(1)(1)(1)(1)(5)(3)【触摸屏校正总结 9900字】- 天天范文
触摸屏校正总结(9900字)
来自:字数:9900
移植tslib-1.4所遇到的问题分析与(elephant半原创)
一:移植环境
1:主机环境:Ret Hat Enterprise 5
2: 交叉工具链:arm-linux-gcc-4.3.2
3: 开发平台:友善之臂mini2440+统宝3.5寸屏
4:所需的软件资源:
tslib-1.4.tar.gz
qt-x11-opensource-src-4.5.3.tar.gz
qt-embedded-opensource-src-4.5.3.tar.gz (QT的移植是参考网上找到一篇较好的移植手册,但是此手册的作者不知道是无心之失还是咋的,给的资料有所保留。不过思路比较清晰以及解析的比较详细,还是非常值得参考的)
参照的文章链接地址为:/view/242c91f24693daef5ef73d82.html
二:交叉编译tslib-1.4
在移植好触摸屏的驱动后(在移植内核的时候完成),一般都要移植一个tslib来配合,在用户层对触摸屏的数据进行滤波和矫正,同时也可以给应用程序一个统一的接口,很多GUI都支持tslib的接口。我移植到开发板的QT版本是QT4,所以用tslib-1.4进行触摸屏校正,因为QT4只是支持tslib-1.4(目前最新版),QT2支持的是tslib-1.3版本,所以在移植过程中先要看清楚自己移植的是什么版本。
简单描述tslib校正触摸屏原理:
Tslib是触摸屏驱动和应用层之间的适配层,它从触摸屏驱动处获得原始的设备坐标数据,通过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的设备坐标转换为相应的屏幕坐标。通过tslib/src/tslib.h文件可以看出,在tslib中为应用层提供了2个主要的接口ts_open(),ts_close();ts_read()和ts_read_raw(),其中ts_read()为正常情况下的接口,ts_read_raw()为校准情况下使用的接口。从tslib默认的ts.conf文件中可以看出包括如下基本插件:(强烈建议通读这个配置文件并理解这个文件所写的内容)
pthres 为Tslib 提供的触摸屏灵敏度门槛插件;
variance 为Tslib提供的触摸屏滤波算法插件;
dejitter 为Tslib 提供的触摸屏去噪算法插件;
linear为Tslib 提供的触摸屏坐标变换插件。
tslib 从触摸屏驱动采样到的设备坐标进行处理再提供给应用端的过程大体如下:
raw device --& variance --& dejitter --& linear --& application
再来看看ts_calibrate主要做了哪些事情,校准情况下,tslib对驱动采样到的数据进行处理的一般过程如下:
1。读取屏上5个点的坐标(Top Left,Top Right,Bottom Left,Bottom Right,Center),在进行一系列的变换,取样的5个点,实际上是包含3个不同的X值,3个不同的Y值。和scaling 值一共7个值,一起保存到/etc/pointercal中.(触摸屏校准文件)
2.这个/etc/pointercal文件主要是供linear插件使用。而我们每次的触摸的操作都进行多次触摸坐标变换。
至此已经找到解决问题的大体的方法了。在校准触摸屏后只需及时的让linear插件再次读取新的/etc/pointeracal文件,这样新校准的坐标信息就及时的更新到上层应用。下面就要考虑具体实现的问题了。
1。从linear.c文件可以看出在该模块初始化时读取了/etc/pointercal文件。只要在linear_read()中读取新的/etc/pointercal文件即可。
2。校准后保存了一个新的pointercal文件,但ts_lib怎么知道当前的pointercal文件是应该读取的新文件。刚开始的时候我们在linear.c的linear_read()函数中采取计数轮询的方式查看/etc/poinercal文件的最后更新时间,如果当前的更新时间大于上次更新时间,就去读取下pointercal文件。我们暂且不说在一台刚下流水线的机器,它的rtc时间是不确定,再进行时间比较时会出现错误。另外始终的轮询的方式和ts_lib的采样间隔时间值很小。这样用户在进行触摸屏常按操作时,会非常明显的消耗系统资源。
3。此时想到的办法就是进程通信,ts_lib是个动态库运行于系统中,他存在系统中不是以进程方式,但可以采取折衷方法,将调用ts_lib的进程号(实际上就是X的进程号)保存到一个配置文件中。这样在使用ts_calibrate校准触摸屏后,利用信号的方式给ts_lib发送用户自定义信号,ts_lib的lineral.c中加一个简单的信号处理函数。在接受到信号后就去读取下新的pointercal文件。正常情况下不做任何的轮询和读取操作。
从上说的3个步骤中完全解决了校准后应用端触摸及时生效的问题。还有个次要问题就是如何锁屏?这需要从内核入手了,查看linux2.6内核/drivers/input/evdev.c从该驱动提供的ioctl中看到对基于evdev的输入设备都提供EVIOCGRAB实现。顾名思义,grab就是将当前的输入操作抓取到当前的操作中,让当前操作之外的所有应用端读不到触摸屏的触摸操作。由驱动源码就很容易知道该如何实现锁屏解锁操作了。源码如下:
truct tsdev *
char *tsdevice = &/dev/input/event0&;
ts = ts_open(tsdevice, 0);
int ts_tmpfd = ts_fd(ts);
if (ts_tmpfd== -1)
perror(&ts_open&);
unsigned long val =1;
int ioctl_ret=ioctl(ts_tmpfd,EVIOCGRAB,&val);
printf(&now lock the ts ioctl ret is:%d\n&,ioctl_ret);
if (ioctl_ret!=0)
printf(&Error: %s\n&, strerror(errno));
printf(&lock the ts success \n&);
现在开始交叉编译tslib,在开始编译前需要确定自己的开发环境是否安装了autoconf、automake和 libtool等软件包。之前我的虚拟机并不是完全安装,在编译过程中出现很多问题,在这里我建议大家虚拟机完全安装。不过如果确实不想重装系统的话,也可以手动安装,之前我自己就是手动安装的,虽然成功安装了tslib软件,但是在后续的QT移植过程中出现很多不可预知的错误,因此还是建议大家的虚拟机是完全安装的。可以利用命令查看自己虚拟机上的autoconf版本:autoconf –V
在开始编译tslib前还有一个问题需要特别注意:就是要确定在编译时所用的工具是交叉工具链而不是PC平台下的GCC工具,因为我要运行的平台是嵌入式ARM架构而不是PC的X86架构。关于这一点,在网上找到很多资料都没有说明,几经寻找之下,终于在CSDN博客上看到网友yihui8的文章,对这一点作了说明。(还是网友yihui8厚道)。
网友yihui8博客地址(详细解析tslib-1.4交叉编译):
/yihui8/archive//5753270.aspx
第一步:解压源码包:
xvzf tslib-1.4.tar.gz
第二步:进入tslib之后关键是要设置交叉编译环境(下面是根据我自己的实际情况所添加的)——如果不设置交叉编译环境,在移植到开发板时,执行./ts_calibrate程序时会出现以下错误:
./ts_calibrate: line 1: syntax error :”(” unexpected.
$export PATH=$PATH:/usr/local/arm/4.3.2/bin
$export CC=arm-linux-gcc
$export CXX=arm-linux-g++
设置好交叉编译环境后就可以开始安装了:
执行./autogen.sh
执行./autogen.sh之后可能会有上述信息出现,但是我的机器上灰常不给力,只是显示出其中几行信息,一开始以为是出错,但是最后还是移植成功,证明这步就算只出现几行信息并无多大关系。
接着执行以下命令:
./configure
--prefix=/usr/local/tslib/
--host=arm-linux
ac_cv_func_malloc_0_nonnull=yes
(1)有些开发板在执行此命令时需要添加—enable inputapi=no或者—enable input=no,至于是哪一个就需要根据tslib目录下的configure文件才可以知道。(建议这个文件还是看一下)。由于友善之臂mini2440的触摸屏驱动是支持ioctl操作的(在内核移植时做触摸屏驱动时可以看到源码中是支持ioctl的),因此我在这里并没有加上—enable inputapi=no.
(2)如果没有加上ac_cv_func_malloc_0_nonnull=yes会出现交叉编译错误:undefined reference to `rpl_malloc'. 这是由ac_cv_func_malloc_0_nonnull检查引起的,为了不让它检查,产生一个cache文件daiq_tslib.cache,欺骗configure再执行:因此为了编译的顺利进行,在配置的时候需要加上这一句:ac_cv_func_malloc_0_nonnull=yes
最后执行make & make install就可以在指定的路径上成功安装tslib。我的指定路径是/usr/local/tslib/,在这个文件下安装成功的话会有四个目录:lib/
安装好tslib之后将动态链接库文件拷贝到根文件系统中,(注意tslib依赖的是动态链接库文件),如果忘记拷贝动态链接库的话会出现以下错误:
拷贝进去之后需要在自己的根文件系统的/etc/profile(在文件的一开始添加下面的内容)设置
tslib的环境变量(要根据自己的实际情况来设置),下面是我的开发板所设置的有关tslib的环境变量:
# Ash profile
#vim syntax=sh
#No core files by default
echo &Set ENV for tslib......&
QTDIR=/usr/local/Trolltech/QtEmbedded-4.5.3-arm(文件系统中QT的安装目录)
export TSLIB_ROOT=/usr/local/tslib
(tslib的目录)
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal
export POINTERCAL_FILE=$TSLIB_ROOT/etc/pointercal
QWS_DISPLAY=LinuxFb:dev/fb0
export set QWS_SIZE=320x240
export QWS_MOUSE_PROTO=Tslib:/dev/input/event0
export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH
echo “the env is successful”
当配置好这些环境变量后下载到开发板,执行./ts_calibrate时如果出现: ts_open: No such file or directory
说明环境变量设置有问题,可以用env命令查看一下有没有你刚才设置的环境变量。在设置环境变量这一个环节上是比较重要的,要保证在每一个目录下都存在你需要用到的文件。
补充:tslib环境变量配置说明:
在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。
Tslib 是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。在 Qtopia 4.*版本中,默认的Tslib版本为Tslib 1.4。在Qtopia 2.*版本中,默认的Tslib版本为Tslib 1.3。
在嵌入式中,由于触摸屏的种类多样、质量不一,采用Tslib 的参考配置往往无法获得较好的触摸屏触摸效果,同样需要经过大量的测试才能得到满意的配置参数,恶劣情况下,甚至需要对Tslib 的算法进行进一步的优化。下面就Tslib 的环境变量、配置文件等进行简要的介绍。
1) 环境变量
为了实现Tslib 的正确运行,需要对如下的Tslib 的环境变量进行配置: 2) TSLIB_TSDEVICE //触摸屏设备文件名
Default (no inputapi): /dev/touchscreen/ucb1x00
Default (inputapi): /dev/input/event0
TSLIB_CALIBFILE //校准的数据文件,由ts_calibrate 校准程序生成 Default: ${sysconfdir}/pointercal
TSLIB_CONFFILE //配置文件名
Default: ${sysconfdir}/ts.conf
TSLIB_PLUGINDIR //插件目录
Default: ${datadir}/plugins
TSLIB_CONSOLEDEVICE //控制台设备文件名
Default: /dev/tty
TSLIB_FBDEVICE //FrameBuffer设备名
Default: /dev/fb0
3) 以上环境变量在实际开发中的实际配置可以根据实际情况决定。
4) 2)配置文件
除了环境变量以外,Tslib 的配置文件ts.conf 同样是个十分重要的部分,在ts.conf 中配置了需要加载的插件、插件加载顺序以及插件的一些约束参数,这些配置参数对触摸屏的触摸效果具有十分重要的影响。 下面是Tslib 1.4 中的ts.conf 的参考配置:
5) # Uncomment if you wish to use the linux input layer event
# module_raw input
# Uncomment if you're using a Sharp Zaurus SL-5500/SL-5000d # module_raw collie
# Uncomment if you're using a Sharp Zaurus SL-C700/C750/C760/C860 # module_raw corgi
# Uncomment if you're using a device with a UCB00 TS interface
# module_raw ucb1x00
# Uncomment if you're using an HP iPaq h3600 or similar
# module_raw h3600
# Uncomment if you're using a Hitachi Webpad
# module_raw mk712
# Uncomment if you're using an IBM Arctic II # module_raw arctic2
module pthres pmin=1 module variance delta=30 module dejitter delta=100 module linear
6) 其中 pthres 为Tslib提供的触摸屏灵敏度门槛插件;variance 为
Tslib提供的触摸屏滤波算法插件;dejitter 为Tslib提供的触摸屏去噪算法插件;linear 为Tslib 提供的触摸屏坐标变换插件。
7) tslib 的实际配置:
8) 去掉module_raw input前面的#号,同时把其他#号注释项全部删
除,以免给后来的操作带来麻烦。我的最终ts.conf 内容为:
module_raw input
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
在执行校正程序时(如./ts_calibrate或./ts_test)可能出现的错误: 1:运行./ts_test
No raw modules loaded.
ts_config: No such file or directory
出现这样的错误提示,可以很明确的告诉你,你的库缺少了一些*.so文件()
ts.conf文件中应该有一行(在配置文件上有很多的raw,但是全部是被注释掉的,但是至少需要打开一个。因为触摸屏是使用input子系统的,所以将module_raw input前面的#号去掉,并且前面不留空格,千万别留空格啊,有一个网友就是因为这个小小的空格搞到他郁闷了很久,幸好我比他醒目,绝不留空格,哈哈。。。。)
module_raw input
/nand1/tslib-1.4/lib/ts目录下应该有个文件叫
input.so(这个文件比较重要,我第二次移植过程中不小心把input裁剪掉了,当插件库$TSLIB_ROOT/lib/ts目录下没有这个文件时会提示如下错误)
No raw modules loaded.
ts_config: No such file or directory
2:在做测试的时候,运行./ts_calibrate出现了tslib-1.4经典的错误:(出现这个错误你不要沮丧,反而应该高兴,说明你之前的步骤已经全部没错了,只要把这个经典的错误解决就万事大吉了。很庆幸,这个错误有很多网友都已经有办法解决了)
经典错误: Couldnt load module input No raw modules loaded
tsconfig: Success
错误分析:那么错误就定位在 ts_config 里。并且可以进一步确定是在加载插件模块时出的错。 阅读了tslib 的源代码,知道了cstdlib 库里的一个函数: getenv
是用来得到指定系统环境变量的值。是为了测试 tslib 是否得到正确的环境变量。
其环境变量默认的值在readme中有注明。
加载插件模块时出出错分析:
ts_calibrate会打开ts_config
ts_config函数里首先会读取 tslib 配置文件(ts.conf,由 TSLIB_CONFFILE环境变量指定,在tslib/etc下面),
然后根据这个文件逐个加载插件库,1.4版本的ts.conf内容为:
Module_raw input
(读readme文件可以找到这个字符串)
module pthres pmin=1
module variance delta=30
module dejtter delta=100
module linear
ts_config又会调用ts_load_module加载库。从这个函数里,程序先是得到配置文件中指定加载的模块名,
然后根据模块名构造了一个 so 文件文件名,然后调用了系统函数 dlopen 加载库!
Linux 下的加载dlopen 类似于 Windows 下动态链接库的函数:dlopen
错误就应该出在构造的库文件名是错误的---其指定的文件不存在
---从而导致 dlopen无法加载。所以才提示找不到文件或目录!
那么这样就是应该把需要的input.so variance.so dejitter.so linear.so应该复制到/tslib/plugins中(上面修正后作了这一步,就可以拉,就不会出现错误拉)
3: [~#]./ts_calibrate.sh
此时会加载tslib中的插件模块input.so,且会抛出Segement fault的错误。仔细分析tslib的源码之后,得知在加载
input.so时,ts_attach.c中__ts_attach_raw()函数中使用NULL指针,导致Segement fault产生。经过修改过,重新
编译tslib,再运行ts_calibrate.sh,一切正常。ts_attach.c中__ts_attach_raw()中的修改如下:
for(next = ts-&list, prev= next != NULL && next != prev_ next = prev-&next, prev =
DEBUG(&LIUHAO:: %s %s:count=%d prev_list=%x prev=%x next=%x prev-&next=%x\n&,
__FILE__, __FUNCTION__, count++, prev_list, prev, next, prev-&next);
for(next = ts-&list, prev= next != NULL && next != prev_)
DEBUG(&LIUHAO:: %s %s:count=%d prev_list=%x prev=%x next=%x prev-&next=%x\n&,
__FILE__, __FUNCTION__, count++, prev_list, prev, next, prev-&next);
next = prev-&
if(next == NULL)
至此,tslib所有已经完成,ts_calibrate会在~/ts-release/etc/目录下生成
pointercal文件。pointercal为触摸屏校准后生成的文件,确保QT运行时,触摸屏正常。
+ 更多类似范文┣&┣&┣&┣&┣&更多┗&
更多相关推荐:
试用期工作总结20xx年x月x日,我通过面试,来到中冶赛迪上海工程技术有限公司工作,不觉已经工作两个月了,在这几个月的工作中,我努力适应新的工作环境和工作岗位,虚心学习,埋头工作,履行职责,较好地完成了各项工作…
20xx年x月x日,我通过面试,来到江苏南大金山环保科技有限公司工作,不觉已经工作四个月了,5、6月是毕业实习,7、8月为试用期,在这几个月的工作中,我努力适应新的工作环境和工作岗位,虚心学习,埋头工作,履行职…
回顾这一年来的工作,我在公司领导及各位同事的支持与帮助下,严格要求自己,按照公司的要求,较好地完成了自己的本职工作。通过一年来的学习与工作,工作模式上有了新的突破,工作方式有了较大的改变,现将一年来的工作情况总…
大家在关注触摸屏pos机的屏幕怎么校正谁说一下?_电脑网络问题_土巴兔问吧
触摸屏pos机的屏幕怎么校正谁说一下?
报价结果将发送到您的手机
装修顾问-馨馨
4年行业经验,24h可咨询
10秒闪电通过好友
报价短信已发送到您的手机
因材料品牌及工程量不同,具体报价以量房实测为准
稍候装修管家将回电您,免费提供装修咨询服务
您的装修预算约
*装修管家将回电您,免费提供装修咨询服务
*装修管家将回电您,免费提供装修咨询服务
*因材料品牌及工程量不同,具体报价以量房实测为准
装修顾问 -馨馨
(四年装修行业经验)
微信扫一扫
3.&您家小区名称 :&&
请选择您家的装修时间
触摸屏pos机的屏幕怎么校正谁说一下?
提问者:穆丁兰|
时间: 16:16:29
已有3条答案
回答数:31935|被采纳数:38
成都亲情树装饰工程设计有限公司
所有回答:&31935
 个人是无法校正POS屏幕的,除非有该工业测试机POS屏幕驱动,如果屏幕不准,一般都是有保修服务的;可以联系厂家,回厂维修。
  POS是一种多功能终端,把它安装在信用卡的特约商户和受理网点中与计算机联成网络,就能实现电子资金自动转帐,它具有支持消费、预授权、余额查询和转帐等功能,使用起来安全、快捷、可靠。大宗交易中基本经营情报难以获取,导入POS系统主要是解决零售业信息管理盲点。连锁分店管理信息系统中的重要组成部分。
  POS系统基本原理是先将商品资料创建于计算机文件内,透过计算机收银机联机架构,商品上之条码能透过收银设备上光学读取设备直接读入后(或由键盘直接输入代号)马上可以显示商品信息(单价,部门,折扣...)加速收银速度与正确性。每笔商品销售明细资料(售价,部门,时段,客层)自动记录下来,再由联机架构传回计算机。经由计算机计算处理即能生成各种销售统计分析信息当为经营管理依据。
回答数:1234|被采纳数:2
所有回答:&1234
你好,江西省厨房设备我推荐你使用一家的产品哦。我买了一套很不错,以前厨房的抽油烟机功效一点也不好,厨房里经常烟熏火燎的,奶奶也常常被呛得大声咳嗽。现在有了这么多厨具,相信奶奶以后再也不会被油烟煎熬,厨房也会很干净吧。这个产品外观设计是根据形状、图案、色彩或其结合的设计,又隐含着外观设计当然富有美感。厨房里各种现代化的厨具一应俱全。很不错哦
希望我的回答能帮到您哦!
回答数:18639|被采纳数:2
dream_6394
所有回答:&18639
①脱机功能是用于网络断线、服务器故障情况下,POS机无法正常销售,这是才需使用脱机功能,收银员输入的销售数据暂时存放在本机,当网络恢复后再上传到服务器。
②要使用脱机必须在网络正常情况下事先从服务器下载商品信息、收银员数据。只有商品数据最新,才能保障脱机功能的正常销售。
③脱机以后在屏幕左下方有一个脱机标志。
④脱机时无法使用储值卡,会员卡不打折,无法打印本班报表。
已有 3 个回答
已有 3 个回答
已有 3 个回答
已有 4 个回答
已有 3 个回答
北欧简约、复古美式、大气欧式、清新地中海风,总有一款适合你!
一万套装修案例
下载土巴兔APP
中国装修网【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第三十一章 触摸屏实验 - 正点原子的日志 - 电子工程世界-论坛
【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第三十一章 触摸屏实验
已有 2040 次阅读 22:45
第三十一章 触摸屏实验
& && & 本章,我们将介绍如何使用STM32来驱动触摸屏,ALIENTEK战舰STM32开发板本身并没有触摸屏控制器,但是它支持触摸屏,可以通过外接带触摸屏的LCD模块(比如ALIENTEK TFTLCD模块),来实现触摸屏控制。在本章中,我们将向大家介绍STM32控制ALIENTKE TFTLCD模块,使用软件模拟SPI来实现对TFTLCD模块的触摸屏控制,最终实现一个手写板的功能。本章分为如下几个部分:31.1 触摸屏简介31.2 硬件设计31.3 软件设计31.4 下载验证
31.1 触摸屏简介& & 我们一般液晶所用的触摸屏,最多的就是电阻式触摸屏了(多点触摸属于电容式触摸屏,比如几乎所有智能机都支持多点触摸,它们所用的屏就是电容式的触摸屏),ALIENTEK TFTLCD自带的触摸屏属于电阻式触摸屏,下面简单介绍下电阻式触摸屏的原理。电阻式触摸屏利用压力感应进行控制。电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面涂有一层透明氧化金属(透明的导电电阻)导电层,上面再盖有一层外表面硬化处理、光滑防擦的塑料层、它的内表面也涂有一层涂层、在他们之间有许多细小的(小于1/1000英寸)的透明隔离点把两层导电层隔开绝缘。 当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在X和Y两个方向上产生信号,然后送触摸屏控制器。控制器侦测到这一接触并计算出(X,Y)的位置,再根据获得的位置模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理。电阻屏的特点有:1)是一种对外界完全隔离的工作环境,不怕灰尘、水汽和油污。2)可以用任何物体来触摸,可以用来写字画画,这是它们比较大的优势。3)电阻触摸屏的精度只取决于A/D转换的精度,因此都能轻松达到。从以上介绍可知,触摸屏都需要一个AD转换器, 一般来说是需要一个控制器的。ALIENTEK TFTLCD模块选择的是四线电阻式触摸屏,这种触摸屏的控制芯片有很多,包括:ADS7843、ADS7846、TSC2046、XPT2046和AK4182等。这几款芯片的驱动基本上是一样的,也就是你只要写出了ADS7843的驱动,这个驱动对其他几个芯片也是有效的。而且封装也有一样的,完全PIN TO PIN兼容。所以在替换起来,很方便。ALIENTEK TFTLCD模块自带的触摸屏控制芯片为XPT2046。XPT2046是一款4导线制触摸屏控制器,内含12位分辨率125KHz转换速率逐步逼近型A/D转换器。XPT2046支持从1.5V到5.25V的低电压I/O接口。XPT2046能通过执行两次A/D转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。内部自带2.5V参考电压可以作为辅助输入、温度测量和电池监测模式之用,电池监测的电压范围可以从0V到6V。XPT2046片内集成有一个温度传感器。 在2.7V的典型工作状态下,关闭参考电压,功耗可小于0.75mW。XPT2046采用微小的封装形式:TSSOP-16,QFN-16(0.75mm厚度)和VFBGA-48。工作温度范围为-40℃~+85℃。该芯片完全是兼容ADS7843和ADS7846的,关于这个芯片的详细使用,可以参考这两个芯片的datasheet。
31.2 硬件设计 本章实验功能简介:开机的时候先通过24C02的数据判断触摸屏是否已经校准过,如果没有校准,则执行校准程序,校准过后再进入手写程序。如果已经校准了,就直接进入手写程序,此时可以通过按动屏幕来实现手写输入。屏幕上会有一个清空的操作区域(RST),点击这个地方就会将输入全部清除,恢复白板状态。程序会设置一个强制校准,就是通过按KEY0来实现,只要按下KEY0就会进入强制校准程序。所要用到的硬件资源如下:1)&&指示灯DS02)&&KEY0按键3) TFTLCD模块(带触摸屏)4)&&24C02所有这些资源与STM32的连接图,在前面都已经介绍了,这里我们只针对TFTLCD模块与STM32的连接端口再说明一下,TFTLCD模块的触摸屏总共有5跟线与STM32连接,连接电路图如图31.2.1所示:
图31.2.1 触摸屏与STM32的连接图 & & 从图中可以看出,T_MISO、T_PEN、T_CS、T_MOSI和T_SCK分别连接在STM32的:PF8、PF10、PB2、PF9和PB1上。31.3 软件设计 打开上一章的工程,首先在HARDWARE文件夹下新建一个TOUCH文件夹。然后新建一个touch.c和touch.h的文件保存在TOUCH文件夹下,并将这个文件夹加入头文件包含路径。打开touch.c文件,在里面输入与触摸屏相关的代码,这里我们也不全部贴出来了,仅介绍几个重要的函数。首先我们要介绍的是TP_Read_XY2这个函数,该函数专门用于从触摸屏控制IC读取坐标的值(0~4095),TP_Read_XY2的代码如下://连续2次读取触摸屏IC,且这两次的偏差不能超过//ERR_RANGE,满足条件,则认为读数正确,否则读数错误.& && & //该函数能大大提高准确度//x,y:读取到的坐标值//返回值:0,失败;1,成功。#define ERR_RANGE 50 //误差范围u8 TP_Read_XY2(u16 *x,u16 *y){& && & u16 x1,y1;& && &u16 x2,y2;& && &u8& && & flag=TP_Read_XY(&x1,&y1);&&& & if(flag==0)return(0);& & flag=TP_Read_XY(&x2,&y2);& && & & & if(flag==0)return(0);&&& & if(((x2<=x1&&x1<x2+ERR_RANGE)||(x1<=x2&&x2<x1+ERR_RANGE))//前后两次采样在+- ERR_RANGE 内& & &&((y2<=y1&&y1<y2+ERR_RANGE)||(y1<=y2&&y2<y1+ERR_RANGE)))& & {& && &&&*x=(x1+x2)/2;& && &&&*y=(y1+y2)/2;& && &&&return 1;& & }else return 0;&&}该函数采用了一个非常好的办法来读取屏幕坐标值,就是连续读两次,两次读取的值之差不能超过一个特定的值(ERR_RANGE),通过这种方式,我们可以大大提高触摸屏的准确度。另外该函数调用的TP_Read_XY函数,用于单次读取坐标值。TP_Read_XY也采用了一些软件滤波算法,具体见光盘的源码。接下来,我们介绍另外一个函数TP_Adjust,该函数源码如下://触摸屏校准代码//得到四个校准参数void TP_Adjust(void){& && && && && && && && && && && && && && && && && &&&& && & u16 pos_temp[4][2];//坐标缓存值& && & u8&&cnt=0;& & & && & u16 d1,d2;& && & u32 tem1,tem2;& && && && & & && & u16 outtime=0;& && &cnt=0;& && && && && && && && & & && & POINT_COLOR=BLUE;& && & BACK_COLOR =WHITE;& && & LCD_Clear(WHITE);//清屏&&& && & POINT_COLOR=RED;//红色& && & LCD_Clear(WHITE);//清屏& & & && & POINT_COLOR=BLACK;& && & LCD_ShowString(40,40,160,100,16,(u8*)TP_REMIND_MSG_TBL);//显示提示信息& && & TP_Drow_Touch_Point(20,20,RED);//画点1& && & tp_dev.sta=0;//消除触发信号& && & tp_dev.xfac=0;//xfac用来标记是否校准过,所以校准之前必须清掉!以免错误& && && && & while(1)//如果连续10秒钟没有按下,则自动退出& && & {& && && && &&&tp_dev.scan(1);& && && && && && && && && && && && && && &//扫描物理坐标& && && && &&&if((tp_dev.sta&0xc0)==TP_CATH_PRES)& & //按键按下了一次(此时按键松开了.)& && && && &&&{& & & && && && && && && &outtime=0;& && && && && && && && && && && &tp_dev.sta&=~(1<<6);//标记按键已经被处理过了.
& && && && && && && &pos_temp[cnt][0]=tp_dev.x;& && && && && && && &pos_temp[cnt][1]=tp_dev.y;& && && && && && && &cnt++;& && && && && && && && && &switch(cnt)& && && && && && && &{& && && && && && && && && && && && && && && && & case 1:& && && && && && && && && && && && && && && && && && && && && && && && &&&TP_Drow_Touch_Point(20,20,WHITE);& && && && && && &&&//清除点1& && && && && && && && && && && &&&TP_Drow_Touch_Point(lcddev.width-20,20,RED);& &&&//画点2& && && && && && && && && && && &&&& && && && && && && && && & case 2:& && && && && && && && && && && & TP_Drow_Touch_Point(lcddev.width-20,20,WHITE); //清除点2& && && && && && && && && && && &&&TP_Drow_Touch_Point(20,lcddev.height-20,RED);& & //画点3& && && && && && && && && && && &&&& && && && && && && && && & case 3:& && && && && && && && && && && & TP_Drow_Touch_Point(20,lcddev.height-20,WHITE);& && & //清除点3& && && && && && && && && && && & TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,RED);//画点4& && && && && && && && && && && &&&& && && && && && && && && & case 4://全部四个点已经得到& && && && && && && && && &&&//对边相等& && && && && && && && && && && &&&tem1=abs(pos_temp[0][0]-pos_temp[1][0]);//x1-x2& && && && && && && && && && && &&&tem2=abs(pos_temp[0][1]-pos_temp[1][1]);//y1-y2& && && && && && && && && && && &&&tem1*=tem1;& && && && && && && && && && && &&&tem2*=tem2;& && && && && && && && && && && &&&d1=sqrt(tem1+tem2);//得到1,2的距离& && && && && && && && && && && &&&tem1=abs(pos_temp[2][0]-pos_temp[3][0]);//x3-x4& && && && && && && && && && && &&&tem2=abs(pos_temp[2][1]-pos_temp[3][1]);//y3-y4& && && && && && && && && && && &&&tem1*=tem1;& && && && && && && && && && && &&&tem2*=tem2;& && && && && && && && && && && &&&d2=sqrt(tem1+tem2);//得到3,4的距离& && && && && && && && && && && &&&fac=(float)d1/d2;& && && && && && && && && && && &&&if(fac1.05||d1==0||d2==0)//不合格& && && && && && && && && && && &&&{& && && && && && && && && && && && && && &cnt=0;& && && && && && && && && && && & TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE);& && && && && && && && && && && && && && && & //清除点4& && && && && && && && && && && && && &TP_Drow_Touch_Point(20,20,RED); //画点1& && && && && && &TP_Adj_Info_Show(pos_temp[0][0],pos_temp[0][1],pos_temp[1][0],pos_temp[1][1],pos_temp[2][0],pos_temp[2][1],pos_temp[3][0],pos_temp[3][1],fac*100);//显示数据&&& && && && && && && && && && && && && &&&& && && && && && && && && && && &&&}& && && && && && && && && && && &&&tem1=abs(pos_temp[0][0]-pos_temp[2][0]);//x1-x3& && && && && && && && && && && &&&tem2=abs(pos_temp[0][1]-pos_temp[2][1]);//y1-y3& && && && && && && && && && && &&&tem1*=tem1;& && && && && && && && && && && &&&tem2*=tem2;& && && && && && && && && && && &&&d1=sqrt(tem1+tem2);//得到1,3的距离& && && && && && && && && && && &&&tem1=abs(pos_temp[1][0]-pos_temp[3][0]);//x2-x4& && && && && && && && && && && &&&tem2=abs(pos_temp[1][1]-pos_temp[3][1]);//y2-y4& && && && && && && && && && && &&&tem1*=tem1;& && && && && && && && && && && &&&tem2*=tem2;& && && && && && && && && && && &&&d2=sqrt(tem1+tem2);//得到2,4的距离& && && && && && && && && && && &&&fac=(float)d1/d2;& && && && && && && && && && && &&&if(fac1.05)//不合格& && && && && && && && && && && &&&{& && && && && && && && && && && && && && &cnt=0;& & TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE); //清除点4& && && && && && && && && && && && && &TP_Drow_Touch_Point(20,20,RED); //画点1& && && && && && && && && &TP_Adj_Info_Show(pos_temp[0][0],pos_temp[0][1],pos_temp[1][0],pos_temp[1][1],pos_temp[2][0],pos_temp[2][1],pos_temp[3][0],pos_temp[3][1],fac*100);//显示数据&&& && && && && && && && && && && && && && && && && && && && && && && && && &&&}//正确了& && && && && && && && && && && && && && &&&//对角线相等& && && && && && && && && && && &&&tem1=abs(pos_temp[1][0]-pos_temp[2][0]);//x1-x3& && && && && && && && && && && &&&tem2=abs(pos_temp[1][1]-pos_temp[2][1]);//y1-y3& && && && && && && && && && && &&&tem1*=tem1;& && && && && && && && && && && &&&tem2*=tem2;& && && && && && && && && && && &&&d1=sqrt(tem1+tem2);//得到1,4的距离& && && && && && && && && && && &&&tem1=abs(pos_temp[0][0]-pos_temp[3][0]);//x2-x4& && && && && && && && && && && &&&tem2=abs(pos_temp[0][1]-pos_temp[3][1]);//y2-y4& && && && && && && && && && && &&&tem1*=tem1;& && && && && && && && && && && &&&tem2*=tem2;& && && && && && && && && && && &&&d2=sqrt(tem1+tem2);//得到2,3的距离& && && && && && && && && && && &&&fac=(float)d1/d2;& && && && && && && && && && && &&&if(fac1.05)//不合格& && && && && && && && && && && &&&{& && && && && && && && && && && && && && &cnt=0;& &TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE); //清除点4& && && && && && && && && && && && && &TP_Drow_Touch_Point(20,20,RED);//画点1& && && && && && && && && && && && && &&&TP_Adj_Info_Show(pos_temp[0][0],pos_temp[0][1],pos_temp[1][0],pos_temp[1][1],pos_temp[2][0],pos_temp[2][1],pos_temp[3][0],pos_temp[3][1],fac*100);//显示数据&&& && && && && && && && && && && && && && && && && && && && && && && && && &&&}//正确了& && && && && && && && && && && &&&//计算结果& && && && && && && &&&tp_dev.xfac=(float)(lcddev.width-40)/(pos_temp[1][0]-pos_temp[0][0]);//得到xfactp_dev.xoff=(lcddev.width-tp_dev.xfac*(pos_temp[1][0]+pos_temp[0][0]))/2;//得到xoff& && && && && && && && && &&&tp_dev.yfac=(float)(lcddev.height-40)/(pos_temp[2][1]-pos_temp[0][1]);//得到yfac& && && && && && && && &&&tp_dev.yoff=(lcddev.height-tp_dev.yfac*(pos_temp[2][1]+pos_temp[0][1]))/2;//得到yoff & && && && && && && && && && && &&&if(abs(tp_dev.xfac)>2||abs(tp_dev.yfac)>2)//触屏和预设的相反了.& && && && && && && && && && && &&&{& && && && && && && && && && && && && && &cnt=0;& && && && &TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE);//清除点4& && && && && && && && && && && && && &TP_Drow_Touch_Point(20,20,RED); //画点1& && && && && && && && && && && && && && && && && && && && && && && && && &LCD_ShowString(40,26,lcddev.width,lcddev.height,16,\"TP Needreadjust!\");& && && && && && && && && && && && && && &tp_dev.touchtype=!tp_dev.//修改触屏类型.& && && && && && && && && && && && && && &if(tp_dev.touchtype)//X,Y方向与屏幕相反& && && && && && && && && && && && && && &{CMD_RDX=0X90; CMD_RDY=0XD0;}& && && && && && && && && && && && && && && && && && && && && && && && &else {CMD_RDX=0XD0;CMD_RDY=0X90;}//X,Y方向与屏幕相同 & && && && && && && && && && && && && && && && && && && && && && && && && &&&}& && && &&&& && && && && && && && && && && &&&POINT_COLOR=BLUE;& && && && && && && && && && && &&&LCD_Clear(WHITE);//清屏& && && && && && && && && && && &&&LCD_ShowString(35,110,lcddev.width,lcddev.height,16,\"Touch ScreenAdjust OK!\");//校正完成& && && && && && && && && && && &&&delay_ms(1000);& && && && && && && && && && && &&&TP_Save_Adjdata(); & && && && && && && && && && && & LCD_Clear(WHITE);//清屏&&& && && && && && && && && && && &&&//校正完成& && && && && && && &&&& && && && && && && &}& && && && &&&}& && && && &&&delay_ms(10);& && && && &&&outtime++;& && && && &&&if(outtime>1000)& && && && &&&{& && && && && && && &TP_Get_Adjdata();& && && && && && && && && && && & }& && &}}& & TP_Adjust是此部分最核心的代码,在这里,给大家介绍一下我们这里所使用的触摸屏校正原理:我们传统的鼠标是一种相对定位系统,只和前一次鼠标的位置坐标有关。而触摸屏则是一种绝对坐标系统,要选哪就直接点哪,与相对定位系统有着本质的区别。绝对坐标系统的特点是每一次定位坐标与上一次定位坐标没有关系,每次触摸的数据通过校准转为屏幕上的坐标,不管在什么情况下,触摸屏这套坐标在同一点的输出数据是稳定的。不过由于技术原理的原因,并不能保证同一点触摸每一次采样数据相同,不能保证绝对坐标定位,点不准,这就是触摸屏最怕出现的问题:漂移。对于性能质量好的触摸屏来说,漂移的情况出现并不是很严重。所以很多应用触摸屏的系统启动后,进入应用程序前,先要执行校准程序。 通常应用程序中使用的LCD坐标是以像素为单位的。比如说:左上角的坐标是一组非0的数值,比如(20,20),而右下角的坐标为(220,300)。这些点的坐标都是以像素为单位的,而从触摸屏中读出的是点的物理坐标,其坐标轴的方向、XY值的比例因子、偏移量都与LCD坐标不同,所以,需要在程序中把物理坐标首先转换为像素坐标,然后再赋给POS结构,达到坐标转换的目的。校正思路:在了解了校正原理之后,我们可以得出下面的一个从物理坐标到像素坐标的转换关系式:& && && && && && && && && && && && && && &LCDx=xfac*Px+xoff;& && && && && && && && && && && && && && &LCDy=yfac*Py+yoff;其中(LCDx,LCDy)是在LCD上的像素坐标,(Px,Py)是从触摸屏读到的物理坐标。xfac,yfac分别是X轴方向和Y轴方向的比例因子,而xoff和yoff则是这两个方向的偏移量。这样我们只要事先在屏幕上面显示4个点(这四个点的坐标是已知的),分别按这四个点就可以从触摸屏读到4个物理坐标,这样就可以通过待定系数法求出xfac、yfac、xoff、yoff这四个参数。我们保存好这四个参数,在以后的使用中,我们把所有得到的物理坐标都按照这个关系式来计算,得到的就是准确的屏幕坐标。达到了触摸屏校准的目的。TP_Adjust就是根据上面的原理设计的校准函数,注意该函数里面多次使用了lcddev.width和lcddev.height,用于坐标设置,主要是为了兼容不同尺寸的LCD(比如320*480和320*240的屏都可以兼容)。其他的函数我们这里就不多介绍了,保存touch.c文件,并把该文件加入到HARDWARE组下。接下来打开touch.h文件,在该文件里面输入如下代码:#ifndef __TOUCH_H__#define __TOUCH_H__#include \"sys.h\"#define TP_PRES_DOWN 0x80&&//触屏被按下&&#define TP_CATH_PRES 0x40&&//有按键按下了& && && && && && && & //触摸屏控制器typedef struct{& && & u8 (*init)(void);& && && && && && & //初始化触摸屏控制器& && & u8 (*scan)(u8);& && && && && && &&&//扫描触摸屏.0,屏幕扫描;1,物理坐标;& && && && & void (*adjust)(void);& && && && & //触摸屏校准& && & u16 x0;& && && && && && && && && && & //原始坐标(第一次按下时的坐标)& && & u16 y0;& && & u16& && && && && && && && && && &&&//当前坐标(此次扫描时,触屏的坐标)& && & u16& && && && && && && && && && && && && && && && & & && & u8&&& && && && && && && && && && &//笔的状态& && && && && && && && && && && && && && && && & //b7:按下1/松开0;& && && && && && && && && && & //b6:0,没有按键按下;1,有按键按下.////////////////////////触摸屏校准参数/////////////////////////& && && && && && && && && && && && && && && && && & & && && && && && && && && && && && && & & && && && && && && && &&&//新增的参数,当触摸屏的左右上下完全颠倒时需要用到.//touchtype=0的时候,适合左右为X坐标,上下为Y坐标的TP.//touchtype=1的时候,适合左右为Y坐标,上下为X坐标的TP.& && & u8}_m_tp_extern _m_tp_dev tp_& && && & //触屏控制器在touch.c里面定义//与触摸屏芯片连接引脚& && & #define PEN& && &&&PFin(10)& && & //PF10 INT#define DOUT& && &PFin(8)& && &&&//PF8&&MISO#define TDIN& && &&&PFout(9)& && & //PF9&&MOSI#define TCLK& && & PBout(1)& && & //PB1&&SCLK#define TCS& && && &PBout(2)& && & //PB2&&CS void TP_Write_Byte(u8 num);& && && && && && && && && && && & //向控制芯片写入一个数据u16 TP_Read_AD(u8 CMD);& && && && && && && && && && && && &//读取AD转换值u16 TP_Read_XOY(u8 xy);& && && && && && && && && && && && & //带滤波的坐标读取(X/Y)u8 TP_Read_XY(u16 *x,u16 *y);& && && && && && && && && &&&//双方向读取(X+Y)u8 TP_Read_XY2(u16 *x,u16 *y);& && && && && && && && && &//带加强滤波的双方向坐标读取void TP_Drow_Touch_Point(u16 x,u16 y,u16 color);&&//画一个坐标校准点void TP_Draw_Big_Point(u16 x,u16 y,u16 color);& && &//画一个大点u8 TP_Scan(u8 tp);& && && && && && && && && && && && && && && && && && &&&//扫描void TP_Save_Adjdata(void);& && && && && && && && && && && &&&//保存校准参数u8 TP_Get_Adjdata(void);& && && && && && && && && && && && && &//读取校准参数void TP_Adjust(void);& && && && && && && && && && && && && && && &//触摸屏校准u8 TP_Init(void);& && && && && && && && && && && && && && && && && & //初始化& && && && && && && && && && && && && && & void TP_Adj_Info_Show(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2,u16 x3,u16 y3,u16 fac);//显示校准信息& && && && & #endif上述代码,我们定义了_m_tp_dev结构体,用于管理和记录触摸屏相关信息,在外部调用的时候,我们一般直接调用tp_dev的相关成员函数/变量屏即可达到需要的效果。这样种设计简化了接口,另外管理和维护也比较方便,大家可以效仿一下。其他部分我们不做多的介绍,最后我们打开test.c,修改代码如下://清屏,重新装载对话界面& && && && && && && && && && && && &void Load_Drow_Dialog(void){& && & LCD_Clear(WHITE);//清屏&&& && &POINT_COLOR=BLUE;//设置字体为蓝色& && & LCD_ShowString(lcddev.width-24,0,200,16,16,\"RST\");//显示清屏区域& && &POINT_COLOR=RED;//设置画笔蓝色}& && && && && && && && && && && && && && && && && && && &int main(void){& && && &&&& && & u8& && & u8 i=0;& && && && &Stm32_Clock_Init(9);& & //系统时钟设置& && & uart_init(72,9600);& && &//串口初始化为9600& && & delay_init(72);& && && && && && &//延时初始化& && & LED_Init();& && && && && &&&//初始化与LED连接的硬件接口& && & LCD_Init();& && && && && && &//初始化LCD& && & usmart_dev.init(72);& && &//初始化USMART& && & & && & KEY_Init();& && && && && & //按键初始化& && && & & && &POINT_COLOR=RED;//设置字体为红色& && & LCD_ShowString(60,50,200,16,16,\"WarShip STM32\");& && && & LCD_ShowString(60,70,200,16,16,\"TOUCH TEST\");& && && && & LCD_ShowString(60,90,200,16,16,\"ATOM@ALIENTEK\");& && & LCD_ShowString(60,110,200,16,16,\"\");& &&&LCD_ShowString(60,130,200,16,16,\"Press KEY0 to Adjust\"); & && &tp_dev.init();& && & delay_ms(1500);& && & Load_Drow_Dialog();& && && && && && && && && && && && && && && && && && && && && && && && & & && & while(1)& && & {& && && && & key=KEY_Scan(0);& && && && &&&tp_dev.scan(0);& && && && &&&& && && && &&&if(tp_dev.sta&TP_PRES_DOWN)& && && && && &//触摸屏被按下& && && && &&&{& & & && && && && && &&&if(tp_dev.x<lcddev.width&&tp_dev.y<lcddev.height)& && && && && && && &{& & & && && && && && && && && & if(tp_dev.x>(lcddev.width-24)&&tp_dev.y<16)Load_Drow_Dialog();//清除& && && && && && && && && & else TP_Draw_Big_Point(tp_dev.x,tp_dev.y,RED);& && && && &//画图& && && && && && && && && && && &}& && && && &&&}else delay_ms(10);& && & //没有按键按下的时候& && && && && && && && &&&if(key==KEY_RIGHT)&&//KEY_RIGHT按下,则执行校准程序& && && && &&&{& && && && && && && &LCD_Clear(WHITE);//清屏& && && && && && &TP_Adjust();&&//屏幕校准& && && && && && && &TP_Save_Adjdata();& &&&& && && && && && && &Load_Drow_Dialog();& && && && &&&}& && && && &&&i++;& && && && &&&if(i==20) {i=0; LED0=!LED0;}& && && && && & }}此函数就实现了我们上面介绍的本章所要实现的功能。当然这里还用到我们之前写的24CXX的代码,用来保存和调用触摸屏的校准信息(在触摸屏校准函数和初始化函数里面)。31.4 下载验证 在代码编译成功之后,我们通过下载代码到ALIENTEK战舰STM32开发板上,得到如图31.4.1所示:
图31.4.1 程序运行效果如果已经校准过了,则在等待1.5s之后进入手写界面,同时DS0开始闪烁,界面如图31.4.2所示:
图31.4.2 手写界面此时,我们就可以在该界面下用笔或者手指输入信息了。如果没有校准过,则会自动进入校准程序(当你发现精度不行的时候,也可以通过按KEY0进入校准程序),如图31.4.3所示,在校准完成之后自动进入手写界面。
图31.4.3 校准界面
[ 本帖最后由 正点原子 于
22:45 编辑 ]
作者的其他最新日志
评论 ( 个评论)
EEWORLD 官方微信
Powered by

我要回帖

更多关于 2760p触摸屏校正 的文章

 

随机推荐