2440具体分析触摸屏实验代码(转)

来源:互联网 发布:健身运动软件app 编辑:程序博客网 时间:2024/06/15 06:57
具体分析触摸屏实验代码( 具体分析触摸屏实验代码(2)--实际应用代码分析 --实际应用代码分析 实际应用
经过对触摸屏寄存器及其相关原理的了解,今天通过实际代码的分析来掌握 如何玩转触摸屏。 首先我们先打开测试程序的Touchpanel.c 文件来分析触摸屏的 核 心 程 序 。 前 面 的 宏 定 义 等 先 不 管 , 后 面 用 到 再 看, 第 一 步 先 分 析 void Test_Touchpanel(void),程序如下: voidTest_Touchpanel(void) { rADCDLY=50000;rADCCON=(1<<14)+(ADCPRS<<6);Uart_Printf("\nTouch Screen test\n"); rADCTSC=0xd3; pISR_ADC =(int)AdcTsAuto; rINTMSK=~BIT_ADC; rINTSUBMSK=~(BIT_SUB_TC);Uart_Printf("\nPress any key to quit!\n"); Uart_Printf("\nStylusDown, please...... \n"); Uart_Getch(); rINTSUBMSK|=BIT_SUB_TC;rINTMSK|=BIT_ADC; Uart_Printf("Touch Screen Test isFinished!!!\n"); } 首先是 rADCDLY=50000;这里设定 ADCDLY 寄存器中 DELAY 为50000, 意 味着采样延迟时间是(1/3.6864M)*50000=13.56ms,即按下触摸屏再过 13.56ms 才能采样。rADCCON=(1<<14)+(ADCPRS<<6);这句代码是给ADCCON 赋值, 首先 1 左 移 14 位即第 15 位赋 1,我们通过 ADCCON 的第 15 位描述知道,是决定使用A/D 转换器时钟预分频,后面的 ADCPRS 我们通过宏定义#define ADCPRS 9 知 道 ADCPRS 是 1001,左移 6 位后 ADCCON[13:6]是 00001001, 即预分频系数是 9,A/D 时钟=PCLK/(9+1)。Uart_Printf("\nTouch Screen test\n");串口打印字符串 Touch Screen test。rADCTSC=0xd3;设置 ADCTSC 寄存器为 0xd3,前面 4 种工作模式的时候提ADCTSC[8:0]=011010011, 到, 这样设置是处于等待中断模式。 详细分析每一位, 第 9位按下时触摸屏控制器产生中断 (INT_TC) 信号,第 8 位 YM 驱动使能 (接地) ,第 7 位 YP 驱动使能,第 6 位XM 驱动禁止(高阻) ,第 5 位 XP 驱动 使能,第 4 位 XP 上拉使能,第 3 位设置为普通转换模式,第 2 位和第 1位 11 设置等待中断模式。第 5 位到第 8 位的设置原理可参考电阻触摸屏原理。 pISR_ADC =(int)AdcTsAuto; 设置 ADC 中断服务程序。 rINTMSK=~BIT_ADC; 开启 ADC 总中断。rINTSUBMSK=~(BIT_SUB_TC);开启 INT_TC 中断,即触摸屏按下或松开时 产生中断。Uart_Printf("\nPress any key to quit!\n");串口打印字符串 Press any key toquit!。 Uart_Printf("\nStylus Down, please...... \n");串口打印字符串。Uart_Getch();等串口输入。

rINTSUBMSK|=BIT_SUB_TC;和 rINTMSK|=BIT_ADC;这两句用来清中断。Uart_Printf("Touch Screen Test is Finished!!!\n");串口打印字符串。下面分析中断服务程序 void __irq AdcTsAuto(void),程序如下: void __irqAdcTsAuto(void) { U32 saveAdcdly;if(rADCDAT0&0x8000) {rADCTSC&=0xff; }rADCTSC=(1<<3)|(1<<2);saveAdcdly=rADCDLY; rADCDLY=40000; rADCCON|=0x1; while(rADCCON& 0x1); while(!(rADCCON & 0x8000));while(!(rSRCPND & (BIT_ADC)));xdata=(rADCDAT0&0

x3ff); ydata=(rADCDAT1&0x3ff);rSUBSRCPND|=BIT_SUB_TC; ClearPending(BIT_ADC);rINTSUBMSK=~(BIT_SUB_TC); rINTMSK=~(BIT_ADC); rADCTSC =0xd3;rADCTSC=rADCTSC|(1<<8); while(1) {if(rSUBSRCPND & (BIT_SUB_TC)) { break; } }Uart_Printf("count=d XP=d, YP=d\n", count++, xdata, ydata);rADCDLY=saveAdcdly;rADCTSC=rADCTSC&~(1<<8);rSUBSRCPND|=BIT_SUB_TC; rINTSUBMSK=~(BIT_SUB_TC);ClearPending(BIT_ADC); } 先来看if(rADCDAT0&0x8000)语句,先是判断 ADCDAT0 最高位是否为 1, 如果是 1与 0x8000 相与则 if 语句内部值肯定非 0,实际作用是判断是 Pen Down 中断还是 Pen Up 中断,如果是 PenUp 中断表示触碰完成,执行 if 语句下

rADCTSC&=0xff,用来设置笔尖落下的中断位。 接下来,如果 ADCDAT0 最高位为0,处于触摸屏按下状态,则继续执行rADCTSC=(1<<3)|(1<<2);来关闭XP 上拉,启动自动顺序 x/y 转换。 saveAdcdly=rADCDLY;将 rADCDLY 值保存。rADCDLY=40000; 重新设置 rADCDLY 为 40000。 rADCCON|=0x1; 开始 AD 转换。while(rADCCON & 0x1);开始后 Enable_start 会被清0,这里检测是否被清 0。 while(!(rADCCON & 0x8000));看最高位 ECFLG是否为 1,不为 1 继续等待, 目的是等待转换结束。 while(!(rSRCPND &(BIT_ADC)));查询 INT_ADC 中断,直到查到结束中断标志。xdata=(rADCDAT0&0x3ff); x,y 已经转换结束,读取 x 坐标数据。ydata=(rADCDAT1&0x3ff); x,y 已经转换结束,读取 y 坐标数据。 我们先来看ClearPending(BIT_ADC);到底是什么函数: __inline void ClearPending(int bit){ register i; rSRCPND = bit; rINTPND = bit; i = rINTPND; } 看到这我们知道ClearPending(BIT_ADC);相当于两个语句:rSRCPND = BIT_ADC;和 rINTPND =BIT_ADC;。这两条加上 rSUBSRCPND|=BIT_SUB_TC; 用来清除 INT_TC 中断。 后面两条rINTSUBMSK=~(BIT_SUB_TC);rINTMSK=~(BIT_ADC);前面已经分析过,是用来接着开中断,这一次设置等待弹起中断。 rADCTSC =0xd3;设置等待中断。rADCTSC=rADCTSC|(1<<8); 设置触笔抬起中断。下面这个 while(1)语句就是查询等待弹起中断标志,直到查到弹起跳出循环。 接下来的 Uart_Printf 输出坐标值。前面部分已经完成了一次触摸屏触摸检测并输出数据,后面剩下的语句就是
再次设置成按下中断,等待下一次按下动作。 到这里,所有程序分析完毕,也就大致知道如何设置触摸屏相关寄存器来工作了。

0 0
原创粉丝点击