2440支持8 通道10 位ADC 和触摸屏接口
|
XP
|
XM
|
YP
|
YM
|
X Position
|
External Voltage
|
GND
|
AIN[5]
|
Hi-Z
|
Y Position
|
AIN[7]
|
Hi-Z
|
External Voltage
|
GND
|
|
XP
|
XM
|
YP
|
YM
|
X Position
|
External Voltage
|
GND
|
AIN[5]
|
Hi-Z
|
Y Position
|
AIN[7]
|
Hi-Z
|
External Voltage
|
GND
|
|
XP
|
XM
|
YP
|
YM
|
Waiting for Interrupt
|
Pull UP
|
Hi-z
|
AIN[5]
|
GND
|
- #include "uart.h"
- #include "2440addr.h"
- #include "def.h"
- #define ADCPRS 9
- int count=0;
- volatile int xdata, ydata;
- void __irq AdcTsAuto(void) //进入中断,进行转换,每触摸一下屏幕,就进入该函数,进行A/D转换
- { //这就是中断处理函数的深意
- //一个触摸中断为:触摸笔按下到触摸笔抬起,不抬起的话,中断就没结束
- rADCTSC=(1<<3)|(1<<2)|(0<<0); //XP上拉禁止,自动连续XY坐标转换模式开启,清XY_PST
-
- rADCDLY=40000; //重设等待转换测量时间
-
- rADCCON|=0x1; //start ADC
- while(rADCCON & 0x1); //检测ADC转换是否开始,开始后,该位会被自动清零
- while(!(rADCCON & 0x8000)); //等待转换结束,可以读取转换后的数值了
-
- while(!(rSRCPND & (BIT_ADC))); //判断ADC的中断悬挂位,若为1,则说明该中断已经长生,可以处理按下的数据了
- xdata=(rADCDAT0&0x3ff); //读取X方向的转换数值 //ADCDAT为状态寄存器
- ydata=(rADCDAT1&0x3ff); //读取Y方向的转换数值
-
- 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=%03d XP=%04d, YP=%04d\n", count++, xdata, ydata);//X-position Conversion data
- rADCDLY=50000; //延时,等待串口输出
- rADCTSC=rADCTSC&~(1<<8); //重新设为触摸笔按下中断,为下次的触摸做准备
- rSUBSRCPND|=BIT_SUB_TC; //清除中断标志
- rINTSUBMSK=~(BIT_SUB_TC); //重新开启中断
- ClearPending(BIT_ADC);
- }
- void Test_Touchpanel(void)
- {
-
- rADCDLY=50000; //设置等待转换测量时间
- rADCCON=(1<<14)+(ADCPRS<<6); //预分频使能,值为9
- //A/D 转换器频率 = PCLK / (预分频值+1)
- //转换时间 = 1/(AD转换频率/ 5 周期)
- Uart_Printf("ADC touch screen test\n");
- //设为等待中断模式
- rADCTSC=0xd3; //设为笔尖落下中断
-
- pISR_ADC = (int)AdcTsAuto;//并联中断处理程序
- rINTMSK=~BIT_ADC; //ADC总中断开启
- rINTSUBMSK=~(BIT_SUB_TC);//ADC触摸屏子中断开启
- Uart_Printf("\nType any key to exit!!!\n");
- Uart_Printf("\nTouch Screen Down, please...... \n");
- Uart_Getch(); //该函数旨在等待用户的触摸,然后触发中断,并不其他实质意义,其实为等待触摸中断
- //直到用户从键盘随便输入一个字符后,结束该死循环,然后往下执行
- rINTSUBMSK|=BIT_SUB_TC; //关闭ADC触摸屏子中断
- rINTMSK|=BIT_ADC; //关闭ADC总中断
- Uart_Printf("Touch Screen Test is Finished!!!\n");
- }