找回密码
 注册
关于网站域名变更的通知
查看: 432|回复: 1
打印 上一主题 下一主题

嵌入式开发之ARM9--TQ2440触摸屏学习笔记(转)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-5-12 14:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
硬件平台:TQ2440
2 a. q3 B3 A; D$ ]  触摸屏检测方法可以分两种:
: b5 L: r$ |# t8 }: K7 R. z; k) [  1.检测按下、弹起两个状态时的x y坐标值;3 M2 ~2 ]) M3 ]0 b9 x0 w- B
  以检测按下状态是读取x y坐标值为例 实现代码如下
& Y: s1 Y1 c- M, P, _; t  void Init_Touchpanel(void)
, m" S0 \3 K5 ~1 _  {
' N4 I! T0 @  J* @. v2 P  ClearPending(BIT_ADC);6 [: W5 H( ]0 s" Z
  rSUBSRCPND|=BIT_SUB_TC ;, [6 k% a* [4 ~8 L  p% C1 Z7 Y3 R
  //清adc中断 触摸屏中断
3 z7 E; t8 f$ n1 g) x  rADCDLY=40000; //ADC转换间隔 (1/3.6864M)*50000=13.56ms9 l& J5 [3 L" T
  //Normal conversion mode:ADC Start or interval delay 0~65535% @/ A4 ?3 A2 Q
  rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value8 r$ S3 _' O3 Y
  //使能预分频器 预分频值 ADCPRS(9) AD转换器频率=gclk / (9+1)
0 Q3 }! h: p! Z- F, l# L+ k7 ]' s! j  rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En  l3 b1 l" [8 E* z5 X
  //ADC触摸屏控制寄存器 检测手写笔按下的中断信号 YM输出驱动有效 YP输出无效 XM输出禁止 XP输出驱动禁止
4 o& R) g4 Z1 m: _  // XP上啦使能 adc正常转换模式 等待中断模式0 I+ \' J- E9 l4 h# {& g( R. {
  pISR_ADC = (int)AdcTsAuto;$ t- x5 B* j$ Q7 E* ?$ Z
  //指定adc中断服务程序; @. Y2 R& _! p
  rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear
/ b- x: k2 d, |& i, c% e  rINTSUBMSK=~(BIT_SUB_TC);0 `; _; F! e6 H( H4 R# F# A1 Z
  //使能中断 当触摸笔按下时 触发INT_TC中断+ S+ B2 k( ~1 p  g; T4 N1 ~7 \9 t
  }
& s5 z0 ?& s. a0 b  //触摸屏中断函数; B* ~4 t0 T3 n. y8 v4 d; h: c
  void __irq AdcTsAuto(void)/ q& s" V! m; F/ @
  {9 i" v; l+ v5 N" f. N0 M
  //ADCDAT0[15]==1 触摸笔未按下3 |6 D5 ?7 g# i/ i
  //ADCDAT0[15]==0 触摸笔按下5 e* _4 P9 b$ ~# R3 m& Z+ w
  if(rADCDAT0&0X8000)
5 `8 B' V$ T5 E4 g, \9 m( b; ?6 c6 F  return ;4 M! K4 c  R, |3 {) C
  rINTMSK |= (BIT_ADC);
% Y9 n* W) o2 w( d4 V+ D) D5 F  //禁止adc中断9 t( J/ V( a% C8 v/ h
  rSUBSRCPND|=BIT_SUB_TC ;: \& ]- f) V2 l+ o! d5 x. t
  //禁止adc的子中断6 Q$ b' x# G. [+ V
  rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.
; |2 v' ~: m% m: R0 `& @4 X  //xp上拉禁止 自动顺序测量x y位置  A0 n4 u7 y" O
  rADCCON|=0x1; //start ADC
6 D& D0 F6 V; _* f  while(rADCCON & 0x1); //check if Enable_start is low
8 Z: `4 k- @" ?" s4 _, X7 O3 j  //adc一旦开始 将自动使ADCCON[0]=0& s  R- J3 Y5 _( M
  while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!' E% U5 z! O. `0 J
  //adc结束时,ADCCON[15]==1* D; D, W( [! w$ ^
  while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit
4 A2 Z( g: x9 M! p0 q1 s5 I% q' Q. m# q  //等待ADC结束(不管后级中断是否传递 adc完成后 此处应该被置位)
3 X5 @' f. Z8 b" z  point.x = (rADCDAT0&0x3ff);
- y  ?0 n: u/ u" R  point.y = (rADCDAT1&0x3ff);: [& r3 }" @4 j( C7 `$ G
  //获取x y方向的adc值 更新坐标点
+ ^+ W+ `4 ], @( E8 V1 _7 o/ I  Uart_Printf("XP=%04d, YP=%04dn",point.x, point.y); //X-position Conversion data  x" P8 D9 c* R* `5 z6 R2 x
  ClearPending(BIT_ADC);3 m' [' |4 I1 M/ b& v$ b
  rSUBSRCPND|=BIT_SUB_TC ;8 L" l1 l. L; X% O# I
  //清adc中断$ w! R" C$ o$ J1 N; f8 O( d
  Init_Touchpanel();+ L  Z3 Y, S4 P  `
  //重新初始化触摸屏* w  K; {0 M1 Q$ T
  }
' [' D  B/ S1 u* ^( z9 Q  2.检测在按下~弹起两个状态中间的x y坐标值 定时检测并更新坐标;) P; d, ~) J/ |
  实现:
! W) s! ?, t/ T& s. O. _0 [  a 将adc 触摸屏接口设置为检测按下触摸笔中断;
( J7 J7 y. C9 N! |" i  b 在adc按下触摸笔中断函数中 将adc的中断服务程序重新指定为弹起触摸笔中断函数;
3 N6 w0 v( B) K- _  c 在adc按下触摸笔中断函数中 启动定时器定时进行ADC 采集XY坐标值 或在每次读取坐标值的时候进行ad转换 获取坐标值;) q, K& O" N7 }0 N3 n6 {8 c& A0 R" V: |
  d 在adc弹起触摸笔中断函数中 关闭定时器 停止采集x y坐标;
# a  _8 {, _0 N4 }2 z' n' k+ {

该用户从未签到

2#
发表于 2016-5-16 13:48 | 只看该作者
楼主辛苦了!感谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-11 20:34 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表