|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
硬件平台:TQ2440
* M/ d4 U7 D, g# O& s; |9 f9 F 触摸屏检测方法可以分两种:6 r3 x. |2 a* `" `7 b6 n
1.检测按下、弹起两个状态时的x y坐标值;
+ X8 G! C; e+ |. n9 @ 以检测按下状态是读取x y坐标值为例 实现代码如下- c$ j, P8 N# ~6 o& `6 X* V
void Init_Touchpanel(void)# v' U4 n1 H! e* T$ |" L
{8 x5 o4 G8 m# {. V2 _" l
ClearPending(BIT_ADC);9 o$ H* u3 ?/ j) y
rSUBSRCPND|=BIT_SUB_TC ;
$ }8 y) z2 B7 h" E8 P. c //清adc中断 触摸屏中断 N. c& ~+ {5 q5 w) |0 W
rADCDLY=40000; //ADC转换间隔 (1/3.6864M)*50000=13.56ms
; w- P' }2 D- p7 r //Normal conversion mode:ADC Start or interval delay 0~65535
- K: { w! E* |) U8 M rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value$ T+ W9 j' x% K, ^' u
//使能预分频器 预分频值 ADCPRS(9) AD转换器频率=gclk / (9+1)
# ^- n! V4 o3 X- D; | rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En; s5 D$ V. o$ Q1 E. p
//ADC触摸屏控制寄存器 检测手写笔按下的中断信号 YM输出驱动有效 YP输出无效 XM输出禁止 XP输出驱动禁止: \8 g1 ?5 r2 p6 M
// XP上啦使能 adc正常转换模式 等待中断模式& \1 o* O) J' N5 a1 p+ B% }; S% `
pISR_ADC = (int)AdcTsAuto;
K9 j1 s* ]* R7 ` //指定adc中断服务程序, m; c4 c: h h* h
rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear
& M7 d% N6 p, c1 r rINTSUBMSK=~(BIT_SUB_TC);/ t) {: u" Y3 r( B& q+ L
//使能中断 当触摸笔按下时 触发INT_TC中断3 j8 C: `' [2 X: ?9 |
}
/ w& x' N& a/ j5 y- D' E3 o //触摸屏中断函数
0 K8 b8 I g: z- { void __irq AdcTsAuto(void) F/ l" U0 H' y2 `2 ]) } t& S
{% r( W1 j j7 s: W; G# U" n
//ADCDAT0[15]==1 触摸笔未按下2 F! {, L# p& Z8 N# J
//ADCDAT0[15]==0 触摸笔按下
/ n+ c4 o b1 ?! q' m; |4 x if(rADCDAT0&0X8000)
9 b e+ q' C5 w return ;. a5 m% p. R1 {, r; }# N
rINTMSK |= (BIT_ADC);4 B1 z+ o5 a$ Z
//禁止adc中断
7 F' a7 i1 w. h7 `/ _4 j `* t9 g rSUBSRCPND|=BIT_SUB_TC ;
4 @! z- A2 N% E; H //禁止adc的子中断
) N/ s7 e' J) {! [ rADCTSC=(1<<3)|(1<<2); //Pull-up disable, Seq. X,Y postion measure.0 P: C# j, l0 c5 D; }
//xp上拉禁止 自动顺序测量x y位置
& K+ Q& b* u3 a% Y8 ? rADCCON|=0x1; //start ADC0 q5 d+ L& G0 z+ l6 g$ K: x
while(rADCCON & 0x1); //check if Enable_start is low" L \$ `$ i* x6 `- I
//adc一旦开始 将自动使ADCCON[0]=0# Y6 d) o9 A, q& x& U5 [+ v
while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!
1 D8 |- J) M& {5 @8 w. r0 x //adc结束时,ADCCON[15]==1
: H, Q5 m- r# R$ X7 ?7 y v% I while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit) t; n5 L1 [- K `
//等待ADC结束(不管后级中断是否传递 adc完成后 此处应该被置位)
# @% `5 [0 q& h point.x = (rADCDAT0&0x3ff);
, e( h s7 V1 l! h point.y = (rADCDAT1&0x3ff);( [8 h5 l" y6 ?3 W$ D7 W
//获取x y方向的adc值 更新坐标点
7 z% y* k3 W% J+ {) H Uart_Printf("XP=%04d, YP=%04dn",point.x, point.y); //X-position Conversion data
4 k* z9 r& g- h6 a) Z$ _ ClearPending(BIT_ADC);4 R' d/ h8 n/ I. L$ @, ~0 R
rSUBSRCPND|=BIT_SUB_TC ;9 `2 t- z% h) w) c/ H# y, Q
//清adc中断
: @ D% N: ?; r" X* o. v Init_Touchpanel();0 t' I6 _* A9 p& E( D& Q# ?
//重新初始化触摸屏
`: g# o5 q% R0 Y* q/ z# R2 K, a. G+ M }8 {4 l/ C( x7 p \' o. O& E
2.检测在按下~弹起两个状态中间的x y坐标值 定时检测并更新坐标;% Y6 {8 j4 u2 ~1 M
实现:9 C& e1 b: R4 `) A' l
a 将adc 触摸屏接口设置为检测按下触摸笔中断;
6 z) M! Y1 |, {& @, ^+ K% a b 在adc按下触摸笔中断函数中 将adc的中断服务程序重新指定为弹起触摸笔中断函数;
* w" d6 z7 `2 l( U c 在adc按下触摸笔中断函数中 启动定时器定时进行ADC 采集XY坐标值 或在每次读取坐标值的时候进行ad转换 获取坐标值;
% S3 t! {" H# [9 G5 n3 j* x( d d 在adc弹起触摸笔中断函数中 关闭定时器 停止采集x y坐标;
: w! h" [1 ^* ~* }' k z) y3 m) {+ v |
|