你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于XPT2046的电阻式触摸屏设计  

[复制链接]
shanji 发布时间:2014-7-15 09:44
XPT2046是一款四线制电阻触摸屏控制芯片,由深圳市矽普特科技有限公司研发生产,被广泛的应用于触摸屏驱动,堪称经典之作!他内含12位分辨率125KHz转换速率逐步逼近型A/D转换器,支持从1.5V到5.25V的低电压I/O接口。能通过执行两次A/D转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。4 u. y% @6 I/ k# u
QQ截图20140715092347.png # J6 z% J- [2 j3 b
7 s* N5 J. q) M. l; l, o$ ^8 p
# V! R6 _( p3 l" a& ^# ]; s) R
1 c' x) l+ |( }& S% ~* i

3 l& e- a9 m* B连接方法:
" j8 J+ B- c2 s" W8 ]4 m" ^. u* C' u" |
! |0 B* g% C/ |
说明:1、9、10引脚接VCC,6引脚接GND,2、3、4、5引脚接触摸屏的4条引脚线,16、15、14、12引脚接单片机SPI引脚,11接单片机某个引脚。
# ^$ v& L& b, X& a. S
4 ]% F; A- B4 J% w! ~$ B# w
工作原理:
% d5 R/ [7 K5 H$ _   把XPT2046第11引脚接到STM32单片机的引脚设置为中断引脚,触摸屏没有被触摸时,11引脚保持高电平,当有触摸屏被触摸时,11引脚变为低电平。所以用STM32单片机检测11引脚的高低电平,就可以知道有没有触摸屏触摸事件发生。如果发生了触摸屏按下事件,单片机通过SPI口,首先发送读取X坐标的命令0X90,然后读出2个字节的数据,然后再发送读取Y坐标的命令0XD0,然后再读出2个字节的数据。这时候,XY的坐标值就知道了,因为XPT2046是12位精度的ADC,所以读出的2个字节中,只有高12位是有效数据。
! F1 W. c! P/ y; q; j' I( F0 G; Y# f
关于触摸校准:
" Q7 z( |. R! V+ @     触摸液晶屏的4个角,采集X和Y坐标的12位值。这时候,就分别得到了X坐标和Y坐标的最小值和最大值,根据液晶屏的分辨率,再通过数学等比公式,就可以通过采集得到的12位ADC值得出现在触摸到屏幕的哪个点了。
. G9 ^+ n5 Y5 _: [9 A$ G/ j……………………………………………………………………..' `4 i$ ^3 y$ g: N! [1 L& E5 F* |
    对于一个资深级的电子人,看了我上面的表述,就知道XPT2046怎么用了。但是,对于小白的你,上面的表述对你而言就是雾里看花。不要着急,下面我给你从0补起。
" E- L$ V) P+ G' _0 R. y2 Q- P5 i首先,你要知道,我上面所讲的内容是:使用XPT2046驱动4线电阻式触摸屏。那么,你见过4线电阻式触摸屏吗?没见过怎么办?好办!请看下图:
1 e$ [- W2 K2 z2 [. L大部分的电阻式触摸屏,都是4线制的,就是引出了4条线的意思。我随便找了一个! x1 x* R2 q) q# d4 @& m) c
QQ截图20140715093232.png 4 Q2 F, W- B( K& ~* X6 l/ r
                                                                                    
: |( _/ Z" Z* w! A4 m3 o' N. r看它引出的排线,共4条线,所以是4线制的,也就是说,这个触摸屏,就可以用XPT2046驱动。
& t( c5 Z* q% x5 D/ W: p, W9 g看到这里,你就赚了,你已经认识了电阻式触摸屏的真面目了,这就是工作单位要的工作经验,想要更多干货,请继续往下看吧。$ c6 |$ N$ F. \3 g

7 q/ b6 A/ k8 I' X% L      从前面我们了解到,此芯片的供电电压是常用的3.3V和5V电源都可以。再加上“支持1.5V~5.25V的数字I/O口”特性。就是说,我们常用的5V的和3.3V的单片机,都可以作为他的控制器了,有没有觉得在单片机选型上放宽很多了?0 b, v  ^" U5 i0 C" R7 f' ], D/ Q
1 o$ d* B- f* C; r
    XPT2046与MCU连接:# O; @$ U# k6 g1 X
    XPT2046与单片机采用SPI连接。分别为引脚16:DCLK(SPI时钟引脚);引脚15:CS(使能引脚或者叫做片选引脚);引脚14:DIN(数据输入引脚);引脚12:DOUT(数据输出引脚)。带SPI模块的单片机,可以配置SPI模块与XPT2046通信。不带SPI模块的单片机,可以随便找4个引脚,模拟SPI时序,与XPT2046通信。5 X( X6 i# L( d( w7 h
     除了SPI通信的4个引脚,还有一个引脚必须接:PENIRQ。当触摸屏有触摸事件发生,这个引脚就会拉低,所以我们把这个引脚接到单片机的某个中断引脚,就可以随时发现触摸屏有被按下(用外部中断)。
: f# K, U+ K8 q) H& h
3 p- w  q3 u# D* QXPT2046的SPI时序
. R2 t7 _+ i  d QQ截图20140715093554.png " G0 C5 d4 J3 N

# ~$ ?# S; m$ j0 b5 I- h
                                                                                              2 Y3 X6 n6 F( |0 N/ I7 }: U
BUSY是XPT2046的引脚13,是“忙时信号线”,我们没有用到,不接
0 P- h: @1 J. j1 `4 P. T1 D7 Q
1 I: i- c% A& G0 S$ E$ [6 h+ e& p: t8 _* s$ w/ X
当我们读出了触摸屏的ADC值后,就可以把它对应到TFT LCD上了
1 p1 J4 a+ l/ l' T; ~) ~+ a+ [ $ Z, m8 H; L' F9 b0 r
      最后提醒朋友们,使用外部中断别忘了打开AFIO复用时钟。
3 q9 b$ r$ a" d. H' f6 J5 t+ G      来看看触摸画板的效果吧
4 p& v9 `5 t: {5 I" T8 W 图2.jpg
7 ^7 M, c2 O' ]# c2 C. i7 ` 图1.jpg
& p* t4 \) G. \- S" K: B* {     画的丑了点,轻喷
: H5 k6 y! i/ n$ M/ Z6 N/ @- [; J1 q# N: C0 S6 Y( ^  e/ z8 F/ n
这是MDK的工程 【02】火牛_LCD Touch(2014.07.10).rar (352.23 KB, 下载次数: 1453)
赞 收藏 8 评论17 发布时间:2014-7-15 09:44

举报

17个回答
天朝111 回答时间:2018-9-29 19:33:52
void Touch_Configuration()
+ n. I/ A3 Q( `; W8 e- V' g1 Y{
* E2 M/ @! ?- U. J4 D1 v        GPIO_InitTypeDef GPIO_InitStructure;
+ w. c; g% Z6 X) I; u# V! _0 K: l4 [2 M
        //下面是SPI相关GPIO初始化
) B2 J$ r) z7 ^! p1 p) z        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
( ^. A' w* F- w( ?$ `' Y        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //通用推挽输出
: @9 }" h% y- l: N        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
4 v4 D- C* F/ r/ {6 n        GPIO_Init(GPIOA,&GPIO_InitStructure);' q/ A) }6 P3 o7 e

: V8 D- ]& g2 V; [- E        //下面是SPI相关GPIO初始化3 ~. C8 y4 C8 e+ ^* [9 U5 L
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
; i& E5 P- r0 P% ]* L  z4 t3 ~        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      //上拉输入5 q+ \# x+ I5 b/ G) F
        GPIO_Init(GPIOA,&GPIO_InitStructure);
2 v. H; \' I& l# Z* R
* E. b! j, f. l8 }/ `9 j% v: u        //Configure PC6 pin: TP_CS pin
/ n1 f7 n3 L5 B        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
# l; T3 o8 [& D4 _! G        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出0 v) _- x: a0 \* I
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
3 [4 j/ F1 a' q+ g$ f* J( I4 u        GPIO_Init(GPIOC,&GPIO_InitStructure);
$ D9 c& X7 ~0 f" h. X
+ k$ R/ d' M+ H, F  Q        //Configure PC4 pin: TP_INT pin
' p0 T! ^$ {( @. w        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; , a% l& ^& W7 e' b1 q
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         //上拉输入( ~  b, d% a! l* Z; I2 u8 q
        GPIO_Init(GPIOC,&GPIO_InitStructure);0 O$ d9 L# d: N! d# l; f2 Q+ W
}   N. l+ H, S2 Y) l
模拟+中断的方式
jinniuxing 回答时间:2020-9-14 10:14:11
谢谢分享,我最近在stmf407+xp2046+ili9325上移植触摸,触摸结果出来差异较大,比如指甲按得是右下角,显示函数显示的点确是在左下角,卡了几天,干好,看一下这个,排除一下是哪里的问题。
那就地方 回答时间:2016-3-3 08:49:58
谢谢,楼主分享,之前多没有研究过四线电阻触摸芯片,看来你发的文章,已经知道工作原理,再次感谢楼主的分享
阿陆 回答时间:2015-11-14 10:04:44
这个不是MDK工程文件,是IAR的
shanji 回答时间:2015-11-16 09:41:14
阿陆 发表于 2015-11-14 10:042 ~3 L$ D6 B! @' [8 ^0 e
这个不是MDK工程文件,是IAR的
6 V6 ]/ W1 w' e2 Q: X
是MDK的,我确定
syt007 回答时间:2016-3-2 23:04:17
的确是MDK的,很不错的测试程序,学习了
zhaoshan413 回答时间:2017-4-19 18:18:05
感谢分享
吉安的心该有 回答时间:2017-4-20 10:03:00
9999个赞,非常详细的资料,感谢分享
北国的南国 回答时间:2017-6-2 22:40:01
是MDK
epochal 回答时间:2017-6-3 08:28:13
兼容ADI的AD7843
依然自我 回答时间:2017-8-19 10:41:37
谢谢楼主分享
Microcontroller 回答时间:2017-8-24 09:37:56
测试程序好像没有用硬件SPI  IO模拟的。。。
马柳平 回答时间:2017-11-15 15:26:34
非硬件SPI通信
ts03 回答时间:2018-2-11 22:17:43
好野
xiaocheng 回答时间:2018-4-4 15:53:08
学习下,不知道是不是通用的
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版