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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
硬件平台:TQ2440! U4 G6 z+ `" t+ i1 ~! ?8 v8 F
  触摸屏检测方法可以分两种:
+ ^: N# l8 o1 m  1.检测按下、弹起两个状态时的x y坐标值;- g9 _, G( r: H0 j+ T5 k
  以检测按下状态是读取x y坐标值为例 实现代码如下4 G) n, Z0 ?6 H5 `/ P
  void Init_Touchpanel(void)1 x7 @, f1 n' L* P
  {
; }  a0 k+ }4 N) n; ^; V- K* ?7 }! O  ClearPending(BIT_ADC);
$ A  i( B) @: L! |  rSUBSRCPND|=BIT_SUB_TC ;
; |) o$ O# J/ q+ c+ A  //清adc中断 触摸屏中断
7 A% U$ c  ]" S" p3 o- f  rADCDLY=40000; //ADC转换间隔 (1/3.6864M)*50000=13.56ms
* K4 N& l9 ^' _' e# y  //Normal conversion mode:ADC Start or interval delay 0~65535
; B4 Z( C# h& u" N6 W' I  rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value6 X& n" s8 m6 I# r: y8 }
  //使能预分频器 预分频值 ADCPRS(9) AD转换器频率=gclk / (9+1)$ L4 O( |: @! {$ C( ?0 d
  rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En% C% U$ Q8 p/ }2 A9 m# N3 w9 l- z
  //ADC触摸屏控制寄存器 检测手写笔按下的中断信号 YM输出驱动有效 YP输出无效 XM输出禁止 XP输出驱动禁止
4 [$ _+ }6 X# R+ q4 C. g7 V/ J  // XP上啦使能 adc正常转换模式 等待中断模式
) L8 n+ ]4 }% p3 k: W  pISR_ADC = (int)AdcTsAuto;3 j2 z  f  D5 R3 K
  //指定adc中断服务程序
$ `- H+ B) O* b; {% r  rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear: p( b; {2 A9 s% q
  rINTSUBMSK=~(BIT_SUB_TC);
2 b! u% ~) f/ H  //使能中断 当触摸笔按下时 触发INT_TC中断; Q9 f6 m4 Q2 G: H$ ?2 O' _
  }
0 \! U* y" ~  C9 Z0 V) @  //触摸屏中断函数5 \" H+ y+ N# x% U7 y+ w
  void __irq AdcTsAuto(void)4 D( H7 [/ `4 t6 n3 Z3 H, s! x  V
  {/ I# j' a5 K* ]/ l- i$ x0 |: [
  //ADCDAT0[15]==1 触摸笔未按下
/ x% c- z4 u1 k/ s( ~& q  //ADCDAT0[15]==0 触摸笔按下6 T/ I8 @" A: b; L/ D: I4 d
  if(rADCDAT0&0X8000)- @  r0 I6 l6 w% {5 g
  return ;
/ x- L% z) J& R8 A  v6 h, |; v  rINTMSK |= (BIT_ADC);
4 i/ D4 b! U0 ]/ n8 r: {! t  //禁止adc中断* ]- ?0 d# j7 z& K* N+ D
  rSUBSRCPND|=BIT_SUB_TC ;
3 o1 Z& y6 `" y% _$ B( n/ f  //禁止adc的子中断
& w; [2 a; P2 }8 q" O+ f( W  rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.
  \( P3 T, z! q' ]& O8 Q5 }  //xp上拉禁止 自动顺序测量x y位置
! g* W+ W  t  J  rADCCON|=0x1; //start ADC- A1 _' ]2 Q- e( X
  while(rADCCON & 0x1); //check if Enable_start is low- r+ M0 |5 F* Y# m, @7 j
  //adc一旦开始 将自动使ADCCON[0]=0, {" g- O7 G" [1 O
  while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
, m0 G+ L6 d2 O  //adc结束时,ADCCON[15]==1& u* }6 ]0 T. m% s$ h
  while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit
9 T! [6 J  N7 V' J8 ?% h  //等待ADC结束(不管后级中断是否传递 adc完成后 此处应该被置位)8 k$ X8 u# {# {; \! B8 c$ T. w
  point.x = (rADCDAT0&0x3ff);
) ?1 P* x: V* p( d5 C  d  point.y = (rADCDAT1&0x3ff);
% s& e' \. T5 }( f  f0 c' a0 M  //获取x y方向的adc值 更新坐标点* G, f( D6 H; U/ s9 b& T
  Uart_Printf("XP=%04d, YP=%04dn",point.x, point.y); //X-position Conversion data
: o- v1 {5 q. r! x  ClearPending(BIT_ADC);
. @" z  @& {, B  rSUBSRCPND|=BIT_SUB_TC ;
  V* Q$ D& v: g  //清adc中断
( b* K# F. z/ a! q/ c& Q  J7 i  Init_Touchpanel();' B( _3 j. _- H! M4 g1 K( s* u
  //重新初始化触摸屏
/ D$ V' ~; A1 ~* J  }9 J6 b4 V9 R5 r8 }5 O
  2.检测在按下~弹起两个状态中间的x y坐标值 定时检测并更新坐标;
4 Y2 C7 N& W0 A: i  实现:
% ]5 z" [, a4 D8 [! l% O  a 将adc 触摸屏接口设置为检测按下触摸笔中断;
# g, k2 I; _" H& Q3 f, |  b 在adc按下触摸笔中断函数中 将adc的中断服务程序重新指定为弹起触摸笔中断函数;
% Y& C! O) n; Y2 W  c 在adc按下触摸笔中断函数中 启动定时器定时进行ADC 采集XY坐标值 或在每次读取坐标值的时候进行ad转换 获取坐标值;
5 V3 ]+ |5 T, O0 Q8 b  d 在adc弹起触摸笔中断函数中 关闭定时器 停止采集x y坐标;
" z: U5 `& y1 O- w

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-15 00:40 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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