天嵌 ARM开发社区

 找回密码
 注册
查看: 2417|回复: 1

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

[复制链接]
天使之翼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函数
  1. void Main(void)
  2. {
  3.         char *mode;
  4.         int i;
  5.         U8 key;
  6.         U32 mpll_val = 0 ;
  7.         //U32 divn_upll = 0 ;
  8. //--add bgn------------------   
  9.     U32 pix_x,pix_y;
  10.     S32 tmp;
  11. //--add end------------------   
  12.         #if ADS10   
  13. //        __rt_lib_init(); //for ADS 1.0
  14.         #endif

  15.         Port_Init();
  16.        
  17.         Isr_Init();
  18.        
  19.         i = 2 ;        //don't use 100M!
  20.         switch ( i ) {
  21.         case 0:        //200
  22.                 key = 12;
  23.                 mpll_val = (92<<12)|(4<<4)|(1);
  24.                 break;
  25.         case 1:        //300
  26.                 key = 13;
  27.                 mpll_val = (67<<12)|(1<<4)|(1);
  28.                 break;
  29.         case 2:        //400
  30.                 key = 14;
  31.                 mpll_val = (92<<12)|(1<<4)|(1);
  32.                 break;
  33.         case 3:        //440!!!
  34.                 key = 14;
  35.                 mpll_val = (102<<12)|(1<<4)|(1);
  36.                 break;
  37.         default:
  38.                 key = 14;
  39.                 mpll_val = (92<<12)|(1<<4)|(1);
  40.                 break;
  41.         }
  42.        
  43.         //init FCLK=400M, so change MPLL first
  44.         ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
  45.         ChangeClockDivider(key, 12);
  46.         cal_cpu_bus_clk();
  47.        
  48.         consoleNum = 0;        // Uart 1 select for debug.
  49.         Uart_Init( 0,115200 );
  50.         Uart_Select( consoleNum );
  51.        
  52.         Beep(2000, 100);
  53.        
  54.         Uart_SendByte('\n');
  55.         /*Uart_Printf("<***************************************>\n");
  56.         Uart_Printf("               TQ2440 Test Program\n");
  57.         Uart_Printf("                www.embedsky.net\n");
  58.         Uart_Printf("<***************************************>\n");*/

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


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

  66.         MMU_Init();        //

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

  68.         Led_Display(0x66);

  69.         mode="DMA";

  70.         Clk0_Disable();
  71.         Clk1_Disable();
  72.        
  73.         mpll_val = rMPLLCON;

  74. #ifdef CSTM_LCD
  75.         cstmLcd_init();
  76. #else
  77.         Lcd_TFT_Init() ;                // LCD initial
  78. #endif
  79.                
  80.         download_run=1; //The default menu is the Download & Run mode.

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



  88. //-----add bgn-----------------------
  89. #ifdef CSTM_LCD

  90. #define PIC_X                320
  91. #define PIC_Y                240
  92. #define PIC_DIV                8
  93.         g_type = get_pix(&pix_x,&pix_y);
  94.         Lcd_ClearScr(0);
  95.         tmp=(pix_x/6-PIC_X/8)/2;                //图在变成原来的1/8时,显示时的留空范围(对x),等效于图像居中的计算方式
  96.         if(tmp<0)
  97.                 Uart_Printf("pix_x may too low,it may have something wrong!\n");
  98. #endif
  99.         while(1)
  100.         {
  101. #ifdef CSTM_LCD
  102.                 //这里因为6张图数量是不变的所以将它直接写死算了
  103.                 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);
  104.                 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);
  105.                 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);
  106.                 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);
  107.                 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);
  108.                 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);
  109.                 else ;

  110.                 Paint_Bmp1((pix_x*0/6+tmp), (pix_y-PIC_Y/PIC_DIV), PIC_X, PIC_Y,PIC_DIV, tu1_320240);        //这里图像的分辨率为固定的320*240
  111.                 Paint_Bmp1((pix_x*1/6+tmp), (pix_y-PIC_Y/PIC_DIV), PIC_X, PIC_Y,PIC_DIV, tu2_320240);        //这里图像的分辨率为固定的320*240
  112.                 Paint_Bmp1((pix_x*2/6+tmp), (pix_y-PIC_Y/PIC_DIV), PIC_X, PIC_Y,PIC_DIV, tu3_320240);        //这里图像的分辨率为固定的320*240
  113.                 Paint_Bmp1((pix_x*3/6+tmp), (pix_y-PIC_Y/PIC_DIV), PIC_X, PIC_Y,PIC_DIV, tu4_320240);        //这里图像的分辨率为固定的320*240
  114.                 Paint_Bmp1((pix_x*4/6+tmp), (pix_y-PIC_Y/PIC_DIV), PIC_X, PIC_Y,PIC_DIV, tu5_320240);        //这里图像的分辨率为固定的320*240
  115.                 Paint_Bmp1((pix_x*5/6+tmp), (pix_y-PIC_Y/PIC_DIV), PIC_X, PIC_Y,PIC_DIV, tu6_320240);        //这里图像的分辨率为固定的320*240
  116.                 Delay(500);       
  117. //-----add end-----------------------       
  118. #else
  119.                 if(ydata<240 && xdata>260) Paint_Bmp(0, 0, 320, 240, tu1_320240);
  120.                 else if(ydata<240 && xdata>220)        Paint_Bmp(0, 0, 320, 240, tu2_320240);
  121.                 else if(ydata<240 && xdata>180)        Paint_Bmp(0, 0, 320, 240, tu3_320240);
  122.                 else if(ydata<240 && xdata>100)        Paint_Bmp(0, 0, 320, 240, tu4_320240);
  123.                 else if(ydata<240 && xdata>60)        Paint_Bmp(0, 0, 320, 240, tu5_320240);
  124.                 else if(ydata<240)        Paint_Bmp(0, 0, 320, 240, tu6_320240);
  125.                 else ;

  126.                 Paint_Bmp1(15, 210, 320, 240,8, tu1_320240);
  127.                 Paint_Bmp1(50+15, 210, 320, 240,8, tu2_320240);
  128.                 Paint_Bmp1(100+15, 210, 320, 240,8, tu3_320240);
  129.                 Paint_Bmp1(150+15, 210, 320, 240,8, tu4_320240);
  130.                 Paint_Bmp1(200+15, 210, 320, 240,8, tu5_320240);
  131.                 Paint_Bmp1(250+15, 210, 320, 240,8, tu6_320240);       
  132.                 Delay(500);       
  133. #endif
  134.         }                

  135. }
