|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
硬件平台:TQ2440. f! ^, h, g0 y0 D* m5 x. o
触摸屏检测方法可以分两种:
- s0 G# X! a6 d ?# q 1.检测按下、弹起两个状态时的x y坐标值;
& m: b& W5 x/ q0 ~5 M; J 以检测按下状态是读取x y坐标值为例 实现代码如下& u6 z8 D2 M X" \
void Init_Touchpanel(void)1 P c- X* n D4 Q7 E: ?
{3 ?3 v& f% N( t: l+ \2 z/ ^4 p
ClearPending(BIT_ADC);% n9 Z$ P0 }+ {/ q0 ?
rSUBSRCPND|=BIT_SUB_TC ;/ \5 T6 c j( }* _4 W
//清adc中断 触摸屏中断8 j7 k3 j! z! s3 e" f
rADCDLY=40000; //ADC转换间隔 (1/3.6864M)*50000=13.56ms2 V9 t+ @. ]0 d/ @2 y. J
//Normal conversion mode:ADC Start or interval delay 0~65535
% W' U( X* y1 ^ B rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value
3 v: s0 j7 g9 k4 W: o //使能预分频器 预分频值 ADCPRS(9) AD转换器频率=gclk / (9+1)* l0 w6 G7 p) A! h4 Z
rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
$ V1 h: J. J9 J0 E3 M* W" t //ADC触摸屏控制寄存器 检测手写笔按下的中断信号 YM输出驱动有效 YP输出无效 XM输出禁止 XP输出驱动禁止
! u3 L) Z m/ k8 [ // XP上啦使能 adc正常转换模式 等待中断模式- \4 r7 ^" S; l+ D
pISR_ADC = (int)AdcTsAuto;
' w- U5 s( i- H4 K; m //指定adc中断服务程序9 \, d6 f% D- R$ q9 o8 r3 v* b
rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear5 ~! c8 l, @4 l: c. I6 F5 u* c
rINTSUBMSK=~(BIT_SUB_TC);
' @6 ~2 p p7 R2 H6 |1 {1 J //使能中断 当触摸笔按下时 触发INT_TC中断9 c, y2 V. v. v1 M! ^7 h9 r
}
: D3 j$ n, `6 [ //触摸屏中断函数% [4 |6 K: h, D& a' h
void __irq AdcTsAuto(void)
$ `; D2 Q6 Q( N0 j {
) B# k1 t3 v- _" z //ADCDAT0[15]==1 触摸笔未按下
4 X# P! f {' k: R' V //ADCDAT0[15]==0 触摸笔按下, p. J8 B0 D9 A7 u
if(rADCDAT0&0X8000)8 \8 P& u% l% Y. H% R+ @
return ;
: K( V5 j9 `1 ~4 _) R* l rINTMSK |= (BIT_ADC);: f4 m. o, \! d0 y$ K, H
//禁止adc中断3 _! r6 `6 i- L& v4 X
rSUBSRCPND|=BIT_SUB_TC ;8 d6 M# C( F& E; p
//禁止adc的子中断 H7 |8 r! E7 \2 o
rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.( Y) Q# Z7 O. h; ^9 `& r
//xp上拉禁止 自动顺序测量x y位置
( Z4 _* R! ]5 G rADCCON|=0x1; //start ADC
1 |4 c d6 j. m8 T- J! X O. j while(rADCCON & 0x1); //check if Enable_start is low
$ v# y, M; a* \: l7 ` //adc一旦开始 将自动使ADCCON[0]=0
5 f5 H( Z1 J1 ^4 `; O B while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
. u3 O& H" N! s$ Y" G: }" H# J //adc结束时,ADCCON[15]==1) [( a% }1 h; {4 b' P1 A4 V: s
while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit. w% H& @2 f( o* j- v. c. Z& g
//等待ADC结束(不管后级中断是否传递 adc完成后 此处应该被置位)
2 _; M6 d8 M2 a9 S7 t; m point.x = (rADCDAT0&0x3ff);
' z/ X: Q" i1 J. h. |$ f/ G4 i3 C point.y = (rADCDAT1&0x3ff);" q/ @0 y/ F( z& X: p
//获取x y方向的adc值 更新坐标点
' m5 t. J' {& [3 Z2 a% G' g Uart_Printf("XP=%04d, YP=%04dn",point.x, point.y); //X-position Conversion data, o7 |6 e V7 Y/ _* J% d- {4 v
ClearPending(BIT_ADC);
. X# }$ p% g" P" J rSUBSRCPND|=BIT_SUB_TC ;7 u' }4 g" U; n; X+ R, B; Z
//清adc中断
; ~2 y, L+ ~' t( E1 L% t Init_Touchpanel();
) O1 i$ a2 L5 q$ o9 l //重新初始化触摸屏( R7 z K. }+ W
}3 n1 `% f! S& X( b& p, P7 d
2.检测在按下~弹起两个状态中间的x y坐标值 定时检测并更新坐标;. e) u, B5 i1 J- t6 D
实现:
: O/ r( c2 V4 m/ f) p9 { a 将adc 触摸屏接口设置为检测按下触摸笔中断;! J3 q% v) Z$ j0 K! V9 G4 Y
b 在adc按下触摸笔中断函数中 将adc的中断服务程序重新指定为弹起触摸笔中断函数;
* h; y2 G# j6 l0 U! F c 在adc按下触摸笔中断函数中 启动定时器定时进行ADC 采集XY坐标值 或在每次读取坐标值的时候进行ad转换 获取坐标值;
$ Q2 F+ A7 X2 c: Z# H d 在adc弹起触摸笔中断函数中 关闭定时器 停止采集x y坐标;$ E5 R; t; L1 W4 X
|
|