DX能否帮我分析下这段TouchScreen的代码操作流程 ?<br /><br />/*****************************************<br /> NAME: Touchpanel.c<br /> DESC: ADC & Touch screen test<br /> HISTORY:<br /> 2003.09.23:Leon YH KIM: draft ver 1.0<br />*****************************************/<br />#include "def.h"<br />#include "2440addr.h"<br />#include "2440lib.h"<br /><br /><br />#define REQCNT 30<br />#define ADCPRS 9 //YH 0627<br />#define LOOP 1<br /><br />void __irq AdcTsAuto(void);<br /><br />int count=0;<br />volatile int xdata, ydata;<br /> <br />void Test_Touchpanel(void)<br />{<br /> <br /> rADCDLY=50000; //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms<br /> //Touch down to conversion delay time width , X coordinate & Y coordinate conversion time width setting <br /> rADCCON=(1<<14)+(ADCPRS<<6); //ADCPRS En, ADCPRS Value<br /> // A/D converter prescaler enable , PRSCVL value setting , A/D Frequency = PCLK / (PRSCVL + 1)<br /> Uart_Printf("ADC touch screen test
");<br /><br /> rADCTSC=0xd3; //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En<br /> //Detect stylus down interrupt signal , YM Enable , YP Disable , XM Disable, XP Disable , XP Pull-up enable , Normal ADC Conversion , Waiting for interrupt mode <br /> pISR_ADC = (int)AdcTsAuto;//将中断处理程序名放入中断向量表中对应地址<br /> //<br /> rINTMSK=~BIT_ADC; //ADC Touch Screen Mask bit clear<br /> rINTSUBMSK=~(BIT_SUB_TC);//Touch Screen Mask bit clear<br /><br /> Uart_Printf("
Type any key to exit!!!
");<br /> Uart_Printf("
Stylus Down, please......
");<br /> Uart_Getch();<br /><br /> rINTSUBMSK|=BIT_SUB_TC;//Touch Screen Mask bit set<br /> rINTMSK|=BIT_ADC;//ADC Touch Screen Mask bit set<br /> Uart_Printf("Touch Screen Test is Finished!!!
");<br /><br />}<br /><br /><br />void __irq AdcTsAuto(void)<br />{<br /> int i;<br /> U32 saveAdcdly;<br /><br /> if(rADCDAT0&0x8000)//判断 updown bit ,如果提起则<br /> {<br /> //Uart_Printf("
Stylus Up!!
");<br /> rADCTSC&=0xff; // Set stylus down interrupt bit<br /> }<br /> //else <br /> //Uart_Printf("
Stylus Down!!
");<br /><br /> rADCTSC=(1<<3)|(1<<2); //XP Pull-up disable, Seq. X,Y postion measure.<br /> saveAdcdly=rADCDLY;<br /> rADCDLY=40000; //Normal conversion mode delay about (1/50M)*40000=0.8ms<br /><br /> rADCCON|=0x1; //start ADC AD转换开始且该位在开始后清零<br /><br /> while(rADCCON & 0x1); //check if Enable_start is low<br /> while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high, This line is necessary~!!<br /> <br /> while(!(rSRCPND & (BIT_ADC))); //check if ADC is finished with interrupt bit<br /><br /> xdata=(rADCDAT0&0x3ff);<br /> ydata=(rADCDAT1&0x3ff);<br /><br /> //YH 0627, To check Stylus Up Interrupt.<br /> rSUBSRCPND|=BIT_SUB_TC;//<br /> ClearPending(BIT_ADC);//<br /> rINTSUBMSK=~(BIT_SUB_TC);//<br /> rINTMSK=~(BIT_ADC);//<br /> <br /> rADCTSC =0xd3; //Waiting for interrupt<br /> rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.<br /><br /> while(1) //to check Pen-up state<br /> {<br /> if(rSUBSRCPND & (BIT_SUB_TC)) //check if ADC is finished with interrupt bit<br /> {<br /> //Uart_Printf("Stylus Up Interrupt~!
");<br /> break; //if Stylus is up(1) state<br /> }<br /> } <br /><br /> Uart_Printf("count=%03d XP=%04d, YP=%04d
", count++, xdata, ydata); //X-position Conversion data <br /><br /> rADCDLY=saveAdcdly; <br /> rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.<br /> rSUBSRCPND|=BIT_SUB_TC;<br /> rINTSUBMSK=~(BIT_SUB_TC); // Unmask sub interrupt (TC) <br /> ClearPending(BIT_ADC);<br />}<br /><br /><br />自己看单句还基本看明白了,可整个流程不了解,如果我要多次采集一个点,又该如何处理呢,有没有裸奔玩触摸屏的朋友指导一二 .... |
|