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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
硬件平台:TQ2440# ~. @0 J& R2 C5 B8 y
  触摸屏检测方法可以分两种:7 @' B8 m$ w6 q  t) t7 G
  1.检测按下、弹起两个状态时的x y坐标值;4 r+ }! f; o6 Q) I/ _% v$ z7 ?
  以检测按下状态是读取x y坐标值为例 实现代码如下% K9 w: Z& X; N  }8 W4 i% h9 p
  void Init_Touchpanel(void)
, v2 a; q' B4 [/ J' m3 N  {
& M$ [9 B' [2 w. R+ I$ y  ClearPending(BIT_ADC);. d; ~- k7 s7 n; p+ k& R
  rSUBSRCPND|=BIT_SUB_TC ;
! J& O0 s4 X$ T9 e  //清adc中断 触摸屏中断
2 v' u- A4 p4 _  rADCDLY=40000; //ADC转换间隔 (1/3.6864M)*50000=13.56ms
0 r; O' _6 c; E7 ^, n  //Normal conversion mode:ADC Start or interval delay 0~65535
! X0 W0 G' @6 D# o5 ~  rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value, t2 T6 h+ L6 ?, Z
  //使能预分频器 预分频值 ADCPRS(9) AD转换器频率=gclk / (9+1)2 S3 I7 |- D* O! i
  rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
' }) T+ J& }/ x/ o$ V  //ADC触摸屏控制寄存器 检测手写笔按下的中断信号 YM输出驱动有效 YP输出无效 XM输出禁止 XP输出驱动禁止
! s+ y# {3 }2 a" p7 a8 x  // XP上啦使能 adc正常转换模式 等待中断模式- J# @  u& ^; ~7 F$ b& v
  pISR_ADC = (int)AdcTsAuto;
( S4 S, u, q# G  //指定adc中断服务程序3 ]) p% B! s$ `
  rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear7 Y0 Y8 l! X/ T7 F; U2 `
  rINTSUBMSK=~(BIT_SUB_TC);
$ L' p, c: W$ r  //使能中断 当触摸笔按下时 触发INT_TC中断
# S- }) s! R" j6 p/ u. d  }; o8 _, h, [- u2 w8 ?
  //触摸屏中断函数
1 R! p0 [% L- x* K+ E4 v  void __irq AdcTsAuto(void)/ f0 Q2 U# v, R  B+ U! T8 R! }2 L1 B, k
  {
& W4 B6 L, i/ i' I' a  //ADCDAT0[15]==1 触摸笔未按下
6 \" y% v5 V. X7 _* V# q$ g  //ADCDAT0[15]==0 触摸笔按下
! f" A8 N( W3 T) F- ^  if(rADCDAT0&0X8000)
% Y6 q9 U: ~9 `" [! t+ V0 i4 A- o8 b  T  return ;
6 y5 O3 D0 U: E+ R8 z% B  rINTMSK |= (BIT_ADC);( u, i/ R9 a" j
  //禁止adc中断
; i/ D$ h8 T& o( @+ k7 \8 T' H  rSUBSRCPND|=BIT_SUB_TC ;9 L  k2 }% G+ {$ ^& x8 c5 m4 _
  //禁止adc的子中断
8 D8 B0 r. h# u4 x) _+ q& l/ `* o6 x  rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.
- }9 S2 O1 {4 h' k  //xp上拉禁止 自动顺序测量x y位置
# b% v* U, x5 [2 N& \- i  rADCCON|=0x1; //start ADC
, I1 f; O! {( @7 L: A' [1 N3 [! _  while(rADCCON & 0x1); //check if Enable_start is low" \* H9 }) W* W' ?4 v7 N  K
  //adc一旦开始 将自动使ADCCON[0]=0
: ^- L3 R) P( W1 v  while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
9 z( F+ h, F' f: K9 ]4 C  //adc结束时,ADCCON[15]==1
6 z" U  L( ?7 @  while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit
; F9 F8 V8 F, i  //等待ADC结束(不管后级中断是否传递 adc完成后 此处应该被置位)+ q3 x  s: @. [& e7 J
  point.x = (rADCDAT0&0x3ff);6 x) m/ ?  O% b/ ], d
  point.y = (rADCDAT1&0x3ff);
, T: R) R4 X! ?/ J9 `2 q9 b  //获取x y方向的adc值 更新坐标点5 W) Z' w( ?5 a! ]
  Uart_Printf("XP=%04d, YP=%04dn",point.x, point.y); //X-position Conversion data
; s9 H* C8 Z% P, S5 t6 N/ H  ClearPending(BIT_ADC);
2 R  P+ b/ S$ X# w  rSUBSRCPND|=BIT_SUB_TC ;
$ P1 Y, `9 u/ V  //清adc中断
+ v) R* M* C" p- {  Init_Touchpanel();
. m! G8 L  M6 C& b" }9 t1 O  ^  //重新初始化触摸屏4 U8 \  |- W# N
  }
6 |3 p6 b' k6 u8 ~5 ?  2.检测在按下~弹起两个状态中间的x y坐标值 定时检测并更新坐标;
: O% M1 M- W! s5 l+ F8 U+ u  实现:4 i7 U* Y5 {$ j/ ?5 H. t! N
  a 将adc 触摸屏接口设置为检测按下触摸笔中断;9 M) ~8 b2 f% b4 _3 d" N
  b 在adc按下触摸笔中断函数中 将adc的中断服务程序重新指定为弹起触摸笔中断函数;+ d: I  F1 b* t9 U* U" C
  c 在adc按下触摸笔中断函数中 启动定时器定时进行ADC 采集XY坐标值 或在每次读取坐标值的时候进行ad转换 获取坐标值;
$ A6 K- T/ j) k2 a, r- M- V6 P  d 在adc弹起触摸笔中断函数中 关闭定时器 停止采集x y坐标;
# H  K7 ?  L# q4 |0 }  U& `

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 18:09 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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