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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
硬件平台:TQ2440
6 E! x1 K/ ?8 L. W  [- h  触摸屏检测方法可以分两种:
- L( z, ^; R+ Q3 o- _2 m  1.检测按下、弹起两个状态时的x y坐标值;
# I! u- A) z' V/ w+ d  以检测按下状态是读取x y坐标值为例 实现代码如下% a  v/ m4 w9 `6 G! \% h1 G  z
  void Init_Touchpanel(void)4 t  y6 J0 E- K3 q# S
  {: p: \  s! H' [# J& Z) P: M; h
  ClearPending(BIT_ADC);
7 P7 V" C  Y" a6 L# `5 |; B  rSUBSRCPND|=BIT_SUB_TC ;
- e. F+ u/ ]1 E+ E" u" A5 J6 y  //清adc中断 触摸屏中断; s  w7 k6 K# n8 k( Y
  rADCDLY=40000; //ADC转换间隔 (1/3.6864M)*50000=13.56ms/ L# [" W. O. H* ], ?. x9 Y" {
  //Normal conversion mode:ADC Start or interval delay 0~65535
9 S9 J) f; ^5 C% L5 `+ ~! {+ S' f  rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value
, r7 g, J/ C! e; k0 d: w  //使能预分频器 预分频值 ADCPRS(9) AD转换器频率=gclk / (9+1)
. k& h' P# \) f: Z' C  rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En3 j+ ?4 D. c0 [; B
  //ADC触摸屏控制寄存器 检测手写笔按下的中断信号 YM输出驱动有效 YP输出无效 XM输出禁止 XP输出驱动禁止
& m: h/ r8 B: T: Z- ^$ I- i0 s+ X  // XP上啦使能 adc正常转换模式 等待中断模式
& u+ j) c, E( [) G6 W! z* L$ k  pISR_ADC = (int)AdcTsAuto;: R$ k- N, y6 i" z; S. B
  //指定adc中断服务程序
, ?* ^: _: m9 u% Z  rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear5 ^# S) b3 I; g, Y& W, [2 L
  rINTSUBMSK=~(BIT_SUB_TC);- T4 \, N+ g( p3 J
  //使能中断 当触摸笔按下时 触发INT_TC中断
" N9 d6 ^3 {& S9 n  }' [6 W8 |1 W5 [3 u4 a/ f
  //触摸屏中断函数$ X( }9 c2 o1 F! l8 ?! e4 _
  void __irq AdcTsAuto(void)6 M9 e, \$ D  t7 j" t1 s4 G
  {
: z+ q- \) V6 m5 l" w0 C  //ADCDAT0[15]==1 触摸笔未按下
+ Z" g6 M+ L) I  //ADCDAT0[15]==0 触摸笔按下
0 p3 _) D+ b( p, |$ w( D" _# A  if(rADCDAT0&0X8000)
# k2 G  \3 Y; D9 `  Z/ e  return ;
% E5 x' f' E. I+ Y, ^  rINTMSK |= (BIT_ADC);! {6 J* h: @% p; Q6 M2 c
  //禁止adc中断
1 R7 M, d; J7 n  rSUBSRCPND|=BIT_SUB_TC ;
) i9 R- g$ z) s8 v2 M" d  //禁止adc的子中断, x* b2 I5 ]9 {1 p0 i3 Y$ n$ h
  rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.
% a& ~# d; ?7 H: M: w( h$ j9 ]  //xp上拉禁止 自动顺序测量x y位置1 I5 t) Z5 R/ x- T: S+ G+ f: }7 T
  rADCCON|=0x1; //start ADC, Z& n3 C! @. |% ^; E
  while(rADCCON & 0x1); //check if Enable_start is low  ~9 ~9 T) w# t6 q' P! v
  //adc一旦开始 将自动使ADCCON[0]=0
) N2 Y( x, D2 _' p  while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
: O9 {9 b% K. }  //adc结束时,ADCCON[15]==15 j9 E9 c7 d5 ~* J2 o
  while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit
2 n! X3 r; O2 {8 J  //等待ADC结束(不管后级中断是否传递 adc完成后 此处应该被置位)
! u+ D; g) _1 B* d4 Q1 h  point.x = (rADCDAT0&0x3ff);
% d6 |% B6 n. o; E7 r  point.y = (rADCDAT1&0x3ff);9 y* N" \+ K! `
  //获取x y方向的adc值 更新坐标点
# v. P; x& |) g2 ^: g4 m+ M+ I% E  Uart_Printf("XP=%04d, YP=%04dn",point.x, point.y); //X-position Conversion data
' Q( z  ]* z  B2 r- x- T  ClearPending(BIT_ADC);
4 w- ^9 \# v# u" P- Z  rSUBSRCPND|=BIT_SUB_TC ;
4 `. d5 ~9 H" l  ^  //清adc中断2 s  {2 P# G4 ~# i' x* T
  Init_Touchpanel();- u) h9 _( @% w
  //重新初始化触摸屏
/ J7 \6 d% x2 D+ f& d  }* C7 N+ j) ?7 s9 J* b
  2.检测在按下~弹起两个状态中间的x y坐标值 定时检测并更新坐标;
1 x" u  ^4 p+ R% V$ T# W  实现:
* C! c% `8 L( {  a 将adc 触摸屏接口设置为检测按下触摸笔中断;- v7 P- K9 H2 f' ]7 P  ?
  b 在adc按下触摸笔中断函数中 将adc的中断服务程序重新指定为弹起触摸笔中断函数;
1 c  J( k" v9 l& |" t& c  c 在adc按下触摸笔中断函数中 启动定时器定时进行ADC 采集XY坐标值 或在每次读取坐标值的时候进行ad转换 获取坐标值;
) O) _  a: Q1 P, r  d 在adc弹起触摸笔中断函数中 关闭定时器 停止采集x y坐标;
4 x, {7 Q' q5 }6 \. ?

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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