|
关于裸奔三部曲第三章的第三节例程,我有一些地方不明白,希望能得到你的解答哈,
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=%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);
- }
复制代码 |
|