基于STM32的触摸屏学习笔记
一直在讲AD值的精确获龋。。下面就要把获得的精确AD值转换为实际坐标。譬如我们点了一下触摸屏,返回的AD值为(1600,1200),即触点X方向的AD值为1600,Y方向的AD值为1200,下面就是介绍如何把像1600和1200这种AD值转换为实际坐标。
在转换为实际坐标之前要讲一下一个非常重要的知识点------触摸屏校正,为什么要校正,博主在这里就不给大家列举了,请读者自己查阅相关资料~
校正原理(借鉴了一些网络上的优秀文章):
因为我们再实际中无法确定TFT屏的原点,那么我们只能在TFT屏上先确定4个点,如图:
这4个点的坐标是我们知道的,然后用笔去触摸这4个点,记录下这4个点的AD值,分别为:(AD_X1,AD_Y1),(AD_X2,AD_Y2),(AD_X3,AD_Y3),(AD_X4,AD_Y4),根据这四个点,我们计算出四个校准参数(下文会详细介绍):xfac,yfac,xoff,yoff,我们把得到的所有物理坐标都按这个关系式来计算:
LCDx=xfac*Px+xoff
LCDy=yfac*PY+yoff
其中(LCDx,LCDy)是在LCD上的实际坐标(像素坐标),(Px,Py)是从触摸屏读到的物理坐标。剩下4个参数,下文会介绍
校正代码:
图上画红圈的,请读者注意tp_dev.sta状态位的变化,下面就进入第二个红圈:tp_dev.scan(1)触摸扫描函数中看看,这里scan是函数指针:
这里应该从校准函数中说,应该能好理解。→_→在校准函数中,不断扫描TP_Scan()函数,如果这时候你触摸了一下屏幕,PEN所对应STM32的引脚将会从高电平跳变为低电平,详情看上文第二讲的注意→_→。即Ttp_dev.sta=1100,0000(根据上图第一个方框得出)。不满足校准函数中的if((tp_dev.sta&0xc0)==TP_CATH_PRES),故不会进行下面的画点。如果之前并没有按下触摸屏,这时同样是不满足上面if的。如果之前按下后松下了,这时Ttp_dev.sta=0111,1111,这时满足校准函数中的if((tp_dev.sta&0xc0)==TP_CATH_PRES),然后在校准函数中标记下触摸已经被处理了(清除tp_dev.sta),清除第一个点,画第二个点,清除第二个点,画第三个点,清除第三个点,画第四个点,清除第四个点。也就是,触摸屏幕有两个状态:按下和松开。当按下时,程序执行的是将按下的AD值坐标存到两个数组中即上图中的TP_Read_XY2(&tp_dev.x[0],&tp_dev.y[0]);当松开时,清除原来的点,并画一个新点。这样触摸4次。
在校准函数中,由于之前重复触摸了4下屏幕,触摸的4个点的AD值被存入到了pos_temp[4][2]数组中,然后算出(x1,y1),
(x2,y2)之间的距离d1和(x3,y3),(x4,y4)之间的距离d2,把这两个水平距离相除得到一个比值fac1;再计算出(x1,y1),(x3,y3)之间的距离d3和(x2,y2),(x4,y4)之间的距离d4,把这两竖直方向的距离相除,得到一个比值fac2.如果0.95 xfac、yfac:每个AD点对应的像素点数目。(液晶理论宽度-40)/(x2-x1) 即液晶理论宽度点阵值/AD测量值 xoff、yoff:测量误差值。[液晶理论宽度点阵值 - 每AD值对应多少点阵*(AD测量值)]/2 = 测量误差值(理论值为 20 点阵,实际是有误差的) 啊,个人觉得乱七八糟的,不知道以后还能不能看懂了~~~→
- STM32学习笔记:在IAR中建立FWlib 3.0项目(08-13)
- 基于STM32单片机的火控系统信号采集测试(11-14)
- 基于LabVIEW的STM32调试平台设计(11-17)
- 基于STM32的LF RFID识别系统设计(11-25)
- STM32中断与嵌套NVIC快速入门(01-25)
- 基于TLC5947的旋转LED屏显示控制器设计(01-25)