五点法校正触摸屏
1. 物理坐标和逻辑坐标
为了方便理解,我们首先引入2个概念,坐标和逻辑坐标。物理坐标就是触摸屏上点的实际位置,我们通常以液晶上点的个数来度量。逻辑坐标就是触摸屏上这一点被触摸时A/D转换后的坐标值。我们假定液晶最左下角为坐标轴原点A,我们在液晶上再任取一点B(十字线交叉中心),B在X方向距离A 10个点,在Y方向距离A 20个点,那么我们就说液晶上B点所正对的解摸屏上这一点的物理坐标为(10,20)。如果我们触摸这一点时得到的X向A/D转换值为100,Y向A/D,转换值为200,我们就说这一点的逻辑坐标为(100,200)。
2逻辑坐标的计算
由于电阻式触摸屏的电压成线性均匀分布,那么A/D转换后的坐标也成线性。假如我们将液晶最左下角点对应的解摸屏上的点定为物理坐标原点A其物理坐标记为(XA=0,YA=0)其逻辑坐标记为(XLA,YLA)(不一定为0)。那么触摸屏上任意一点B的逻辑坐标可表达为:
XLB=XLA+KXXB
YLB=YLA+KYYB 式2-1
其中KX、KY分别为触摸屏X方向和Y方向的因子系数,这就像弹簧一样(我们知道弹簧也是线性的),拉力与弹簧伸长正比。KX、KY可能为正,也可能为负,这根据具体触摸屏安装的方向和特性。每个液晶触摸屏,我们也应该单独计算每一个触摸屏的K系数。
如果A点不是坐标原点,也是任意一点式2-1可以表达成
XLB=XLA+KX(XB-XA)
YLB=YLA+KY(YB-YA) 式2-2
由式2-2我们可以推出计算K系统的公式
KX=(XLB-XLA)/(XB-XA)
KY=(YLB-YLA)/(YB-YA) 式2-3
2.2.3五点法确定基坐标和K系统
在液晶上固定的位置显示五个点,因为是固定的位置,所以这五个点的物理坐标是预知的。这五个点不应太靠边,因为边缘点对应的触摸屏线性一般不太好。
(1) 首先在ABCDE对应的位置逐步用尖状物触摸,得到五个点的逻辑坐标。
(2) 分别比较A 和C、B和D的横坐标,如果差值不在允许范围(你自己规定一个即可,比如5),则重复操作(1)(2)步。
(3) 分别比较A和B、C和D 的纵坐标,如果差值不在允许范围(你自己规定一个即可,比如5),则重复操作(1)(2)(3)步。
(4) 根据式2-3,用2组数据计算X向K系数平均值KX={(XLB-XLA)/(XB-XA)+(XLD-XLD)/(XD-XC)}/2
(5) 根据式2-3,用2组数据计算Y系数平均值KY={(YLA-YLC)/(YA-YC)+(YLB-YLD)/(YB-YD)}/2
(6) 将C点逻辑坐标作为基坐标,根据式2-2则触摸屏上任意一点F逻辑坐标与基坐标的关系为:
XLF=XLC+KX(XF-XC)
YLF=YLC+KY(YF-YC) 式2-4
根据这个公式,我们也可逆推出F点的物理坐标
XF=(XLF-XLC)/KX+XC
YF=(YLF-YLC)/KY+YC 式2-5
(7) 用公式2-4求出E点逻辑坐标,并与(1)步得到的E点坐标比较,如果差值不在允许范围(你自己规定一个即可,比如5),则重复操作以上步骤直到满足要求。
(8) 将基坐标XLC、YLC、XC、YC和KX、KY记录在存储设备,触摸屏校正完成。
3触摸屏应用的编程思路
3.1触摸区域的判定
我们关心的是,我们如何通过用户触摸任意一点得到的逻辑坐标,来判断这一点是否在液晶的某个特定显示区内。通常我们在液晶的特定区域提供一些按钮(Button)式的矩形区域,以便用户操作,所以这个区域所对应触摸屏区域的逻辑坐标最小点(我们假定为这个区域的左下角)和逻辑坐标最大点(我们假定为这个区域的右上角)两点的物坐标是预知的。假如我们事先将这两点的物理坐标存在程序里,我们再利用已计算并存储好的基坐标和k系数,用公式2-5求出触摸任意一点的物理坐标,那么,触摸任意一点得到的物理坐标只要在这两点范围内,我们就可以判定用户触摸的位置,正是液晶上Button的矩形区域内。
如果液晶上有若干个Button区域,那么我们将每个区域逻辑坐标最大点和最小点的物理坐标存成数组或表的形式,使用时选用公式2-5计算出触摸点的物理坐标,再从存储设备中提取出区域的两点物理坐标查表即可判定用户触摸的区域。
3.2触摸区域的划分
作为用户交互的操作界面,不可能只显示一个Button,也不可能在不同屏总是在同一个位置显示Button,那么怎样才能做一个统一的数据表,以满足各式各样的需求呢?在这里笔者仅讲一个网络法划分区域的办法,这个方法其实很简单,就是编程人员先确定一个最小区域的Button,再以些为最小单位将屏幕划分成网格状,如图3-1,一个Button可能包含一个或几个最小单元。我们将每个单元编上号,并将每个单元逻辑坐标最大点和最小点的物理坐标存成数组或表的形式,编程人员只要知道每一屏的每一个Button是由哪几个单元组成就可以判断触摸了哪一个Button。
3.3触摸屏的精度
我们知道,触摸屏的精度是由A/D转换的位数决定的,有8位、9位、10位或更多,一般来说,精度越高越好,但是像LCD、CRT这样的设备上安装的触摸屏并不一定需要精度太高的A/D的转器件,LCD、CRT都有自己固定的分辨率,A/D转换器件的精度高出LCD、CRT的分辨率基本是无意义的,反而为单片机计算增加了麻烦。例如一个320点×240点的LCD,我们最多只需要1/320的精度就够了,那么最多也就需要一个9位的A/D转换。事实上,我们也不一定需要1/320的精度,在实际应用中,每一个Button都是一个较大的矩形区域,包含若干个点,任两个Button的距离也都很大,这样我们就根本用不了这样高的精度,在编程时,我们可以将A/D转的结果进行一定的右移位来降低转换精度,以求节省单片机的变量资源,增加代码执行效率,这样做有可能好几个点是同一个逻辑坐标,但是对我们的使用毫无影响。