|
|
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 \. ? |
|