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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
硬件平台:TQ2440
& c2 }, D5 T* S" W+ @. s1 _7 q& Y  触摸屏检测方法可以分两种:+ N$ ]; y: Z2 V9 i
  1.检测按下、弹起两个状态时的x y坐标值;
& {; r0 m0 }0 N- ?* }  以检测按下状态是读取x y坐标值为例 实现代码如下
5 t! \1 n8 U* R3 \, }& `" X1 X  void Init_Touchpanel(void)
8 c* T$ j8 w0 X8 F) K9 _  {9 r, A* H" P7 i* I0 f9 A- M4 j
  ClearPending(BIT_ADC);/ B/ Q* I$ X' y4 P) _
  rSUBSRCPND|=BIT_SUB_TC ;+ h4 `/ R& s5 L& b- n
  //清adc中断 触摸屏中断
9 Q/ R% ?5 f+ W; i, a  rADCDLY=40000; //ADC转换间隔 (1/3.6864M)*50000=13.56ms
3 J$ ~# e  e5 h4 w3 ]  //Normal conversion mode:ADC Start or interval delay 0~65535
. g7 f5 d4 N& F7 r: Y6 S$ A$ P* G  rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value0 q% w( R) Z) N) {2 l$ @: E( A
  //使能预分频器 预分频值 ADCPRS(9) AD转换器频率=gclk / (9+1)2 ^8 \; R! i- o, W
  rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
! ]1 \" H) c2 o6 @# t+ f4 z  //ADC触摸屏控制寄存器 检测手写笔按下的中断信号 YM输出驱动有效 YP输出无效 XM输出禁止 XP输出驱动禁止) z. t6 A) U- [5 ~& E- T9 O* H) W
  // XP上啦使能 adc正常转换模式 等待中断模式
0 ?9 _& N9 `4 K" R: P9 t  pISR_ADC = (int)AdcTsAuto;% i; W0 _& ?; e, H7 p% U/ V: i
  //指定adc中断服务程序
. p. a# d: U" a+ t. x' N& B  rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear- c& j% U  W$ z* ?4 q1 H% n
  rINTSUBMSK=~(BIT_SUB_TC);
9 F* f* ?; C% `0 B+ N3 n  //使能中断 当触摸笔按下时 触发INT_TC中断
  H9 M0 l1 q, m+ b7 ?  }7 k, X2 J% m2 b1 p, A  `) D
  //触摸屏中断函数+ T4 [& V, a  J% J
  void __irq AdcTsAuto(void)) o% W9 K! S$ U) J: k
  {
# p' l( X) u7 e+ C; n  //ADCDAT0[15]==1 触摸笔未按下( r1 r4 n* H. K9 @
  //ADCDAT0[15]==0 触摸笔按下) n$ o4 V4 r+ i! S+ w8 \9 `  l" C
  if(rADCDAT0&0X8000)" L6 K# Q1 g- I, ^2 x, @
  return ;& T( |% B/ V4 B
  rINTMSK |= (BIT_ADC);# o- S% f" p5 |
  //禁止adc中断
  ~4 Q! z; G' J, l  T  rSUBSRCPND|=BIT_SUB_TC ;2 U5 `5 g8 {6 p& t/ P1 r6 ^
  //禁止adc的子中断. \/ Q) S3 K. d3 W
  rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.
) g7 H$ ?- Q9 F' `  //xp上拉禁止 自动顺序测量x y位置
& `. V$ }+ g3 N0 Y! v$ ~  rADCCON|=0x1; //start ADC  p1 l7 _0 V8 a2 y9 o
  while(rADCCON & 0x1); //check if Enable_start is low9 ?1 q- C0 Q8 }. P$ [
  //adc一旦开始 将自动使ADCCON[0]=0& ?7 Y: ]+ m% [4 {. d- ]& n
  while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
5 E* L% H5 E7 u( D  //adc结束时,ADCCON[15]==1
8 ~8 r6 K* U; ?: C( p% a0 l  while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit9 G8 Y: ^: h# s! S
  //等待ADC结束(不管后级中断是否传递 adc完成后 此处应该被置位)
7 z" M, Y5 B1 ^+ W& S6 [+ V  point.x = (rADCDAT0&0x3ff);! K4 @6 L7 K& I/ H! D/ L8 K
  point.y = (rADCDAT1&0x3ff);
; V, D* V# b, v+ W" f  //获取x y方向的adc值 更新坐标点) l' o# a7 ]3 p+ l, x" u& u
  Uart_Printf("XP=%04d, YP=%04dn",point.x, point.y); //X-position Conversion data
8 n# R. g$ C6 u* P" `  ClearPending(BIT_ADC);0 d9 D: g) L4 e/ G# g  Y$ i5 X
  rSUBSRCPND|=BIT_SUB_TC ;
3 A% [& j5 S7 G" W- C  //清adc中断  N1 d5 ]+ l  {0 V; [$ d! Q+ l
  Init_Touchpanel();! J+ q7 k4 b7 i: @4 Y
  //重新初始化触摸屏
* x' Z( @3 ^% ~3 S9 O, q& e  }2 s: }) t3 ]1 T& c; F# T( U7 K/ L
  2.检测在按下~弹起两个状态中间的x y坐标值 定时检测并更新坐标;
% j  L/ z- w/ P" v. ?( i) J  实现:/ `+ w5 a3 P5 U" R2 f* H8 w
  a 将adc 触摸屏接口设置为检测按下触摸笔中断;
( K' Y$ y7 N2 j# x& w  b 在adc按下触摸笔中断函数中 将adc的中断服务程序重新指定为弹起触摸笔中断函数;" i* C* I; c! K' n/ [$ t
  c 在adc按下触摸笔中断函数中 启动定时器定时进行ADC 采集XY坐标值 或在每次读取坐标值的时候进行ad转换 获取坐标值;
0 s& n: T0 L' v+ R6 C  d 在adc弹起触摸笔中断函数中 关闭定时器 停止采集x y坐标;
9 V# }& A- G% Z

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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