天使之翼369 发表于 2013-7-20 16:08:53

关于裸奔三部曲 触摸校正 的疑问

关于裸奔三部曲第三章的第三节例程,我有一些地方不明白,希望能得到你的解答哈,
    xdata *= 0.272;
    ydata *= 0.480;
    ydata = 480-ydata;
    temp = ydata;
    ydata = xdata;
    xdata = temp;
    xdata = (xdata - 20.0303) / 0.8972;
    ydata = (ydata - 37.86667) / 0.7486;
上面这些代码在Example3.2的main.c函数中AdcTsAuto(void)中断函数里,我不明白前两句所乘的系数是什么意思?为什么要乘上这两个系数呢?还有第三句,为什么要用480减去ydata呢?

#ifdef CSTM_LCD

if (g_type == LCD_35)
{
xdata=480-xdata;
xdata=(double)((double)320/480)*xdata;
ydata=272-ydata;
ydata=(double)((double)240/271)*ydata;
}
else if(g_type == LCD_70)
{
xdata=480-xdata;
xdata=(double)((double)800/480)*xdata;
// ydata=272-ydata;
ydata=ydata<0?0:ydata;
ydata=(double)((double)480/272)*ydata;
}
#endif
还有上面的代码,如果换成3.5寸的屏,为什么要有xdata=480-xdata;    ydata=272-ydata;    这两句呢?
我的理解是,在这段程序之前的代码已经得出了在4.3寸屏上要显示的坐标,而且是以左上角为(0,0)点,如果换成3.5寸屏了,xdata=480-xdata;    ydata=272-ydata;这两句不是表明了这个3.5寸屏是以又下角的点为(0,0)点了么?