复制代码
以下是AdcTsAuto(void)函数
  1. void __irq AdcTsAuto(void)
  2. {
  3.         U32 saveAdcdly;
  4. int temp;
  5.         if(rADCDAT0&0x8000)
  6.         {
  7.                 //Uart_Printf("\nStylus Up!!\n");
  8.                 rADCTSC&=0xff;        // Set stylus down interrupt bit
  9.         }
  10.         //else
  11.                 //Uart_Printf("\nStylus Down!!\n");

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

  15.         rADCCON|=0x1;                   //start ADC

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

  20.         xdata=(rADCDAT0&0x3ff);
  21.         ydata=(rADCDAT1&0x3ff);

  22.         //check Stylus Up Interrupt.
  23.         rSUBSRCPND|=BIT_SUB_TC;
  24.         ClearPending(BIT_ADC);
  25.         rINTSUBMSK=~(BIT_SUB_TC);
  26.         rINTMSK=~(BIT_ADC);
  27.                          
  28.         rADCTSC =0xd3;    //Waiting for interrupt
  29.         rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.

  30.         while(1)                //to check Pen-up state
  31.         {
  32.                 if(rSUBSRCPND & (BIT_SUB_TC))        //check if ADC is finished with interrupt bit
  33.                 {
  34.                         //Uart_Printf("Stylus Up Interrupt~!\n");
  35.                         break;        //if Stylus is up(1) state
  36.                 }
  37.         }       

  38.     xdata *= 0.272;
  39.     ydata *= 0.480;
  40.     ydata = 480-ydata;
  41.     temp = ydata;
  42.     ydata = xdata;
  43.     xdata = temp;

  44.     xdata = (xdata - 20.0303) / 0.8972;
  45.     ydata = (ydata - 37.86667) / 0.7486;
  46. //-----add bgn---------------------------------------
  47. #ifdef CSTM_LCD
  48.        
  49.         if (g_type == LCD_35)
  50.         {
  51.                 xdata=480-xdata;
  52.                 xdata=(double)((double)320/480)*xdata;
  53.                 ydata=272-ydata;
  54.                 ydata=(double)((double)240/271)*ydata;
  55.         }
  56.         else if(g_type == LCD_70)
  57.         {
  58.                 xdata=480-xdata;
  59.                 xdata=(double)((double)800/480)*xdata;
  60.         //        ydata=272-ydata;
  61.                 ydata=ydata<0?0:ydata;
  62.                 ydata=(double)((double)480/272)*ydata;
  63.         }

  64. #endif
  65.         Delay(10);
  66. //-----add end---------------------------------------------
  67.     Uart_Printf("count=%03d  XP=%04d, YP=%04d\n", count++, xdata, ydata);


  68. //--------------------------------------------
  69.    //X-position Conversion data  我wangwang如果不删掉,pc串口依然可以工作
  70.            //Uart_Printf("count=%03d  XP=%04d, YP=%04d\n", count++, xdata, ydata);    //X-position Conversion data            

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

复制代码
 楼主| 天使之翼369 发表于 2013-7-20 16:12:39 | 显示全部楼层
我看到网上有人用以下两句作为校正屏幕(320*240)的,我不明白514和-500是根据什么得出的?
ydata=514-ydata;
xdata=-500+xdata;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-28 17:55 , Processed in 1.031250 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表