教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 实用文档 >

触摸屏控制方法,个人总结(欢迎拍砖,但不要打脸)

来源:网络收集 时间:2026-09-11
导读: 最近几天研究了下触摸屏,发现也并不像感觉中的那么神秘。 本人用的触摸屏方案是4线电阻屏+xpt2046(这个和ADS7843完全一样)。 控制过程主要分一下几步: 1,读数——这里读出来的是触摸屏控制芯片的AD值,是屏的物理坐标 2,滤波——触摸屏类似按键,按下

最近几天研究了下触摸屏,发现也并不像感觉中的那么神秘。

本人用的触摸屏方案是4线电阻屏+xpt2046(这个和ADS7843完全一样)。

控制过程主要分一下几步:

1,读数——这里读出来的是触摸屏控制芯片的AD值,是屏的物理坐标

2,滤波——触摸屏类似按键,按下和放开时会有抖动

3,转化——把屏的物理坐标转化成逻辑坐标,这里的逻辑坐标在LCD的范围内对应LCD的像素点坐标。

4,定位——触摸屏的定位,这个其实应该放到最开始。

读数:

这里按照控制芯片的时序使用管脚模拟SPI的方式读出来的,用过STM32的SPI,也可以,不过习惯模拟,不用那么复杂的配置了(程序见后面部分)

滤波:

这里使用了2种方式的滤波,一种是像按键一样,检测到控制芯片INT引脚变低之后,延时20ms,然后如果在检测还是为低,则(程序见后面部分)

转化:

这个很简单,在任何一个介绍触摸屏的文章估计都能见到。

xp——x的物理坐标

yp——y的物理坐标xl——x的逻辑坐标yl——y的逻辑坐标LCDXSIZE——LCD的x方向做大值LCDYSIZE——LCD的y方向最大值xpmin——在LCD(0,0)坐标处的ypmin——在LCD(0,0)坐标处的第二种是软件滤波,程序读取了10次触摸屏的物理坐标,然后冒泡排序,最后去掉最前面的和最后面的,只保留中间3个,再对xl=(xp-xpmin)*LCDXSIZE/(xpmax-xpmin)

yl=(yp-ypmin)*LCDYSIZE/(ypmax-ypmin)

定位:

这里定位的作用是求处上面的xpmin,xpmax,ypmin和ypmax,方法就是在屏幕上知道2点,求这两点所在直线上的一点(而且知在屏上分别画出4个点,其实3个点足以,但是一般都用4个点,取得这四个点的物理坐标。假设分别为:

|

--x1,y1-------------------x2,y2----

|

--x3,y3-------------------x4,y4----

|

对应的物理坐标为cx1,cy1

利用比例关系

可以求出xpmin,同样用比例关系cx2,cy2,cx3,cy3x1/(cx1-xpmin)x2/(cx2-xpmin)=|cx4,cy4=x2/(cx2-xpmin)||—————————————LCDXSIZE/(xpmax-xpmin)————————————这里最好

可以求出xpmax

然后用同样的方法求出ypmin和ypmax

_____________________________________________________分割线______________________________________________________用中断读控制芯片的INT引脚还是用定时器读?

用中断比较节省资源,但是我在做一个画图板的时候,发现滑动坐标没办法求出来,于是就去想定时器读。

用定时器读有个好处:延时操作可以在定时器里设置一个标志字,然后如果有按下就置位这个标志,下次再去真正读取。这样用定时器解决了一个消抖和滑动坐标检测的问题,我选择定时器。

无图无真相,无码无真相:下面是真相—————————————————————————————————————————————————————————定时器里可以给触摸屏设置多种不同的状态,这里按照Windows的情况设置了down,move

(原文件名:touch.jpg)

头文件::

#ifndef__TOUCH_H__

#define__TOUCH_H__

#include"stm32f10x_lib.h"

enum

{

TOUCH_NONE=0,

TOUCH_DOWN,

TOUCH_MOVE,

TOUCH_UP,

};//

#defineTOUCH_CLK_LOW()

#defineTOUCH_CLK_HIGH()

#defineTOUCH_DOUT_LOW()

#defineTOUCH_DOUT_HIGH()

#defineTOUCH_READ_DIN()

#defineTOUCH_CS_LOW()

#defineTOUCH_CS_HIGH()

#defineTOUCH_READ_INT()

#defineTOUCH_READ_BUSY()

#defineTOUCH_CHX

#defineTOUCH_CHY0x900xD0

10GPIO_ResetBits(GPIOB,GPIO_Pin_13)GPIO_SetBits(GPIOB,GPIO_Pin_13)GPIO_ResetBits(GPIOB,GPIO_Pin_15)GPIO_SetBits(GPIOB,GPIO_Pin_15)GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)GPIO_ResetBits(GPIOB,GPIO_Pin_12)GPIO_SetBits(GPIOB,GPIO_Pin_12)GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_7)GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_8)//差分方式读取#defineTOUCH_GETTIMES

externvu16TouchX,TouchY;

externvu8TouchPress,TouchState;

externu8TouchCalibrated;

voidTouch_Init(void);

u16Touch_GetX(void);

u16Touch_GetY(void);

voidTouch_Calibrate(void);

voidTouch_GetState(void);

#endif

C文件::

#include"Touch.h"

#include"systick.h"

#include"Graphics.h"

vu16TouchX,TouchY;

vu8TouchPress=0,TouchState=TOUCH_NONE;//state有4种状态,0无按键,1按下,2抬起,3moveu8TouchCalibrated=0;

u16TouchXMin,TouchXMax,TouchYMin,TouchYMax;

/********************************

初始化触摸屏需要的端口

芯片--TSC2046

********************************/

voidTouch_Init(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

//EXTI_InitTypeDefEXTI_InitStructure;

//NVIC_InitTypeDefNVIC_InitStructure;

//SPI_InitTypeDefSPI_InitStructure;

/*EnableGPIOB,GPIOCandAFIOclock*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO,ENABLE);//RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);

//SPI

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Init(GPIOB,&GPIO_InitStructure);

//SPI_MISO

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;

GPIO_Init(GPIOB,&GPIO_InitStructure);

/*CSpinsconfiguration*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Init(GPIOB,&GPIO_InitStructure);

/*INIPin*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;

GPIO_Init(GPIOG,&GPIO_InitStructure);

/*

SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;

SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//RCC_APB

SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;

SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;

SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;

SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;

SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;

SPI_InitStructure.SPI_CRCPolynomial=7;

SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_32;

SPI_Init(SPI2,&SPI_InitStructure);

SPI_Cmd(SPI2,ENABLE);

#if0

EXTI_ClearITPendingBit(EXTI_Line7);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource7);

/*ConfigureButtonEXTIline*/

EXTI_InitStructure. …… 此处隐藏:6293字,全部文档内容请下载后查看。喜欢就下载吧 ……

触摸屏控制方法,个人总结(欢迎拍砖,但不要打脸).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1802019.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)