希望大神能帮我解答一下我的困惑,在此不胜感激~谢谢~
以下是main函数void Main(void)
{
        char *mode;
        int i;
        U8 key;
        U32 mpll_val = 0 ;
        //U32 divn_upll = 0 ;
//--add bgn------------------   
    U32 pix_x,pix_y;
    S32 tmp;
//--add end------------------   
        #if ADS10   
//        __rt_lib_init(); //for ADS 1.0
        #endif

        Port_Init();
       
        Isr_Init();
       
        i = 2 ;        //don't use 100M!
        switch ( i ) {
        case 0:        //200
                key = 12;
                mpll_val = (92<<12)|(4<<4)|(1);
                break;
        case 1:        //300
                key = 13;
                mpll_val = (67<<12)|(1<<4)|(1);
                break;
        case 2:        //400
                key = 14;
                mpll_val = (92<<12)|(1<<4)|(1);
                break;
        case 3:        //440!!!
                key = 14;
                mpll_val = (102<<12)|(1<<4)|(1);
                break;
        default:
                key = 14;
                mpll_val = (92<<12)|(1<<4)|(1);
                break;
        }
       
        //init FCLK=400M, so change MPLL first
        ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
        ChangeClockDivider(key, 12);
        cal_cpu_bus_clk();
       
        consoleNum = 0;        // Uart 1 select for debug.
        Uart_Init( 0,115200 );
        Uart_Select( consoleNum );
       
        Beep(2000, 100);
       
        Uart_SendByte('\n');
        /*Uart_Printf("<***************************************>\n");
        Uart_Printf("               TQ2440 Test Program\n");
        Uart_Printf("                www.embedsky.net\n");
        Uart_Printf("<***************************************>\n");*/

        rMISCCR=rMISCCR&~(1<<3); // USBD is selected instead of USBH1
        rMISCCR=rMISCCR&~(1<<13); // USB port 1 is enabled.


        rDSC0 = 0x2aa;
        rDSC1 = 0x2aaaaaaa;
        //Enable NAND, USBD, PWM TImer, UART0,1 and GPIO clock,
        //the others must be enabled in OS!!!
        rCLKCON = 0xfffff0;

        MMU_Init();        //

        pISR_SWI=(_ISR_STARTADDRESS+0xf0);        //for pSOS

        Led_Display(0x66);

        mode="DMA";

        Clk0_Disable();
        Clk1_Disable();
       
        mpll_val = rMPLLCON;

#ifdef CSTM_LCD
        cstmLcd_init();
#else
        Lcd_TFT_Init() ;                // LCD initial
#endif
               
        download_run=1; //The default menu is the Download & Run mode.

//************************************************************************       
        rADCDLY=50000;                  //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
        rADCCON=(1<<14)+(ADCPRS<<6);   //ADCPRS En, ADCPRS Value
        rADCTSC=0xd3;//Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
        pISR_ADC = (int)AdcTsAuto;
        rINTMSK=~BIT_ADC;       //ADC Touch Screen Mask bit clear
        rINTSUBMSK=~(BIT_SUB_TC);



//-----add bgn-----------------------
#ifdef CSTM_LCD

#define PIC_X                320
#define PIC_Y                240
#define PIC_DIV                8
        g_type = get_pix(&pix_x,&pix_y);
        Lcd_ClearScr(0);
        tmp=(pix_x/6-PIC_X/8)/2;                //图在变成原来的1/8时,显示时的留空范围(对x),等效于图像居中的计算方式
        if(tmp<0)
                Uart_Printf("pix_x may too low,it may have something wrong!\n");
#endif
        while(1)
        {
#ifdef CSTM_LCD
                //这里因为6张图数量是不变的所以将它直接写死算了
                if(ydata>(pix_y-PIC_Y/PIC_DIV) && xdata>(pix_x*5/6))        Paint_Bmp((pix_x-PIC_X)/2, (pix_y-PIC_Y)/2, 320, 240, tu6_320240);
                else if(ydata>(pix_y-PIC_Y/PIC_DIV) && xdata>(pix_x*4/6))        Paint_Bmp((pix_x-PIC_X)/2, (pix_y-PIC_Y)/2, 320, 240, tu5_320240);
                else if(ydata>(pix_y-PIC_Y/PIC_DIV) && xdata>(pix_x*3/6))        Paint_Bmp((pix_x-PIC_X)/2, (pix_y-PIC_Y)/2, 320, 240, tu4_320240);
                else if(ydata>(pix_y-PIC_Y/PIC_DIV) && xdata>(pix_x*2/6))        Paint_Bmp((pix_x-PIC_X)/2, (pix_y-PIC_Y)/2, 320, 240, tu3_320240);
                else if(ydata>(pix_y-PIC_Y/PIC_DIV) && xdata>(pix_x*1/6))        Paint_Bmp((pix_x-PIC_X)/2, (pix_y-PIC_Y)/2, 320, 240, tu2_320240);
                else if(ydata>(pix_y-PIC_Y/PIC_DIV) && xdata>(pix_x*0/6))        Paint_Bmp((pix_x-PIC_X)/2, (pix_y-PIC_Y)/2, 320, 240, tu1_320240);
                else ;

                Paint_Bmp1((pix_x*0/6+tmp), (pix_y-PIC_Y/PIC_DIV), PIC_X, PIC_Y,PIC_DIV, tu1_320240);        //这里图像的分辨率为固定的320*240
                Paint_Bmp1((pix_x*1/6+tmp), (pix_y-PIC_Y/PIC_DIV), PIC_X, PIC_Y,PIC_DIV, tu2_320240);        //这里图像的分辨率为固定的320*240
                Paint_Bmp1((pix_x*2/6+tmp), (pix_y-PIC_Y/PIC_DIV), PIC_X, PIC_Y,PIC_DIV, tu3_320240);        //这里图像的分辨率为固定的320*240
                Paint_Bmp1((pix_x*3/6+tmp), (pix_y-PIC_Y/PIC_DIV), PIC_X, PIC_Y,PIC_DIV, tu4_320240);        //这里图像的分辨率为固定的320*240
                Paint_Bmp1((pix_x*4/6+tmp), (pix_y-PIC_Y/PIC_DIV), PIC_X, PIC_Y,PIC_DIV, tu5_320240);        //这里图像的分辨率为固定的320*240
                Paint_Bmp1((pix_x*5/6+tmp), (pix_y-PIC_Y/PIC_DIV), PIC_X, PIC_Y,PIC_DIV, tu6_320240);        //这里图像的分辨率为固定的320*240
                Delay(500);       
//-----add end-----------------------       
#else
                if(ydata<240 && xdata>260) Paint_Bmp(0, 0, 320, 240, tu1_320240);
                else if(ydata<240 && xdata>220)        Paint_Bmp(0, 0, 320, 240, tu2_320240);
                else if(ydata<240 && xdata>180)        Paint_Bmp(0, 0, 320, 240, tu3_320240);
                else if(ydata<240 && xdata>100)        Paint_Bmp(0, 0, 320, 240, tu4_320240);
                else if(ydata<240 && xdata>60)        Paint_Bmp(0, 0, 320, 240, tu5_320240);
                else if(ydata<240)        Paint_Bmp(0, 0, 320, 240, tu6_320240);
                else ;

                Paint_Bmp1(15, 210, 320, 240,8, tu1_320240);
                Paint_Bmp1(50+15, 210, 320, 240,8, tu2_320240);
                Paint_Bmp1(100+15, 210, 320, 240,8, tu3_320240);
                Paint_Bmp1(150+15, 210, 320, 240,8, tu4_320240);
                Paint_Bmp1(200+15, 210, 320, 240,8, tu5_320240);
                Paint_Bmp1(250+15, 210, 320, 240,8, tu6_320240);       
                Delay(500);       
#endif
        }              

}以下是AdcTsAuto(void)函数void __irq AdcTsAuto(void)
{
        U32 saveAdcdly;
int temp;
        if(rADCDAT0&0x8000)
        {
                //Uart_Printf("\nStylus Up!!\n");
                rADCTSC&=0xff;        // Set stylus down interrupt bit
        }
        //else
                //Uart_Printf("\nStylus Down!!\n");

        rADCTSC=(1<<3)|(1<<2);         //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

        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);

        //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
                }
        }       

    xdata *= 0.272;
    ydata *= 0.480;
    ydata = 480-ydata;
    temp = ydata;
    ydata = xdata;
    xdata = temp;

    xdata = (xdata - 20.0303) / 0.8972;
    ydata = (ydata - 37.86667) / 0.7486;
//-----add bgn---------------------------------------
#ifdef CSTM_LCD
       
        if (g_type == LCD_35)
        {
                xdata=480-xdata;
                xdata=(double)((double)320/480)*xdata;
                ydata=272-ydata;
                ydata=(double)((double)240/271)*ydata;
        }
        else if(g_type == LCD_70)
        {
                xdata=480-xdata;
                xdata=(double)((double)800/480)*xdata;
        //        ydata=272-ydata;
                ydata=ydata<0?0:ydata;
                ydata=(double)((double)480/272)*ydata;
        }

#endif
        Delay(10);
//-----add end---------------------------------------------
    Uart_Printf("count=%03dXP=%04d, YP=%04d\n", count++, xdata, ydata);


//--------------------------------------------
   //X-position Conversion data我wangwang如果不删掉,pc串口依然可以工作
           //Uart_Printf("count=%03dXP=%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);
}

天使之翼369 发表于 2013-7-20 16:12:39

我看到网上有人用以下两句作为校正屏幕(320*240)的,我不明白514和-500是根据什么得出的?
ydata=514-ydata;
xdata=-500+xdata;
页: [1]
查看完整版本: 关于裸奔三部曲 触摸校正 的疑问