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

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

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

* n; c( F/ P: `  O9 I
/ `7 p. h* k  g. N6 n5 |) ?, T/ X8 C  |! m! W

) K6 q' x. O) W8 @! y- T) m. y! X连接方法:
9 ?) A3 M& r: K6 n# j: z5 w1 n' p% ^! E6 o" ?3 j% I# Z
  |  \( ?  i: `$ f2 e
说明:1、9、10引脚接VCC,6引脚接GND,2、3、4、5引脚接触摸屏的4条引脚线,16、15、14、12引脚接单片机SPI引脚,11接单片机某个引脚。
) Q' p* ~0 K! X) y& c8 _3 r0 _
' u) ~) q) v* @4 V3 `
工作原理:% M. L0 [2 w1 R3 f9 o
   把XPT2046第11引脚接到STM32单片机的引脚设置为中断引脚,触摸屏没有被触摸时,11引脚保持高电平,当有触摸屏被触摸时,11引脚变为低电平。所以用STM32单片机检测11引脚的高低电平,就可以知道有没有触摸屏触摸事件发生。如果发生了触摸屏按下事件,单片机通过SPI口,首先发送读取X坐标的命令0X90,然后读出2个字节的数据,然后再发送读取Y坐标的命令0XD0,然后再读出2个字节的数据。这时候,XY的坐标值就知道了,因为XPT2046是12位精度的ADC,所以读出的2个字节中,只有高12位是有效数据。
+ C! |1 p  Z0 r: p& g; y
9 D4 m5 h' d% x: c
关于触摸校准:  A8 f! Z7 ~6 c
     触摸液晶屏的4个角,采集X和Y坐标的12位值。这时候,就分别得到了X坐标和Y坐标的最小值和最大值,根据液晶屏的分辨率,再通过数学等比公式,就可以通过采集得到的12位ADC值得出现在触摸到屏幕的哪个点了。  c$ T/ E2 r; W; C6 R! x
……………………………………………………………………..
/ {) _% i8 ]+ ?: v9 q: A9 Y    对于一个资深级的电子人,看了我上面的表述,就知道XPT2046怎么用了。但是,对于小白的你,上面的表述对你而言就是雾里看花。不要着急,下面我给你从0补起。3 K7 v4 ]2 ]) M2 ]- \/ y5 w* c: m
首先,你要知道,我上面所讲的内容是:使用XPT2046驱动4线电阻式触摸屏。那么,你见过4线电阻式触摸屏吗?没见过怎么办?好办!请看下图:% @) K. A- l6 `, c
大部分的电阻式触摸屏,都是4线制的,就是引出了4条线的意思。我随便找了一个
, d+ @0 E3 M) J! T QQ截图20140715093232.png ( `. f8 }" M! k9 s/ h$ S. G$ m9 t
                                                                                     ; {8 P. R( R1 a$ i3 K4 L# l
看它引出的排线,共4条线,所以是4线制的,也就是说,这个触摸屏,就可以用XPT2046驱动。
8 i* w% Q- ?4 d& p% {看到这里,你就赚了,你已经认识了电阻式触摸屏的真面目了,这就是工作单位要的工作经验,想要更多干货,请继续往下看吧。2 @9 H: i  K/ n7 i' h7 ?

: v, _0 w/ T5 x2 e/ L      从前面我们了解到,此芯片的供电电压是常用的3.3V和5V电源都可以。再加上“支持1.5V~5.25V的数字I/O口”特性。就是说,我们常用的5V的和3.3V的单片机,都可以作为他的控制器了,有没有觉得在单片机选型上放宽很多了?% W  h- r6 r- `3 \/ l3 @. @
5 Y/ c' A, P. S8 t
    XPT2046与MCU连接:2 k. I2 U2 T6 u5 f; C
    XPT2046与单片机采用SPI连接。分别为引脚16:DCLK(SPI时钟引脚);引脚15:CS(使能引脚或者叫做片选引脚);引脚14:DIN(数据输入引脚);引脚12:DOUT(数据输出引脚)。带SPI模块的单片机,可以配置SPI模块与XPT2046通信。不带SPI模块的单片机,可以随便找4个引脚,模拟SPI时序,与XPT2046通信。
! }4 I. W7 G& c9 M0 t2 B8 i     除了SPI通信的4个引脚,还有一个引脚必须接:PENIRQ。当触摸屏有触摸事件发生,这个引脚就会拉低,所以我们把这个引脚接到单片机的某个中断引脚,就可以随时发现触摸屏有被按下(用外部中断)。0 V1 e0 f& ]3 Q, _' Z/ J9 @1 Q' I. k3 l5 |

- n& U2 ]  z+ L0 F, t9 nXPT2046的SPI时序' ~3 K6 B8 J  \9 i! D- v3 l
QQ截图20140715093554.png
+ z3 k" S6 w6 g1 q4 e' m& v: N# \$ h+ j* l5 @
                                                                                             
$ a; a7 k% w* ~- {- O/ ?BUSY是XPT2046的引脚13,是“忙时信号线”,我们没有用到,不接. y( E( R- M8 u( \

% L5 _- h! \4 s; h, ~  K  D! Q4 A3 j8 r3 [5 j" H2 i7 e+ I
当我们读出了触摸屏的ADC值后,就可以把它对应到TFT LCD上了$ D, |8 W+ C* s; X2 p$ ?

8 A$ P( L* g( L: B8 G( `% j, j      最后提醒朋友们,使用外部中断别忘了打开AFIO复用时钟。/ t% P1 F0 C# d& A: G
      来看看触摸画板的效果吧
) k. N) |  h8 B* e 图2.jpg ( ^$ f' N" C* M# l6 K
图1.jpg
9 w; Q! X% y& M5 ]5 g     画的丑了点,轻喷6 K% K3 l6 `4 y4 F) r% b) K

4 R) M* D, f& P9 ?这是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()
0 M$ T7 M7 z1 [  r9 C4 V. o{2 f( M* E/ o! v& a1 o! p
        GPIO_InitTypeDef GPIO_InitStructure;
2 O: O, N- L1 w% M4 y1 T, ^
8 l0 v8 q% a% b5 a  p* n        //下面是SPI相关GPIO初始化5 j& ~' e- q6 T9 a: m7 n# C, c
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
: F# J# ]" f: N: Y5 g        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //通用推挽输出6 C* C: J" q9 k, L4 B+ A+ g% _* B
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
7 L# h2 S2 r& B7 a        GPIO_Init(GPIOA,&GPIO_InitStructure);  N: S4 J1 P& f% Y, e

7 |4 O7 ^# a5 ?) m2 R        //下面是SPI相关GPIO初始化
9 W2 L1 s3 X5 l; i% p3 W# d        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
6 I1 m* [& X( Z1 R2 Q7 i% Y! i        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      //上拉输入
% B0 u9 f, b& d+ y        GPIO_Init(GPIOA,&GPIO_InitStructure);
& {  _$ Z. y5 H1 @- r, }# ~- \% `$ i! t
        //Configure PC6 pin: TP_CS pin , d3 Z* @6 |. g9 @% ~+ Q8 e
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
5 `* G: r9 @& a! e% f5 H        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
! h! ?* b6 o6 y6 F1 t( r! ?        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ( C( f* {0 y; O# i$ J- R
        GPIO_Init(GPIOC,&GPIO_InitStructure);. Y7 _! c( @$ i* ~) n2 c( S0 o

7 ]5 T! b2 P! B( R/ n        //Configure PC4 pin: TP_INT pin ) a' z- k0 C2 f& F! }& C
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; + {$ L8 O% h8 `4 @* R; ^$ i6 z) n3 m
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         //上拉输入+ f: M* q% E* X9 B' }
        GPIO_Init(GPIOC,&GPIO_InitStructure);
5 m8 w5 W; z! y+ V/ e4 P  T}
" C+ \2 ~, y$ p8 `: l1 t  x模拟+中断的方式
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 d/ a' ]8 D5 i) K" g9 ^& b& O& Q
这个不是MDK工程文件,是IAR的

/ r' E4 f2 G) S: K9 v; k* K9 I是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 手机版