主题 : DX能否帮我分析下这段TouchScreen的代码操作流程 ? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 6100
精华: 0
发帖: 14
金钱: 110 两
威望: 46 点
综合积分: 28 分
注册时间: 2009-05-20
最后登录: 2013-04-13
楼主  发表于: 2009-05-22 09:23

 DX能否帮我分析下这段TouchScreen的代码操作流程 ?

/*****************************************
  NAME: Touchpanel.c
  DESC: ADC & Touch screen test
  HISTORY:
  2003.09.23:Leon YH KIM: draft ver 1.0
*****************************************/
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"


#define REQCNT 30
#define ADCPRS 9    //YH 0627
#define LOOP 1

void __irq AdcTsAuto(void);

int count=0;
volatile int xdata, ydata;
    
void Test_Touchpanel(void)
{
  
    rADCDLY=50000;                  //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
    //Touch down to conversion delay time width , X coordinate & Y coordinate conversion time width setting
    rADCCON=(1<<14)+(ADCPRS<<6);   //ADCPRS En, ADCPRS Value
    // A/D converter prescaler enable , PRSCVL value setting , A/D Frequency = PCLK / (PRSCVL + 1)
    Uart_Printf("ADC touch screen test\n");

    rADCTSC=0xd3;  //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
    //Detect stylus down interrupt signal , YM Enable , YP Disable , XM Disable, XP Disable , XP Pull-up enable , Normal ADC Conversion , Waiting for interrupt mode
    pISR_ADC = (int)AdcTsAuto;//将中断处理程序名放入中断向量表中对应地址
    //
    rINTMSK=~BIT_ADC;        //ADC Touch Screen Mask bit clear
    rINTSUBMSK=~(BIT_SUB_TC);//Touch Screen Mask bit clear

    Uart_Printf("\nType any key to exit!!!\n");
    Uart_Printf("\nStylus Down, please...... \n");
    Uart_Getch();

    rINTSUBMSK|=BIT_SUB_TC;//Touch Screen Mask bit set
    rINTMSK|=BIT_ADC;//ADC Touch Screen Mask bit set
    Uart_Printf("Touch Screen Test is Finished!!!\n");

}


void __irq AdcTsAuto(void)
{
    int i;
    U32 saveAdcdly;

    if(rADCDAT0&0x8000)//判断 updown bit ,如果提起则
    {
        //Uart_Printf("\nStylus Up!!\n");
        rADCTSC&=0xff;    // Set stylus down interrupt bit
    }
    //else
        //Uart_Printf("\nStylus Down!!\n");

    rADCTSC=(1<<3)|(1<<2);         //XP Pull-up disable, Seq. X,Y postion measure.
    saveAdcdly=rADCDLY;
    rADCDLY=40000;                 //Normal conversion mode delay about (1/50M)*40000=0.8ms

    rADCCON|=0x1;                   //start ADC  AD转换开始且该位在开始后清零

        while(rADCCON & 0x1);        //check if Enable_start is low
        while(!(rADCCON & 0x8000));        //check if EC(End of Conversion) flag is high, This line is necessary~!!
        
            while(!(rSRCPND & (BIT_ADC)));  //check if ADC is finished with interrupt bit

            xdata=(rADCDAT0&0x3ff);
            ydata=(rADCDAT1&0x3ff);

     //YH 0627, To check Stylus Up Interrupt.
     rSUBSRCPND|=BIT_SUB_TC;//
     ClearPending(BIT_ADC);//
     rINTSUBMSK=~(BIT_SUB_TC);//
     rINTMSK=~(BIT_ADC);//
            
     rADCTSC =0xd3;    //Waiting for interrupt
     rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.

            while(1)        //to check Pen-up state
            {
             if(rSUBSRCPND & (BIT_SUB_TC))    //check if ADC is finished with interrupt bit
                 {
                    //Uart_Printf("Stylus Up Interrupt~!\n");
                    break;    //if Stylus is up(1) state
                }
            }    

    Uart_Printf("count=%03d  XP=%04d, YP=%04d\n", count++, xdata, ydata);    //X-position Conversion data            

    rADCDLY=saveAdcdly;
    rADCTSC=rADCTSC&~(1<<8); // Detect stylus Down interrupt signal.
    rSUBSRCPND|=BIT_SUB_TC;
    rINTSUBMSK=~(BIT_SUB_TC);    // Unmask sub interrupt (TC)    
    ClearPending(BIT_ADC);
}


自己看单句还基本看明白了,可整个流程不了解,如果我要多次采集一个点,又该如何处理呢,有没有裸奔玩触摸屏的朋友指导一二 ....