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

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

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

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

' N/ q2 C" l  f- J9 p      从前面我们了解到,此芯片的供电电压是常用的3.3V和5V电源都可以。再加上“支持1.5V~5.25V的数字I/O口”特性。就是说,我们常用的5V的和3.3V的单片机,都可以作为他的控制器了,有没有觉得在单片机选型上放宽很多了?1 ]3 l/ _, p0 `0 Q; V( M9 y; Q4 B

5 E( G. Z# K$ v- x2 O    XPT2046与MCU连接:
/ d8 E: s; t- t# m* E3 x8 w9 ^! b8 q; N    XPT2046与单片机采用SPI连接。分别为引脚16:DCLK(SPI时钟引脚);引脚15:CS(使能引脚或者叫做片选引脚);引脚14:DIN(数据输入引脚);引脚12:DOUT(数据输出引脚)。带SPI模块的单片机,可以配置SPI模块与XPT2046通信。不带SPI模块的单片机,可以随便找4个引脚,模拟SPI时序,与XPT2046通信。( F6 j7 Y; D; L" T0 j
     除了SPI通信的4个引脚,还有一个引脚必须接:PENIRQ。当触摸屏有触摸事件发生,这个引脚就会拉低,所以我们把这个引脚接到单片机的某个中断引脚,就可以随时发现触摸屏有被按下(用外部中断)。
2 e& m& G& j; I7 ^- {9 D1 ]5 q: r
' @* I9 Z) ~( e* n) J; G6 \XPT2046的SPI时序3 y, f% U) Q8 N; ^
QQ截图20140715093554.png & g; v  F; V1 M! c

$ o! Q& t* b8 `
                                                                                             
9 t* i3 V. x; l3 O$ LBUSY是XPT2046的引脚13,是“忙时信号线”,我们没有用到,不接
6 Z( \6 t, {& B9 M- I2 w/ l
$ ~+ b7 k7 ~% C/ z" L, ]3 C5 Q9 `9 e7 l. z( l" r" j1 @3 f0 g
当我们读出了触摸屏的ADC值后,就可以把它对应到TFT LCD上了
7 p# g- C' a# _7 I  @' Z4 p! s( P
5 C  R# A3 d6 Y3 Y0 F. l/ ]      最后提醒朋友们,使用外部中断别忘了打开AFIO复用时钟。# X/ M1 H+ `0 m
      来看看触摸画板的效果吧
- c+ F- y0 B3 ^0 ] 图2.jpg
2 W. ]: j" X# R" o% a* R2 d 图1.jpg : N- k8 f1 F3 w7 \$ f: }( v, t- }
     画的丑了点,轻喷
! E5 z( G) y5 c8 c  ]& g) Z: `( [" ~% C1 d
这是MDK的工程 【02】火牛_LCD Touch(2014.07.10).rar (352.23 KB, 下载次数: 1403)
收藏 7 评论17 发布时间:2014-7-15 09:44

举报

17个回答
天朝111 回答时间:2018-9-29 19:33:52
void Touch_Configuration()3 I: ~6 S6 r4 ?' m4 e
{
" T+ R" `2 G5 Q1 H0 n        GPIO_InitTypeDef GPIO_InitStructure;
- s' H; k, {9 i8 }6 s5 b: v) e
4 {+ s/ A* K7 O7 n; X4 D# H        //下面是SPI相关GPIO初始化: G) \2 p" Y* b+ ]. T$ G( `1 a
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
) P6 Y' M3 h* c, w' w        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //通用推挽输出
' x* P2 P/ I1 _* n0 ?2 w4 K; F( ~        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- [7 P* z+ u' c5 V8 \, c        GPIO_Init(GPIOA,&GPIO_InitStructure);8 X9 P) K2 T; {/ A/ M- n
3 `$ `0 j- v+ ]6 }
        //下面是SPI相关GPIO初始化6 q. e. G. R. w! Q
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
# b) y1 R$ {* J  @6 R8 n# [5 a        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      //上拉输入
, W' m, e. t6 {4 V, P0 i( {        GPIO_Init(GPIOA,&GPIO_InitStructure);) \6 G! u+ c# E: |/ K% S

, l* x; l; j8 l: e3 A6 p  [" u: ]        //Configure PC6 pin: TP_CS pin
2 v: A9 Q! y$ p8 A1 P6 }& N& [. d" N        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; * U; \/ t1 k7 Z
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
! j1 ?- @- V# A        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 1 S# P9 n0 n  O8 {4 x) v( q
        GPIO_Init(GPIOC,&GPIO_InitStructure);
4 t7 b* i9 A3 {% i# q% l9 V, D+ X. w' }- \5 `2 |
        //Configure PC4 pin: TP_INT pin
+ s/ N$ K6 B8 C! ]/ S' ?$ O        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; ) {; U/ R5 [: U- y( r+ z9 P
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         //上拉输入
: @+ r8 b  n4 \  N        GPIO_Init(GPIOC,&GPIO_InitStructure);
7 R* A% V1 B: f, c& m}
& L, \- B8 x( g: O5 V6 s模拟+中断的方式
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
9 M' B& u6 O0 D5 P3 j$ M3 i) }这个不是MDK工程文件,是IAR的
0 g( _" E. U+ H1 ]! p6 l) 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版