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

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

[复制链接]
shanji 发布时间:2014-7-15 09:44
XPT2046是一款四线制电阻触摸屏控制芯片,由深圳市矽普特科技有限公司研发生产,被广泛的应用于触摸屏驱动,堪称经典之作!他内含12位分辨率125KHz转换速率逐步逼近型A/D转换器,支持从1.5V到5.25V的低电压I/O接口。能通过执行两次A/D转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。
( \$ b: S4 {% M
QQ截图20140715092347.png
3 T  l' P9 g8 K5 `

3 O1 n5 Z  X; [  s+ t; F
/ _/ U) Z; ]7 u" M1 o- {" s5 v/ y' b6 M! h% H" R( C

8 S2 \! Q* h# V# \' i3 \6 y连接方法:
8 h( s) u& ^. s, N! N- b/ G  `  U0 N* `' y: _

$ i- q4 y1 n" p& @* M3 V说明:1、9、10引脚接VCC,6引脚接GND,2、3、4、5引脚接触摸屏的4条引脚线,16、15、14、12引脚接单片机SPI引脚,11接单片机某个引脚。- Y$ y' v! Z4 y; ]2 p) ?* {

, P, f. a  ~% e/ f* |
工作原理:7 n5 Q7 `  x2 n# e* ~
   把XPT2046第11引脚接到STM32单片机的引脚设置为中断引脚,触摸屏没有被触摸时,11引脚保持高电平,当有触摸屏被触摸时,11引脚变为低电平。所以用STM32单片机检测11引脚的高低电平,就可以知道有没有触摸屏触摸事件发生。如果发生了触摸屏按下事件,单片机通过SPI口,首先发送读取X坐标的命令0X90,然后读出2个字节的数据,然后再发送读取Y坐标的命令0XD0,然后再读出2个字节的数据。这时候,XY的坐标值就知道了,因为XPT2046是12位精度的ADC,所以读出的2个字节中,只有高12位是有效数据。
; T! e, J) j6 }7 j" k7 N; j7 I1 q) s4 F8 X' J( X6 _' o5 g
关于触摸校准:
8 k5 X' C3 X, L0 T0 p     触摸液晶屏的4个角,采集X和Y坐标的12位值。这时候,就分别得到了X坐标和Y坐标的最小值和最大值,根据液晶屏的分辨率,再通过数学等比公式,就可以通过采集得到的12位ADC值得出现在触摸到屏幕的哪个点了。0 s$ M. ^3 x. X8 I
……………………………………………………………………..
& k! S) b( p7 E" f6 B' a: H  ]    对于一个资深级的电子人,看了我上面的表述,就知道XPT2046怎么用了。但是,对于小白的你,上面的表述对你而言就是雾里看花。不要着急,下面我给你从0补起。# I8 Z# M6 |$ E5 i, l6 U4 z
首先,你要知道,我上面所讲的内容是:使用XPT2046驱动4线电阻式触摸屏。那么,你见过4线电阻式触摸屏吗?没见过怎么办?好办!请看下图:
" p  A; Y3 k1 K  W8 ~+ j& E  t; u! B大部分的电阻式触摸屏,都是4线制的,就是引出了4条线的意思。我随便找了一个
. A$ _5 S3 f. `2 @ QQ截图20140715093232.png 5 f3 D  v- I4 j: C: x
                                                                                     . Y( i: S5 Q: r1 C6 Z
看它引出的排线,共4条线,所以是4线制的,也就是说,这个触摸屏,就可以用XPT2046驱动。& m4 X8 w* }" X8 r6 g
看到这里,你就赚了,你已经认识了电阻式触摸屏的真面目了,这就是工作单位要的工作经验,想要更多干货,请继续往下看吧。
* }! S( {. [' Y( a! i* l$ K  q* {) \! y. [/ h5 f: @# ?% B, |3 |
      从前面我们了解到,此芯片的供电电压是常用的3.3V和5V电源都可以。再加上“支持1.5V~5.25V的数字I/O口”特性。就是说,我们常用的5V的和3.3V的单片机,都可以作为他的控制器了,有没有觉得在单片机选型上放宽很多了?
- N4 I  \+ C5 j
% \' S0 K9 h' Y+ v    XPT2046与MCU连接:+ Q/ g6 ?/ E$ P" o) t+ O
    XPT2046与单片机采用SPI连接。分别为引脚16:DCLK(SPI时钟引脚);引脚15:CS(使能引脚或者叫做片选引脚);引脚14:DIN(数据输入引脚);引脚12:DOUT(数据输出引脚)。带SPI模块的单片机,可以配置SPI模块与XPT2046通信。不带SPI模块的单片机,可以随便找4个引脚,模拟SPI时序,与XPT2046通信。4 b6 |; E, m, R8 B! x
     除了SPI通信的4个引脚,还有一个引脚必须接:PENIRQ。当触摸屏有触摸事件发生,这个引脚就会拉低,所以我们把这个引脚接到单片机的某个中断引脚,就可以随时发现触摸屏有被按下(用外部中断)。
! Z8 |/ \- F# d$ }5 N% w) @
+ `: w5 l2 n% L6 x3 w- ~4 ^1 G+ ~4 UXPT2046的SPI时序, n( V4 ~# I# z+ x2 C
QQ截图20140715093554.png & \% i6 o: |/ }) F/ {

: y8 V7 V: u, r: Q
                                                                                             
3 Y6 I/ A1 e& L1 v2 MBUSY是XPT2046的引脚13,是“忙时信号线”,我们没有用到,不接' y, I) r- b. I! o
* w' A4 Q- [4 L+ [: }

  v2 q+ v4 Q! y0 o! p" F& I, Y当我们读出了触摸屏的ADC值后,就可以把它对应到TFT LCD上了
+ {/ {( [, m. H6 W 6 \2 H! h  D5 }( B3 v) Y* ]7 X6 ^
      最后提醒朋友们,使用外部中断别忘了打开AFIO复用时钟。0 w1 y  |7 g  b
      来看看触摸画板的效果吧7 E: C! a! C# D) Z" E7 r
图2.jpg
' }" E# \4 K7 R6 D- ?7 u 图1.jpg
) Y" [6 v- Y$ E7 P" r* p8 z$ l     画的丑了点,轻喷% i5 P; P- R1 P4 |7 `

8 ~2 }  `6 |3 D! n( {这是MDK的工程 【02】火牛_LCD Touch(2014.07.10).rar (352.23 KB, 下载次数: 1435)
收藏 7 评论17 发布时间:2014-7-15 09:44

举报

17个回答
天朝111 回答时间:2018-9-29 19:33:52
void Touch_Configuration()
' S$ R. Y' m8 m, Q1 t{- E$ i, h+ w% l$ R' F
        GPIO_InitTypeDef GPIO_InitStructure;
$ }( F8 S. }) y
6 p0 s; \+ \8 T0 M        //下面是SPI相关GPIO初始化
% C; ^' B, T. U; k" j        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;0 x3 T* [: ^0 f- B
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //通用推挽输出& ]( D1 x* W; V  f4 Q2 m# `
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;2 l8 |4 }- d! H2 c
        GPIO_Init(GPIOA,&GPIO_InitStructure);
: Q1 k; i) U9 L- s& |! Z' ^, d* a: h' |( e) j) R. F
        //下面是SPI相关GPIO初始化
