触摸屏控制方法,个人总结(欢迎拍砖,但不要打脸)
最近几天研究了下触摸屏,发现也并不像感觉中的那么神秘。
本人用的触摸屏方案是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字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [实用文档]李践-有效提升销售的12大黄金法则8-大
- [实用文档]党支部换届工作方案
- [实用文档]2013年下期电子商务专业部宣传工作计划
- [实用文档]方庄一矿通风、钻探绩效工资考核管理办
- [实用文档]项目一 认识企业物流认识企业物流
- [实用文档]MBI_Display_产品蓝图规画
- [实用文档]北京市建筑业劳务作业人员普法维权培训
- [实用文档]锅炉燃烧调整与运行优化
- [实用文档]4支付结算业务的核算
- [实用文档]米什金_货币金融学_第9版各章学习指导
- [实用文档]水泥混凝土路面硬化工程施工组织设计
- [实用文档]钢筋工程安全技术交底书
- [实用文档]关于公布华中师范大学本科毕业论文
- [实用文档]太原市园林绿化施工合同范本 2
- [实用文档]周日辅导 初中英语分类复习单项选择题(
- [实用文档]第四章 文化经纪人的管理形式 第二节
- [实用文档]学宪法讲宪法竞赛题库
- [实用文档]《数值计算方法》期末考试模拟试题二
- [实用文档]爱词霸学英语:每日一句( 十月)
- [实用文档]2014年国家公务员面试:无领导小组讨论
- 新课程主要理念和教学案例分析汇编(24
- 英国人的快乐源于幸福的家庭生活
- 七年级上册第一次月考模拟数学试卷
- 真丝及仿真丝的种类有哪些?
- 【最新】华师大版八年级数学下册第十六
- 高中英语3500个必背单词
- 我可以接受失败,但我不能接受放弃!
- 最近更新沪科版八年级物理上册期末试卷
- 绿化工作先进乡镇事迹材料
- 鲁教版九年级上册思想品德教学计划
- 英语音标的分类
- 地下室底板无梁楼盖与普通梁板结构形式
- 美容师黄金销售话术
- 雅思写作满分作文备考方法
- 血清甲状腺激素测定与高频彩色多普勒超
- 1度浅析装修对室内空气品质的影响
- 2017-2022年中国汞矿行业深度分析与投
- 计算机二级VB公共基础知识
- (何勇)秸秆禁烧_重在寻找出路
- 内外墙抹灰工程分包施工合同1




