关于裸奔三部曲 触摸校正 的疑问
关于裸奔三部曲第三章的第三节例程,我有一些地方不明白,希望能得到你的解答哈,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);
}
我看到网上有人用以下两句作为校正屏幕(320*240)的,我不明白514和-500是根据什么得出的?
ydata=514-ydata;
xdata=-500+xdata;
页:
[1]