|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
硬件平台:TQ2440! U4 G6 z+ `" t+ i1 ~! ?8 v8 F
触摸屏检测方法可以分两种:
+ ^: N# l8 o1 m 1.检测按下、弹起两个状态时的x y坐标值;- g9 _, G( r: H0 j+ T5 k
以检测按下状态是读取x y坐标值为例 实现代码如下4 G) n, Z0 ?6 H5 `/ P
void Init_Touchpanel(void)1 x7 @, f1 n' L* P
{
; } a0 k+ }4 N) n; ^; V- K* ?7 }! O ClearPending(BIT_ADC);
$ A i( B) @: L! | rSUBSRCPND|=BIT_SUB_TC ;
; |) o$ O# J/ q+ c+ A //清adc中断 触摸屏中断
7 A% U$ c ]" S" p3 o- f rADCDLY=40000; //ADC转换间隔 (1/3.6864M)*50000=13.56ms
* K4 N& l9 ^' _' e# y //Normal conversion mode:ADC Start or interval delay 0~65535
; B4 Z( C# h& u" N6 W' I rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value6 X& n" s8 m6 I# r: y8 }
//使能预分频器 预分频值 ADCPRS(9) AD转换器频率=gclk / (9+1)$ L4 O( |: @! {$ C( ?0 d
rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En% C% U$ Q8 p/ }2 A9 m# N3 w9 l- z
//ADC触摸屏控制寄存器 检测手写笔按下的中断信号 YM输出驱动有效 YP输出无效 XM输出禁止 XP输出驱动禁止
4 [$ _+ }6 X# R+ q4 C. g7 V/ J // XP上啦使能 adc正常转换模式 等待中断模式
) L8 n+ ]4 }% p3 k: W pISR_ADC = (int)AdcTsAuto;3 j2 z f D5 R3 K
//指定adc中断服务程序
$ `- H+ B) O* b; {% r rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear: p( b; {2 A9 s% q
rINTSUBMSK=~(BIT_SUB_TC);
2 b! u% ~) f/ H //使能中断 当触摸笔按下时 触发INT_TC中断; Q9 f6 m4 Q2 G: H$ ?2 O' _
}
0 \! U* y" ~ C9 Z0 V) @ //触摸屏中断函数5 \" H+ y+ N# x% U7 y+ w
void __irq AdcTsAuto(void)4 D( H7 [/ `4 t6 n3 Z3 H, s! x V
{/ I# j' a5 K* ]/ l- i$ x0 |: [
//ADCDAT0[15]==1 触摸笔未按下
/ x% c- z4 u1 k/ s( ~& q //ADCDAT0[15]==0 触摸笔按下6 T/ I8 @" A: b; L/ D: I4 d
if(rADCDAT0&0X8000)- @ r0 I6 l6 w% {5 g
return ;
/ x- L% z) J& R8 A v6 h, |; v rINTMSK |= (BIT_ADC);
4 i/ D4 b! U0 ]/ n8 r: {! t //禁止adc中断* ]- ?0 d# j7 z& K* N+ D
rSUBSRCPND|=BIT_SUB_TC ;
3 o1 Z& y6 `" y% _$ B( n/ f //禁止adc的子中断
& w; [2 a; P2 }8 q" O+ f( W rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.
\( P3 T, z! q' ]& O8 Q5 } //xp上拉禁止 自动顺序测量x y位置
! g* W+ W t J rADCCON|=0x1; //start ADC- A1 _' ]2 Q- e( X
while(rADCCON & 0x1); //check if Enable_start is low- r+ M0 |5 F* Y# m, @7 j
//adc一旦开始 将自动使ADCCON[0]=0, {" g- O7 G" [1 O
while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
, m0 G+ L6 d2 O //adc结束时,ADCCON[15]==1& u* }6 ]0 T. m% s$ h
while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit
9 T! [6 J N7 V' J8 ?% h //等待ADC结束(不管后级中断是否传递 adc完成后 此处应该被置位)8 k$ X8 u# {# {; \! B8 c$ T. w
point.x = (rADCDAT0&0x3ff);
) ?1 P* x: V* p( d5 C d point.y = (rADCDAT1&0x3ff);
% s& e' \. T5 }( f f0 c' a0 M //获取x y方向的adc值 更新坐标点* G, f( D6 H; U/ s9 b& T
Uart_Printf("XP=%04d, YP=%04dn",point.x, point.y); //X-position Conversion data
: o- v1 {5 q. r! x ClearPending(BIT_ADC);
. @" z @& {, B rSUBSRCPND|=BIT_SUB_TC ;
V* Q$ D& v: g //清adc中断
( b* K# F. z/ a! q/ c& Q J7 i Init_Touchpanel();' B( _3 j. _- H! M4 g1 K( s* u
//重新初始化触摸屏
/ D$ V' ~; A1 ~* J }9 J6 b4 V9 R5 r8 }5 O
2.检测在按下~弹起两个状态中间的x y坐标值 定时检测并更新坐标;
4 Y2 C7 N& W0 A: i 实现:
% ]5 z" [, a4 D8 [! l% O a 将adc 触摸屏接口设置为检测按下触摸笔中断;
# g, k2 I; _" H& Q3 f, | b 在adc按下触摸笔中断函数中 将adc的中断服务程序重新指定为弹起触摸笔中断函数;
% Y& C! O) n; Y2 W c 在adc按下触摸笔中断函数中 启动定时器定时进行ADC 采集XY坐标值 或在每次读取坐标值的时候进行ad转换 获取坐标值;
5 V3 ]+ |5 T, O0 Q8 b d 在adc弹起触摸笔中断函数中 关闭定时器 停止采集x y坐标;
" z: U5 `& y1 O- w |
|