|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
硬件平台:TQ2440
& g1 ~9 e7 n. z3 L' l% o. G9 c 触摸屏检测方法可以分两种:1 b, d$ _. B" ^' D
1.检测按下、弹起两个状态时的x y坐标值;: y9 A* Q4 V5 l5 W& u3 N* ?
以检测按下状态是读取x y坐标值为例 实现代码如下
' n0 g, v, K2 N( j1 O9 n void Init_Touchpanel(void)/ t: H* y& P7 C8 V _
{
; b$ G b9 ^& E. y. f ClearPending(BIT_ADC);
/ W7 E9 _, U* x H- H% d3 K rSUBSRCPND|=BIT_SUB_TC ;
- {( q: E" N* d" B! r) n //清adc中断 触摸屏中断
# \& _9 G. |' ~ rADCDLY=40000; //ADC转换间隔 (1/3.6864M)*50000=13.56ms# v# e7 E( M9 @1 }6 r9 s# b9 C7 ]8 T
//Normal conversion mode:ADC Start or interval delay 0~655350 T& ^3 Z% Y+ z" k- o. _; m
rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value
3 v3 p3 d1 e7 k3 x7 P! E //使能预分频器 预分频值 ADCPRS(9) AD转换器频率=gclk / (9+1)' |$ `7 R: e. O: S
rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En# i% o$ x% k2 l) R1 B( B
//ADC触摸屏控制寄存器 检测手写笔按下的中断信号 YM输出驱动有效 YP输出无效 XM输出禁止 XP输出驱动禁止( q/ W/ A% B- q# B6 \
// XP上啦使能 adc正常转换模式 等待中断模式+ T; Z6 O4 D" H6 ~+ u$ l
pISR_ADC = (int)AdcTsAuto;* o" K( I9 d* \
//指定adc中断服务程序/ g! Z' u9 ^6 l3 T
rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear
% D1 v" k, l" T; b- t: X rINTSUBMSK=~(BIT_SUB_TC);- `: h3 {. k% n7 I" d9 N* b
//使能中断 当触摸笔按下时 触发INT_TC中断4 O0 d) ` r' E* `& G- F5 \$ W
}& X0 p& |2 d6 k4 b% e/ O
//触摸屏中断函数; A4 Q6 b! Z& W) c
void __irq AdcTsAuto(void)
( a( R4 g1 y6 L0 f. O7 [ {
" s* S# I2 E6 `, [1 } //ADCDAT0[15]==1 触摸笔未按下
! ^1 s: i# i! R" U+ i7 z! ^9 _; e //ADCDAT0[15]==0 触摸笔按下( e: M/ K, @5 j& |) M3 f+ N# f5 J o
if(rADCDAT0&0X8000)6 L! |8 G: _; r1 _# |
return ;/ a/ F6 N& @$ B9 J2 f( ?: J
rINTMSK |= (BIT_ADC);( w6 E4 `; Q3 I. a5 Y
//禁止adc中断( h6 @/ _$ i/ S, O+ a8 z y! M* Q$ A
rSUBSRCPND|=BIT_SUB_TC ;" V( q/ D: p: {/ w3 V" W6 j H
//禁止adc的子中断% Z0 e2 r; R6 R- G. i! Y$ n
rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.
& y" m ?( \. V# N6 M' U //xp上拉禁止 自动顺序测量x y位置
' z* v9 w7 M1 |# E _ rADCCON|=0x1; //start ADC* c4 k) {! x: h+ Y+ T8 L. g$ E9 l
while(rADCCON & 0x1); //check if Enable_start is low, z) ^8 N$ g* o0 J3 l( Q) p
//adc一旦开始 将自动使ADCCON[0]=0
/ Z9 T' ^1 Z7 ]2 y3 |& u while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
E" ^+ d6 \/ q2 X# @6 o: j //adc结束时,ADCCON[15]==1
1 Y/ N0 z9 X$ t* ~$ s while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit
, F1 n# ?7 N; z1 G8 r( H. Q' @ //等待ADC结束(不管后级中断是否传递 adc完成后 此处应该被置位), w) }- o8 m( w
point.x = (rADCDAT0&0x3ff);' W% S9 c8 @; z
point.y = (rADCDAT1&0x3ff);
3 Y3 @# \3 s4 }/ X$ U8 f //获取x y方向的adc值 更新坐标点' O# o5 T, Y- T( [" J7 u
Uart_Printf("XP=%04d, YP=%04dn",point.x, point.y); //X-position Conversion data
8 V. L9 `7 ^. u2 C. R ClearPending(BIT_ADC);0 F+ j+ ~; w$ n+ R, j
rSUBSRCPND|=BIT_SUB_TC ;% i) _+ i2 q) E6 F
//清adc中断! a$ D# w" _2 y: y3 V: D$ \
Init_Touchpanel();
6 [, ^' F# m& N4 M1 f //重新初始化触摸屏* Z. {- O4 P ]- F, ?
}! ~8 l7 h" ?% N9 [
2.检测在按下~弹起两个状态中间的x y坐标值 定时检测并更新坐标;" L. H5 `1 Q! b/ Q/ M' ^0 }$ |
实现:
+ E2 O7 Z/ Q% Z7 z- P a 将adc 触摸屏接口设置为检测按下触摸笔中断;) y( R& I1 d* ]
b 在adc按下触摸笔中断函数中 将adc的中断服务程序重新指定为弹起触摸笔中断函数;
' ?" L% _$ O& @' f8 C6 E6 `3 Y c 在adc按下触摸笔中断函数中 启动定时器定时进行ADC 采集XY坐标值 或在每次读取坐标值的时候进行ad转换 获取坐标值;
+ g+ D" [3 H) B7 A$ f( O! J d 在adc弹起触摸笔中断函数中 关闭定时器 停止采集x y坐标;* u; r2 c& }7 {: `
|
|