5 ^- h& ^$ m6 N4 M/ I- N        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
. Y) V" e1 o# J        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      //上拉输入
. O$ b* t9 C4 |5 r: d        GPIO_Init(GPIOA,&GPIO_InitStructure);
/ {) K* h# j& p; H6 r4 K" f7 l( i) h7 w  j2 r
        //Configure PC6 pin: TP_CS pin 1 r% N- ]* }* `1 c8 e3 V/ s
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
$ l) Z8 V8 J+ @$ N- `) U2 l# n        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
- D# O" ^, J4 b( \, b2 k# O        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
, a3 `6 N: Z" G9 L: M: Y        GPIO_Init(GPIOC,&GPIO_InitStructure);0 }) ?+ P& V; M  L# k7 |' _: G
1 ~( u5 T3 A4 i
        //Configure PC4 pin: TP_INT pin # g$ }7 Q" h% c5 m& P, U* u
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; ! k- _# G9 |3 ^( v
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         //上拉输入( ^& o" O* W1 V% p
        GPIO_Init(GPIOC,&GPIO_InitStructure);6 `. H; v+ L; n/ @. t1 m
} 4 I' X" T% W( H' Q/ q) F
模拟+中断的方式
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:04
& q$ w( p8 y. M. h) l2 M4 ^这个不是MDK工程文件,是IAR的

. A7 o" l" L- z0 n1 D是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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版