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

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

[复制链接]
shanji 发布时间:2014-7-15 09:44
XPT2046是一款四线制电阻触摸屏控制芯片,由深圳市矽普特科技有限公司研发生产,被广泛的应用于触摸屏驱动,堪称经典之作!他内含12位分辨率125KHz转换速率逐步逼近型A/D转换器,支持从1.5V到5.25V的低电压I/O接口。能通过执行两次A/D转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。' p2 R5 i- g- m/ y& h% P3 q
QQ截图20140715092347.png
' N+ Z- k. y0 l5 p4 h( x
- g& e6 D2 b. G8 z

4 [8 r" A6 L$ u! k+ W1 j  r
7 n; n5 P/ ?* t# W% k" J4 w0 H

$ }5 a* E1 M3 `* Y% K4 u连接方法:8 \% t! q+ q. _1 |2 D" |- j. [1 N

, ?% Q1 E* j6 \" ~

- U' l' B" ^! p# e  R说明:1、9、10引脚接VCC,6引脚接GND,2、3、4、5引脚接触摸屏的4条引脚线,16、15、14、12引脚接单片机SPI引脚,11接单片机某个引脚。
- I' k  {7 ]! q
/ {5 x9 K* f- t1 W/ ]% G
工作原理:
# U4 {8 T  F; d4 z  M) c   把XPT2046第11引脚接到STM32单片机的引脚设置为中断引脚,触摸屏没有被触摸时,11引脚保持高电平,当有触摸屏被触摸时,11引脚变为低电平。所以用STM32单片机检测11引脚的高低电平,就可以知道有没有触摸屏触摸事件发生。如果发生了触摸屏按下事件,单片机通过SPI口,首先发送读取X坐标的命令0X90,然后读出2个字节的数据,然后再发送读取Y坐标的命令0XD0,然后再读出2个字节的数据。这时候,XY的坐标值就知道了,因为XPT2046是12位精度的ADC,所以读出的2个字节中,只有高12位是有效数据。
& A6 T% R" J0 u3 ~1 C/ l6 P. V4 N# l) ]+ P4 v
关于触摸校准:
& ~. t' F# w* E3 N$ X     触摸液晶屏的4个角,采集X和Y坐标的12位值。这时候,就分别得到了X坐标和Y坐标的最小值和最大值,根据液晶屏的分辨率,再通过数学等比公式,就可以通过采集得到的12位ADC值得出现在触摸到屏幕的哪个点了。; Q+ X) j. `* w: H; P
……………………………………………………………………..( z8 i: s% Q8 K- q
    对于一个资深级的电子人,看了我上面的表述,就知道XPT2046怎么用了。但是,对于小白的你,上面的表述对你而言就是雾里看花。不要着急,下面我给你从0补起。( ]1 e- {1 N% V# x2 w
首先,你要知道,我上面所讲的内容是:使用XPT2046驱动4线电阻式触摸屏。那么,你见过4线电阻式触摸屏吗?没见过怎么办?好办!请看下图:( H2 B: q5 z5 w# p, ]
大部分的电阻式触摸屏,都是4线制的,就是引出了4条线的意思。我随便找了一个
9 P; o) r. w+ y1 X QQ截图20140715093232.png
& p! K$ D( k5 R% w7 K: m
                                                                                     4 [0 T# f) e! e: @: u  o& C
看它引出的排线,共4条线,所以是4线制的,也就是说,这个触摸屏,就可以用XPT2046驱动。6 E; Z$ D2 Q) w, g
看到这里,你就赚了,你已经认识了电阻式触摸屏的真面目了,这就是工作单位要的工作经验,想要更多干货,请继续往下看吧。
: h" h/ f4 Y4 R/ g
/ t. `4 r4 x5 A6 x: L: {9 p5 O      从前面我们了解到,此芯片的供电电压是常用的3.3V和5V电源都可以。再加上“支持1.5V~5.25V的数字I/O口”特性。就是说,我们常用的5V的和3.3V的单片机,都可以作为他的控制器了,有没有觉得在单片机选型上放宽很多了?
+ b' |& G- x" @8 d2 R: B( E' V" O
    XPT2046与MCU连接:
- v' x; l& S" n. ^( o    XPT2046与单片机采用SPI连接。分别为引脚16:DCLK(SPI时钟引脚);引脚15:CS(使能引脚或者叫做片选引脚);引脚14:DIN(数据输入引脚);引脚12:DOUT(数据输出引脚)。带SPI模块的单片机,可以配置SPI模块与XPT2046通信。不带SPI模块的单片机,可以随便找4个引脚,模拟SPI时序,与XPT2046通信。
/ I/ `: S2 z6 K     除了SPI通信的4个引脚,还有一个引脚必须接:PENIRQ。当触摸屏有触摸事件发生,这个引脚就会拉低,所以我们把这个引脚接到单片机的某个中断引脚,就可以随时发现触摸屏有被按下(用外部中断)。
. W) y7 ^" s! x/ d* S& H: }) R, K: f7 M  L6 V  O! n6 N( f
XPT2046的SPI时序
8 R3 x, G- X; n) f# C# }5 G# H QQ截图20140715093554.png + D" Y4 L% [; J0 l3 l* Y

! y. x1 [. y. U. D0 j6 r) |! T
                                                                                              ; w. T" g$ @$ t8 {# t, N2 V! n
BUSY是XPT2046的引脚13,是“忙时信号线”,我们没有用到,不接
5 s% B% O, B0 R
3 f9 h) Q7 h1 n; F" S+ S% o' W2 x; u% x  i! k6 s7 [; b0 l5 x
当我们读出了触摸屏的ADC值后,就可以把它对应到TFT LCD上了
, a# d# U1 N8 W# Z) Z' |+ F8 A * c- D: Y# H( t4 x; B
      最后提醒朋友们,使用外部中断别忘了打开AFIO复用时钟。% w* U! F6 x1 @1 J
      来看看触摸画板的效果吧3 t. l) I0 Y" K
