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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
硬件平台:TQ2440
& g1 ~9 e7 n. z3 L' l% o. G9 c  触摸屏检测方法可以分两种:1 b, d$ _. B" ^' D
  1.检测按下、弹起两个状态时的x y坐标值;: y9 A* Q4 V5 l5 W& u3 N* ?
  以检测按下状态是读取x y坐标值为例 实现代码如下
' n0 g, v, K2 N( j1 O9 n  void Init_Touchpanel(void)/ t: H* y& P7 C8 V  _
  {
; b$ G  b9 ^& E. y. f  ClearPending(BIT_ADC);
/ W7 E9 _, U* x  H- H% d3 K  rSUBSRCPND|=BIT_SUB_TC ;
- {( q: E" N* d" B! r) n  //清adc中断 触摸屏中断
# \& _9 G. |' ~  rADCDLY=40000; //ADC转换间隔 (1/3.6864M)*50000=13.56ms# v# e7 E( M9 @1 }6 r9 s# b9 C7 ]8 T
  //Normal conversion mode:ADC Start or interval delay 0~655350 T& ^3 Z% Y+ z" k- o. _; m
  rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value
3 v3 p3 d1 e7 k3 x7 P! E  //使能预分频器 预分频值 ADCPRS(9) AD转换器频率=gclk / (9+1)' |$ `7 R: e. O: S
  rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En# i% o$ x% k2 l) R1 B( B
  //ADC触摸屏控制寄存器 检测手写笔按下的中断信号 YM输出驱动有效 YP输出无效 XM输出禁止 XP输出驱动禁止( q/ W/ A% B- q# B6 \
  // XP上啦使能 adc正常转换模式 等待中断模式+ T; Z6 O4 D" H6 ~+ u$ l
  pISR_ADC = (int)AdcTsAuto;* o" K( I9 d* \
  //指定adc中断服务程序/ g! Z' u9 ^6 l3 T
  rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear
% D1 v" k, l" T; b- t: X  rINTSUBMSK=~(BIT_SUB_TC);- `: h3 {. k% n7 I" d9 N* b
  //使能中断 当触摸笔按下时 触发INT_TC中断4 O0 d) `  r' E* `& G- F5 \$ W
  }& X0 p& |2 d6 k4 b% e/ O
  //触摸屏中断函数; A4 Q6 b! Z& W) c
  void __irq AdcTsAuto(void)
( a( R4 g1 y6 L0 f. O7 [  {
" s* S# I2 E6 `, [1 }  //ADCDAT0[15]==1 触摸笔未按下
! ^1 s: i# i! R" U+ i7 z! ^9 _; e  //ADCDAT0[15]==0 触摸笔按下( e: M/ K, @5 j& |) M3 f+ N# f5 J  o
  if(rADCDAT0&0X8000)6 L! |8 G: _; r1 _# |
  return ;/ a/ F6 N& @$ B9 J2 f( ?: J
  rINTMSK |= (BIT_ADC);( w6 E4 `; Q3 I. a5 Y
  //禁止adc中断( h6 @/ _$ i/ S, O+ a8 z  y! M* Q$ A
  rSUBSRCPND|=BIT_SUB_TC ;" V( q/ D: p: {/ w3 V" W6 j  H
  //禁止adc的子中断% Z0 e2 r; R6 R- G. i! Y$ n
  rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.
& y" m  ?( \. V# N6 M' U  //xp上拉禁止 自动顺序测量x y位置
' z* v9 w7 M1 |# E  _  rADCCON|=0x1; //start ADC* c4 k) {! x: h+ Y+ T8 L. g$ E9 l
  while(rADCCON & 0x1); //check if Enable_start is low, z) ^8 N$ g* o0 J3 l( Q) p
  //adc一旦开始 将自动使ADCCON[0]=0
/ Z9 T' ^1 Z7 ]2 y3 |& u  while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
  E" ^+ d6 \/ q2 X# @6 o: j  //adc结束时,ADCCON[15]==1
1 Y/ N0 z9 X$ t* ~$ s  while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit
, F1 n# ?7 N; z1 G8 r( H. Q' @  //等待ADC结束(不管后级中断是否传递 adc完成后 此处应该被置位), w) }- o8 m( w
  point.x = (rADCDAT0&0x3ff);' W% S9 c8 @; z
  point.y = (rADCDAT1&0x3ff);
3 Y3 @# \3 s4 }/ X$ U8 f  //获取x y方向的adc值 更新坐标点' O# o5 T, Y- T( [" J7 u
  Uart_Printf("XP=%04d, YP=%04dn",point.x, point.y); //X-position Conversion data
8 V. L9 `7 ^. u2 C. R  ClearPending(BIT_ADC);0 F+ j+ ~; w$ n+ R, j
  rSUBSRCPND|=BIT_SUB_TC ;% i) _+ i2 q) E6 F
  //清adc中断! a$ D# w" _2 y: y3 V: D$ \
  Init_Touchpanel();
6 [, ^' F# m& N4 M1 f  //重新初始化触摸屏* Z. {- O4 P  ]- F, ?
  }! ~8 l7 h" ?% N9 [
  2.检测在按下~弹起两个状态中间的x y坐标值 定时检测并更新坐标;" L. H5 `1 Q! b/ Q/ M' ^0 }$ |
  实现:
+ E2 O7 Z/ Q% Z7 z- P  a 将adc 触摸屏接口设置为检测按下触摸笔中断;) y( R& I1 d* ]
  b 在adc按下触摸笔中断函数中 将adc的中断服务程序重新指定为弹起触摸笔中断函数;
' ?" L% _$ O& @' f8 C6 E6 `3 Y  c 在adc按下触摸笔中断函数中 启动定时器定时进行ADC 采集XY坐标值 或在每次读取坐标值的时候进行ad转换 获取坐标值;
+ g+ D" [3 H) B7 A$ f( O! J  d 在adc弹起触摸笔中断函数中 关闭定时器 停止采集x y坐标;* u; r2 c& }7 {: `

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 19:08 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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