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

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

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

8 }; [" r; \# x& E4 P4 ]
7 v; M, _1 e* \# V
8 \) Z' k  b# `5 x
连接方法:0 A8 o3 X9 U" b5 `
3 ~$ C7 _3 y2 t' W' i! T( ?% u" V

1 V3 E2 Z4 D; u' C' A; X3 F说明:1、9、10引脚接VCC,6引脚接GND,2、3、4、5引脚接触摸屏的4条引脚线,16、15、14、12引脚接单片机SPI引脚,11接单片机某个引脚。
1 B% U( s7 I& Q8 N" V9 F3 m
9 d( F  F* L: z/ I% p
工作原理:
; i8 T& |! Y8 W   把XPT2046第11引脚接到STM32单片机的引脚设置为中断引脚,触摸屏没有被触摸时,11引脚保持高电平,当有触摸屏被触摸时,11引脚变为低电平。所以用STM32单片机检测11引脚的高低电平,就可以知道有没有触摸屏触摸事件发生。如果发生了触摸屏按下事件,单片机通过SPI口,首先发送读取X坐标的命令0X90,然后读出2个字节的数据,然后再发送读取Y坐标的命令0XD0,然后再读出2个字节的数据。这时候,XY的坐标值就知道了,因为XPT2046是12位精度的ADC,所以读出的2个字节中,只有高12位是有效数据。( ]  Y8 w) x+ X8 I/ K
/ ?- S3 o2 m' ^
关于触摸校准:
  H+ I0 l; ~9 l- H; s4 N     触摸液晶屏的4个角,采集X和Y坐标的12位值。这时候,就分别得到了X坐标和Y坐标的最小值和最大值,根据液晶屏的分辨率,再通过数学等比公式,就可以通过采集得到的12位ADC值得出现在触摸到屏幕的哪个点了。& U  A& N: P, l  G
……………………………………………………………………..9 ?$ b* E7 O( L- u7 {. x, s
    对于一个资深级的电子人,看了我上面的表述,就知道XPT2046怎么用了。但是,对于小白的你,上面的表述对你而言就是雾里看花。不要着急,下面我给你从0补起。
0 O6 Y/ e2 A$ t# u首先,你要知道,我上面所讲的内容是:使用XPT2046驱动4线电阻式触摸屏。那么,你见过4线电阻式触摸屏吗?没见过怎么办?好办!请看下图:2 E9 p2 [# u+ Y1 G+ S
大部分的电阻式触摸屏,都是4线制的,就是引出了4条线的意思。我随便找了一个
" l% h* u7 y4 x1 H QQ截图20140715093232.png , y( N8 H% M' q  _
                                                                                    
/ a6 m2 i( Q4 ]! m- c- t看它引出的排线,共4条线,所以是4线制的,也就是说,这个触摸屏,就可以用XPT2046驱动。
( A5 {2 l' ]3 C5 N2 T; w看到这里,你就赚了,你已经认识了电阻式触摸屏的真面目了,这就是工作单位要的工作经验,想要更多干货,请继续往下看吧。
8 ~- Z2 x2 f9 R
+ i5 s/ d  F2 a% \2 l7 c      从前面我们了解到,此芯片的供电电压是常用的3.3V和5V电源都可以。再加上“支持1.5V~5.25V的数字I/O口”特性。就是说,我们常用的5V的和3.3V的单片机,都可以作为他的控制器了,有没有觉得在单片机选型上放宽很多了?
( Q, O* O3 Z$ e; s3 ^- _) i3 W, ?8 H1 |% U$ _" }
    XPT2046与MCU连接:
( L) e  N$ ^# K3 }, W6 ]3 N. d    XPT2046与单片机采用SPI连接。分别为引脚16:DCLK(SPI时钟引脚);引脚15:CS(使能引脚或者叫做片选引脚);引脚14:DIN(数据输入引脚);引脚12:DOUT(数据输出引脚)。带SPI模块的单片机,可以配置SPI模块与XPT2046通信。不带SPI模块的单片机,可以随便找4个引脚,模拟SPI时序,与XPT2046通信。
7 B$ G& L: k9 l- Y' j8 g  \     除了SPI通信的4个引脚,还有一个引脚必须接:PENIRQ。当触摸屏有触摸事件发生,这个引脚就会拉低,所以我们把这个引脚接到单片机的某个中断引脚,就可以随时发现触摸屏有被按下(用外部中断)。& Z/ P& B3 P1 g* h  p& F( f

- t- W! e- R0 E# R; c9 p% K5 dXPT2046的SPI时序. `) L1 }, n/ v# M0 ]9 r& E9 W7 C5 h
QQ截图20140715093554.png
1 I4 C$ D7 h$ ?3 I+ I! m
# l4 ?$ w, v( f7 o$ _5 U
                                                                                             
6 T' v- ~2 v! l8 Y/ o4 N7 _BUSY是XPT2046的引脚13,是“忙时信号线”,我们没有用到,不接' f  E" w$ d5 f0 j
, Q9 |/ }# ~' g+ k4 r% ^

0 C2 b8 P! E$ N) r0 M, p9 j当我们读出了触摸屏的ADC值后,就可以把它对应到TFT LCD上了
7 D9 D3 A- y1 m$ R$ U3 Q! J  i
6 M# Z% a- R4 ]" L0 |: F1 I6 `& G      最后提醒朋友们,使用外部中断别忘了打开AFIO复用时钟。
  M) I$ T4 p3 [; ^: g# ^  r      来看看触摸画板的效果吧% ?8 U6 j6 ~* _
图2.jpg , y6 K1 ^$ R5 j# s2 j( b1 e
图1.jpg
5 x% b+ O. R- ]1 h/ l1 J     画的丑了点,轻喷
1 [) x( O+ y' `$ a( ]
# a7 m3 X! L  T这是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()
5 W2 x4 K" {. A: m( S0 W, s{
- d* X2 P% F7 g* Z% S# e        GPIO_InitTypeDef GPIO_InitStructure;  C4 {4 O+ L7 c

8 _( Y$ r3 r# ~5 S/ w6 m8 V, z5 w        //下面是SPI相关GPIO初始化9 ^! s( {8 ^. h& E
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
, _3 _! s" Y) J/ n* O. }        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //通用推挽输出5 M) q0 A! k- d: O0 l
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
4 {0 Y9 Q: E# o0 ]1 H* L        GPIO_Init(GPIOA,&GPIO_InitStructure);
! Y3 Q' d/ s# y8 ~" Y; d  `- R. l- A- {9 ?# @
        //下面是SPI相关GPIO初始化% e" Q1 Y' O: P
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;- l% b7 z& Z& ^& b
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      //上拉输入+ \. ^& y" \, T! U6 t
        GPIO_Init(GPIOA,&GPIO_InitStructure);% W% s6 g6 B. I) e. R
% H* X6 k( o7 w3 B
        //Configure PC6 pin: TP_CS pin
! P* n7 U: F; u) j+ G9 d9 h        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; 3 B. k$ |% o: J3 X# Y1 i6 h
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
8 B0 e" R( p3 s" k& U        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ( u1 D1 |! I" T! S  r/ J- e6 L
        GPIO_Init(GPIOC,&GPIO_InitStructure);1 E  |0 @/ _% b
- Z* I, Q* w. y5 s5 a! ?
        //Configure PC4 pin: TP_INT pin 5 @, D3 Y  r7 z2 y' F1 D
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; & [7 @+ L& B; O1 ~9 ^9 b  A5 Q
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         //上拉输入
  t- ?" @$ w" N- K        GPIO_Init(GPIOC,&GPIO_InitStructure);) i1 y/ z; }, }3 N
} ! w& y0 S: k9 [% J2 j" N1 J
模拟+中断的方式
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
3 \! q! L) s) I+ r; M0 c  J这个不是MDK工程文件,是IAR的

; h' B0 v" ]4 y0 {( T% U6 W) A是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 手机版