|  | 
 
| 关于裸奔三部曲第三章的第三节例程,我有一些地方不明白,希望能得到你的解答哈, 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函数
 以下是AdcTsAuto(void)函数复制代码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
        }                 
}
复制代码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=%03d  XP=%04d, YP=%04d\n", count++, xdata, ydata);
 
//--------------------------------------------
   //X-position Conversion data  我wangwang如果不删掉,pc串口依然可以工作
           //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);
}
 | 
 |