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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
硬件平台:TQ2440. f! ^, h, g0 y0 D* m5 x. o
  触摸屏检测方法可以分两种:
- s0 G# X! a6 d  ?# q  1.检测按下、弹起两个状态时的x y坐标值;
& m: b& W5 x/ q0 ~5 M; J  以检测按下状态是读取x y坐标值为例 实现代码如下& u6 z8 D2 M  X" \
  void Init_Touchpanel(void)1 P  c- X* n  D4 Q7 E: ?
  {3 ?3 v& f% N( t: l+ \2 z/ ^4 p
  ClearPending(BIT_ADC);% n9 Z$ P0 }+ {/ q0 ?
  rSUBSRCPND|=BIT_SUB_TC ;/ \5 T6 c  j( }* _4 W
  //清adc中断 触摸屏中断8 j7 k3 j! z! s3 e" f
  rADCDLY=40000; //ADC转换间隔 (1/3.6864M)*50000=13.56ms2 V9 t+ @. ]0 d/ @2 y. J
  //Normal conversion mode:ADC Start or interval delay 0~65535
% W' U( X* y1 ^  B  rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value
3 v: s0 j7 g9 k4 W: o  //使能预分频器 预分频值 ADCPRS(9) AD转换器频率=gclk / (9+1)* l0 w6 G7 p) A! h4 Z
  rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
$ V1 h: J. J9 J0 E3 M* W" t  //ADC触摸屏控制寄存器 检测手写笔按下的中断信号 YM输出驱动有效 YP输出无效 XM输出禁止 XP输出驱动禁止
! u3 L) Z  m/ k8 [  // XP上啦使能 adc正常转换模式 等待中断模式- \4 r7 ^" S; l+ D
  pISR_ADC = (int)AdcTsAuto;
' w- U5 s( i- H4 K; m  //指定adc中断服务程序9 \, d6 f% D- R$ q9 o8 r3 v* b
  rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear5 ~! c8 l, @4 l: c. I6 F5 u* c
  rINTSUBMSK=~(BIT_SUB_TC);
' @6 ~2 p  p7 R2 H6 |1 {1 J  //使能中断 当触摸笔按下时 触发INT_TC中断9 c, y2 V. v. v1 M! ^7 h9 r
  }
: D3 j$ n, `6 [  //触摸屏中断函数% [4 |6 K: h, D& a' h
  void __irq AdcTsAuto(void)
$ `; D2 Q6 Q( N0 j  {
) B# k1 t3 v- _" z  //ADCDAT0[15]==1 触摸笔未按下
4 X# P! f  {' k: R' V  //ADCDAT0[15]==0 触摸笔按下, p. J8 B0 D9 A7 u
  if(rADCDAT0&0X8000)8 \8 P& u% l% Y. H% R+ @
  return ;
: K( V5 j9 `1 ~4 _) R* l  rINTMSK |= (BIT_ADC);: f4 m. o, \! d0 y$ K, H
  //禁止adc中断3 _! r6 `6 i- L& v4 X
  rSUBSRCPND|=BIT_SUB_TC ;8 d6 M# C( F& E; p
  //禁止adc的子中断  H7 |8 r! E7 \2 o
  rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.( Y) Q# Z7 O. h; ^9 `& r
  //xp上拉禁止 自动顺序测量x y位置
( Z4 _* R! ]5 G  rADCCON|=0x1; //start ADC
1 |4 c  d6 j. m8 T- J! X  O. j  while(rADCCON & 0x1); //check if Enable_start is low
$ v# y, M; a* \: l7 `  //adc一旦开始 将自动使ADCCON[0]=0
5 f5 H( Z1 J1 ^4 `; O  B  while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
. u3 O& H" N! s$ Y" G: }" H# J  //adc结束时,ADCCON[15]==1) [( a% }1 h; {4 b' P1 A4 V: s
  while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit. w% H& @2 f( o* j- v. c. Z& g
  //等待ADC结束(不管后级中断是否传递 adc完成后 此处应该被置位)
2 _; M6 d8 M2 a9 S7 t; m  point.x = (rADCDAT0&0x3ff);
' z/ X: Q" i1 J. h. |$ f/ G4 i3 C  point.y = (rADCDAT1&0x3ff);" q/ @0 y/ F( z& X: p
  //获取x y方向的adc值 更新坐标点
' m5 t. J' {& [3 Z2 a% G' g  Uart_Printf("XP=%04d, YP=%04dn",point.x, point.y); //X-position Conversion data, o7 |6 e  V7 Y/ _* J% d- {4 v
  ClearPending(BIT_ADC);
. X# }$ p% g" P" J  rSUBSRCPND|=BIT_SUB_TC ;7 u' }4 g" U; n; X+ R, B; Z
  //清adc中断
; ~2 y, L+ ~' t( E1 L% t  Init_Touchpanel();
) O1 i$ a2 L5 q$ o9 l  //重新初始化触摸屏( R7 z  K. }+ W
  }3 n1 `% f! S& X( b& p, P7 d
  2.检测在按下~弹起两个状态中间的x y坐标值 定时检测并更新坐标;. e) u, B5 i1 J- t6 D
  实现:
: O/ r( c2 V4 m/ f) p9 {  a 将adc 触摸屏接口设置为检测按下触摸笔中断;! J3 q% v) Z$ j0 K! V9 G4 Y
  b 在adc按下触摸笔中断函数中 将adc的中断服务程序重新指定为弹起触摸笔中断函数;
* h; y2 G# j6 l0 U! F  c 在adc按下触摸笔中断函数中 启动定时器定时进行ADC 采集XY坐标值 或在每次读取坐标值的时候进行ad转换 获取坐标值;
$ Q2 F+ A7 X2 c: Z# H  d 在adc弹起触摸笔中断函数中 关闭定时器 停止采集x y坐标;$ E5 R; t; L1 W4 X

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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