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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
硬件平台:TQ2440
+ v/ b" w$ N. V  触摸屏检测方法可以分两种:& ]9 o7 N8 _; |$ ~8 i9 E( W( B
  1.检测按下、弹起两个状态时的x y坐标值;- j) M' v% f2 c, z6 w) R) Q$ a
  以检测按下状态是读取x y坐标值为例 实现代码如下  H; f  J+ R  n  j0 H# n$ {, R
  void Init_Touchpanel(void)
/ C% i' i! {2 D* U5 Z3 `5 h  {4 y: |+ H  c6 z* z# c% y' u# \
  ClearPending(BIT_ADC);+ F  C. {/ @/ O5 `" Z
  rSUBSRCPND|=BIT_SUB_TC ;! P6 {9 j; x/ _; x" F7 q
  //清adc中断 触摸屏中断/ H- V. ?7 I+ J( p5 R# U. K/ Z
  rADCDLY=40000; //ADC转换间隔 (1/3.6864M)*50000=13.56ms2 R: k* U9 L) k; E+ P
  //Normal conversion mode:ADC Start or interval delay 0~65535
/ d2 a$ s9 B9 k9 a/ q  rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value
# {0 ?6 [( Y: t0 Z6 U# w  //使能预分频器 预分频值 ADCPRS(9) AD转换器频率=gclk / (9+1)
/ W2 ]) _9 l% z1 f! X1 z/ c, r  rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En: ^5 X" T. V5 Q) {
  //ADC触摸屏控制寄存器 检测手写笔按下的中断信号 YM输出驱动有效 YP输出无效 XM输出禁止 XP输出驱动禁止
. v3 j% z9 E# `) c+ e( v  // XP上啦使能 adc正常转换模式 等待中断模式
0 b. l1 v9 y9 M6 g' T  ^' P  pISR_ADC = (int)AdcTsAuto;% |- h- p% ]8 z& a  ]2 _: E
  //指定adc中断服务程序
) y. z9 N7 i" P9 s, _  rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear; t+ n  m5 P: J6 E3 B! G
  rINTSUBMSK=~(BIT_SUB_TC);
1 k* o1 l3 u; n  O' r: {  //使能中断 当触摸笔按下时 触发INT_TC中断
1 k6 |) S% M8 p/ R6 I9 R  }: U$ G' k! g% A% C1 f- R8 v1 l
  //触摸屏中断函数
( `* v, o/ k5 Y" \( C  void __irq AdcTsAuto(void)
& j* K1 b: l3 N1 U/ l+ @) S* s  {; d1 y/ V; c: G8 p- j3 e
  //ADCDAT0[15]==1 触摸笔未按下
" l6 V3 r; l/ k3 a7 {  //ADCDAT0[15]==0 触摸笔按下5 u* y$ c( m2 w; j
  if(rADCDAT0&0X8000)4 C  ^  N) `6 a* U- x5 m" s# P
  return ;; g. R2 ?2 n- Q+ b$ G  s
  rINTMSK |= (BIT_ADC);8 N0 B" C7 O! k. @9 _! ]4 n. T# z8 `
  //禁止adc中断6 E! Z/ a: f& z3 @! _
  rSUBSRCPND|=BIT_SUB_TC ;
) a, F( Y8 ~5 D9 U8 ~  //禁止adc的子中断
9 z+ U) k& t* Y% a9 G2 U  _; p1 H7 Z9 l  rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.
. _1 [4 G& o* [% U$ t8 d1 \  //xp上拉禁止 自动顺序测量x y位置
, x9 \  \1 t& i4 z/ _0 L% p# Y' H, p  rADCCON|=0x1; //start ADC
! u5 g4 ?) W4 B! j) h8 [' S  while(rADCCON & 0x1); //check if Enable_start is low) ~; K- ^' A# G1 r
  //adc一旦开始 将自动使ADCCON[0]=0( ]' d9 r! K; x, Z% B! }& D  i/ z
  while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
5 a# Z5 u3 ?2 K$ u/ v  R  //adc结束时,ADCCON[15]==18 o% j- N0 q7 n' H7 z# n
  while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit6 |( R2 [3 }  A4 q$ o# f
  //等待ADC结束(不管后级中断是否传递 adc完成后 此处应该被置位)# c" c4 [. {8 w$ X+ }+ C
  point.x = (rADCDAT0&0x3ff);
" n4 ^. L5 U! w# U  point.y = (rADCDAT1&0x3ff);
5 k0 m' P- H* B5 n  h. S  //获取x y方向的adc值 更新坐标点
. i& I% K5 S! n* C2 P9 I. Y0 ?  Uart_Printf("XP=%04d, YP=%04dn",point.x, point.y); //X-position Conversion data
4 ?! {- \7 ]. R3 Y1 B' W  ClearPending(BIT_ADC);
; z! Q0 ]' Q5 Q( a( j  rSUBSRCPND|=BIT_SUB_TC ;
9 B6 P8 L$ A9 G9 B. m! l! H  //清adc中断* I6 T+ ?5 e2 ~8 Y1 S
  Init_Touchpanel();7 F" R/ Z  h, ?3 d* G
  //重新初始化触摸屏
# n- [) Z, H. ?$ \  }
" C, J/ Z6 |' @7 f- D  2.检测在按下~弹起两个状态中间的x y坐标值 定时检测并更新坐标;3 p1 [; ]0 ^* D5 t
  实现:: A2 @4 X' N/ e7 V! \' P( N
  a 将adc 触摸屏接口设置为检测按下触摸笔中断;, h1 `- }3 Z: k9 V0 T3 u# w9 G' S
  b 在adc按下触摸笔中断函数中 将adc的中断服务程序重新指定为弹起触摸笔中断函数;  h$ Z4 X6 \% X7 G( Y0 ]
  c 在adc按下触摸笔中断函数中 启动定时器定时进行ADC 采集XY坐标值 或在每次读取坐标值的时候进行ad转换 获取坐标值;
$ m, g  H. z* o4 m/ h. g$ H, @  d 在adc弹起触摸笔中断函数中 关闭定时器 停止采集x y坐标;
# N5 }8 L3 S, S0 N* K# H

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-6 11:33 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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