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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
硬件平台:TQ2440
9 [+ z" W# A1 |1 \6 j; U  触摸屏检测方法可以分两种:% W6 B4 P5 P( k) a6 c6 `
  1.检测按下、弹起两个状态时的x y坐标值;! A  d/ O" \8 I$ B* m, o. s
  以检测按下状态是读取x y坐标值为例 实现代码如下; z. f8 K: F* d7 U; C3 ?  C
  void Init_Touchpanel(void)0 {+ _( O5 f$ i( Y* t: q
  {$ Y( L9 ^2 {. v  h
  ClearPending(BIT_ADC);
: \. b0 a$ x3 {: }' h& o/ M  rSUBSRCPND|=BIT_SUB_TC ;! I4 r2 H& ?3 g% P6 D) I0 `
  //清adc中断 触摸屏中断9 E- ?' s% y0 B8 t9 L: I5 ?
  rADCDLY=40000; //ADC转换间隔 (1/3.6864M)*50000=13.56ms# Q) `" n9 v' i* {
  //Normal conversion mode:ADC Start or interval delay 0~65535( _# i4 `7 {' F
  rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value
$ ?  h9 ?3 C/ P1 K% _  //使能预分频器 预分频值 ADCPRS(9) AD转换器频率=gclk / (9+1)5 m* D0 {  ^1 e0 s+ H. \2 N9 v2 V6 f
  rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
8 W- K6 W, v$ f$ w  //ADC触摸屏控制寄存器 检测手写笔按下的中断信号 YM输出驱动有效 YP输出无效 XM输出禁止 XP输出驱动禁止
. G7 K% l* n4 G! M7 `: L  u  // XP上啦使能 adc正常转换模式 等待中断模式5 t7 u1 X& u6 C
  pISR_ADC = (int)AdcTsAuto;4 S* n: s( G2 S- c2 I
  //指定adc中断服务程序
6 }( Y3 h+ I) F. {  rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear
# G0 P* J% n' ]* G- _" ]  d$ E' r  rINTSUBMSK=~(BIT_SUB_TC);
& G5 W, ~' j. q) p  //使能中断 当触摸笔按下时 触发INT_TC中断2 i% B% |- y+ {  E
  }& j8 D- L! R9 _4 }5 f: ]9 B
  //触摸屏中断函数) V" D' b, a1 k+ L+ F. c* \
  void __irq AdcTsAuto(void)
! c  s* L- F+ N% y& x% i  G  {/ ~) o0 x) u* B# W0 B( b
  //ADCDAT0[15]==1 触摸笔未按下4 T4 k# E, C! W& C
  //ADCDAT0[15]==0 触摸笔按下
) p, \! d+ ]4 G- @; Q8 h" O$ j  if(rADCDAT0&0X8000)
/ ~) f1 E8 N& Z& S7 z" o6 y' {, i  return ;
: g" `+ i( e0 G0 y7 b1 o  rINTMSK |= (BIT_ADC);
5 H. F' @1 i: ~& g! {* p  //禁止adc中断, s( a# }/ w" ]% |# l% v* \
  rSUBSRCPND|=BIT_SUB_TC ;
6 o: i$ k0 L# G2 A  //禁止adc的子中断
. ]' ^1 L4 V7 O" ]  rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.6 }" Z4 e3 j, |& _( }
  //xp上拉禁止 自动顺序测量x y位置( d2 _9 z% d9 e" g9 z
  rADCCON|=0x1; //start ADC
! k8 x/ ?) e! D5 t3 p  while(rADCCON & 0x1); //check if Enable_start is low+ T& x; _" F6 b3 B; b: D$ |
  //adc一旦开始 将自动使ADCCON[0]=0
; d$ f0 K8 ?" u+ h  while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!' [/ K- j' e! Y
  //adc结束时,ADCCON[15]==1
0 m. E. V" R. Y" Q# ^% `; \* U  while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit
" k" V  r) @5 ]6 y( k- s  //等待ADC结束(不管后级中断是否传递 adc完成后 此处应该被置位)% S5 N/ I6 E  R3 ^/ ^: p# o
  point.x = (rADCDAT0&0x3ff);* ~% ~7 p) y% r! P( @
  point.y = (rADCDAT1&0x3ff);9 ^+ z! P; s' a* Q& a, R. z/ r
  //获取x y方向的adc值 更新坐标点2 b, a; n2 W- r( @) ~
  Uart_Printf("XP=%04d, YP=%04dn",point.x, point.y); //X-position Conversion data
6 i/ M6 ]+ `7 U' g- @; B" E6 g: s0 G  ClearPending(BIT_ADC);
) P% ~) r2 _. r  ~; n  rSUBSRCPND|=BIT_SUB_TC ;- q/ p/ G3 F1 ]7 k1 f
  //清adc中断
7 n+ L' a5 p0 e% A6 S8 l4 M  Init_Touchpanel();4 d6 X  _; f% X
  //重新初始化触摸屏
0 p) U& }4 X* \% M  }
" h- E- F$ M+ G2 O6 M  d  2.检测在按下~弹起两个状态中间的x y坐标值 定时检测并更新坐标;$ y% h* B( `! {' Q7 r
  实现:7 m) k2 @8 q" o5 _- U2 e
  a 将adc 触摸屏接口设置为检测按下触摸笔中断;
% G6 a, k: N( {  b 在adc按下触摸笔中断函数中 将adc的中断服务程序重新指定为弹起触摸笔中断函数;
( a% [; s8 B1 H; U/ {: E: k1 S  c 在adc按下触摸笔中断函数中 启动定时器定时进行ADC 采集XY坐标值 或在每次读取坐标值的时候进行ad转换 获取坐标值;' N' ?; o3 s! Y1 M# a  ^
  d 在adc弹起触摸笔中断函数中 关闭定时器 停止采集x y坐标;
8 e# \; ?+ y6 @6 k

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-30 05:11 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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