图2.jpg # |. c- U. ]( U3 r3 ]$ W) @- Y  q
图1.jpg
% q6 d. c' C; [0 G  L! Q     画的丑了点,轻喷- W5 k) r% y9 z9 x% T7 \1 M

3 `% T0 b# `8 Y) A这是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()1 Q, t. c# Z# P7 Z( x8 N
{/ Y/ N6 t2 Y  F- a5 d$ A4 y
        GPIO_InitTypeDef GPIO_InitStructure;! c% L0 f+ A% c) z  l3 X" J

) r( I" c6 c9 O" a9 J        //下面是SPI相关GPIO初始化0 a* S! q% k" o  P8 N; @
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;$ O# {: |( y! G) c! ]/ h& E8 x  P
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //通用推挽输出  j3 P5 h# L1 W. c
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;; H' `, j$ X. j/ t1 v; d3 J/ m
        GPIO_Init(GPIOA,&GPIO_InitStructure);- p& z* P4 R2 \
+ s4 ~# S! L3 L& l4 f+ R
        //下面是SPI相关GPIO初始化
+ X8 u; b2 P" F' z$ u6 G; O        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
$ _- Y9 t" R2 P8 W+ s        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      //上拉输入
0 y* b. f/ f5 e2 S2 o& e        GPIO_Init(GPIOA,&GPIO_InitStructure);
  b" |6 P; `- o5 l) z- x# P
/ _4 t6 o4 T9 w- e$ f* g9 A        //Configure PC6 pin: TP_CS pin , W& z, P8 j0 B2 Q" Y! F) A
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; * d  X9 I8 [5 ]! z# ~! ]
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
; s0 F% a& D: L) }9 L$ A        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
$ C( u/ I: m$ L; N( z        GPIO_Init(GPIOC,&GPIO_InitStructure);1 z+ w+ S5 _8 f. Z

2 y3 g8 I& i! @: J        //Configure PC4 pin: TP_INT pin
" n8 J: p9 h/ ?9 b9 @+ e        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; # I4 V  Y# r8 V; X' v
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         //上拉输入
( s; O9 ~- R/ z7 b4 r        GPIO_Init(GPIOC,&GPIO_InitStructure);/ n, q# |  @8 I' T) h! e
}
! g: [5 @% }1 K, N2 e9 o6 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
$ N, n3 c. Y; ~这个不是MDK工程文件,是IAR的
; q  m5 d8 D! A# S
是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 手机版