XPT2046 5.0" 校準不正確

2019-07-20 23:06发布

各位板大,小弟有一個問題,小弟用原子哥的觸控屏去修改成5" 480x272.
    但校準完,Y軸就是272還算可以,X軸兩測算還可接受,但中間就誤差很大,
         請教各位板大,是X軸的換算式會隨屏慕變大而要修改嗎?
            不然問題可能出在那?可否請各位板大不吝賜教嗎?
                  謝謝!!

//觸摸屏校準代碼

//得到四個校準參數 void Touch_Adjust(void) { signed short pos_temp[4][2];//坐標緩存值 u8 cnt=0; u16 d1,d2; u32 tem1,tem2; float fac;      cnt=0; POINT_COLOR=BLUE; BACK_COLOR =WHITE; LCD_Clear(WHITE);//清屏    POINT_COLOR=RED;//紅 {MOD}  LCD_Clear(WHITE);//清屏  Drow_Touch_Point(20,20);//畫點1  Pen_Point.Key_Sta=Key_Up;//消除觸發信號  Pen_Point.xfac=0;//xfac用來標記是否校準過,所以校準之前必須清掉!以免錯誤   while(1) {      // Pen_Int_Set(0);//關閉中斷  if(Pen_Point.Key_Sta==Key_Down)//按鍵按下了 { if(Read_TP_Once())//得到單次按鍵值 {       pos_temp[cnt][0]=Pen_Point.X; pos_temp[cnt][1]=Pen_Point.Y; cnt++; }     LCD_Num(150,20,cnt,2,WHITE,BLUE);     LCD_Num(50,70,Pen_Point.X,4,WHITE,BLUE);   LCD_Num(50,100,Pen_Point.Y,4,WHITE,BLUE); switch(cnt) { case 1: // LCD_Clear(WHITE);//清屏   Drow_Touch_Point(460,20);//畫點2         en_Int_Set(0);//關閉中斷         en_Point.Key_Sta=Key_Up;         delay_ms(500);         en_Int_Set(1);//開啟中斷 break; case 2: // LCD_Clear(WHITE);//清屏   Drow_Touch_Point(20,252);//畫點3         en_Int_Set(0);//關閉中斷         en_Point.Key_Sta=Key_Up;         delay_ms(500);         en_Int_Set(1);//開啟中斷 break; case 3: // LCD_Clear(WHITE);//清屏   Drow_Touch_Point(460,252);//畫點4         en_Int_Set(0);//關閉中斷         en_Point.Key_Sta=Key_Up;         delay_ms(500);         en_Int_Set(1);//開啟中斷 break; case 4: //全部四個點已經得到           //對邊相等 tem1=abs(pos_temp[0][0]-pos_temp[1][0]);//x1-x2 tem2=abs(pos_temp[0][1]-pos_temp[1][1]);//y1-y2 tem1*=tem1; tem2*=tem2; d1=sqrt(tem1+tem2);//得到1,2的距離 tem1=abs(pos_temp[2][0]-pos_temp[3][0]);//x3-x4 tem2=abs(pos_temp[2][1]-pos_temp[3][1]);//y3-y4 tem1*=tem1; tem2*=tem2; d2=sqrt(tem1+tem2);//得到3,4的距離           fac=(float)d1/d2; if( fac<(float)0.90 || fac>(float)1.00 )//不合格 { cnt=0; LCD_Clear(WHITE);//清屏  Drow_Touch_Point(20,20); ADJ_INFO_SHOW("hor fac is:");  LCD_Num(80,35,pos_temp[0][0],4,WHITE,BLUE);  //顯示數值    LCD_Num(80+160,35,pos_temp[0][1],4,WHITE,BLUE); //顯示數值 LCD_Num(80,55,pos_temp[1][0],4,WHITE,BLUE);  //顯示數值    LCD_Num(80+160,55,pos_temp[1][1],4,WHITE,BLUE); //顯示數值  LCD_Num(80,75,pos_temp[2][0],4,WHITE,BLUE);  //顯示數值    LCD_Num(80+160,75,pos_temp[2][1],4,WHITE,BLUE); //顯示數值 LCD_Num(80,95,pos_temp[3][0],4,WHITE,BLUE); //顯示數值 LCD_Num(80+160,95,pos_temp[3][1],4,WHITE,BLUE); //顯示數值  //擴大100倍顯示 LCD_Num(220,120,fac*100,3,WHITE,BLUE); //顯示數值,該數值必須在95~105範圍之內.           en_Int_Set(0);//關閉中斷           Pen_Point.Key_Sta=Key_Up;           delay_ms(500);           Pen_Int_Set(1);//開啟中斷 continue; } tem1=abs(pos_temp[0][0]-pos_temp[2][0]);//x1-x3 tem2=abs(pos_temp[0][1]-pos_temp[2][1]);//y1-y3 tem1*=tem1; tem2*=tem2; d1=sqrt(tem1+tem2);//得到1,3的距離 tem1=abs(pos_temp[1][0]-pos_temp[3][0]);//x2-x4 tem2=abs(pos_temp[1][1]-pos_temp[3][1]);//y2-y4 tem1*=tem1; tem2*=tem2; d2=sqrt(tem1+tem2);//得到2,4的距離 fac=(float)d1/d2; if(fac<(float)0.90||fac>(float)1.00)//不合格 { cnt=0; LCD_Clear(WHITE);//清屏  Drow_Touch_Point(20,20); ADJ_INFO_SHOW("hor fac is:");    LCD_Num(80,35,pos_temp[0][0],4,WHITE,BLUE);  //顯示數值    LCD_Num(80+160,35,pos_temp[0][1],4,WHITE,BLUE); //顯示數值 LCD_Num(80,55,pos_temp[1][0],4,WHITE,BLUE);  //顯示數值    LCD_Num(80+160,55,pos_temp[1][1],4,WHITE,BLUE); //顯示數值  LCD_Num(80,75,pos_temp[2][0],4,WHITE,BLUE);  //顯示數值    LCD_Num(80+160,75,pos_temp[2][1],4,WHITE,BLUE); //顯示數值 LCD_Num(80,95,pos_temp[3][0],4,WHITE,BLUE); //顯示數值 LCD_Num(80+160,95,pos_temp[3][1],4,WHITE,BLUE); //顯示數值  //擴大100倍顯示 LCD_Num(220,120,fac*100,3,WHITE,BLUE); //顯示數值,該數值必須在95~105範圍之內.           Pen_Int_Set(0);//關閉中斷           Pen_Point.Key_Sta=Key_Up;           delay_ms(500);           Pen_Int_Set(1);//開啟中斷   continue; }//正確了     //對角線相等 tem1=abs(pos_temp[1][0]-pos_temp[2][0]);//x1-x3 tem2=abs(pos_temp[1][1]-pos_temp[2][1]);//y1-y3 tem1*=tem1; tem2*=tem2; d1=sqrt(tem1+tem2);//得到1,4的距離 tem1=abs(pos_temp[0][0]-pos_temp[3][0]);//x2-x4 tem2=abs(pos_temp[0][1]-pos_temp[3][1]);//y2-y4 tem1*=tem1; tem2*=tem2; d2=sqrt(tem1+tem2);//得到2,3的距離 fac=(float)d1/d2; if(fac<(float)0.90||fac>(float)1.00)//不合格 { cnt=0; LCD_Clear(WHITE);//清屏  Drow_Touch_Point(20,20);           Pen_Point.Key_Sta=Key_Up; ADJ_INFO_SHOW("dia fac is:");    LCD_Num(80,35,pos_temp[0][0],4,WHITE,BLUE);  //顯示數值    LCD_Num(80+160,35,pos_temp[0][1],4,WHITE,BLUE); //顯示數值 LCD_Num(80,55,pos_temp[1][0],4,WHITE,BLUE);  //顯示數值    LCD_Num(80+160,55,pos_temp[1][1],4,WHITE,BLUE); //顯示數值  LCD_Num(80,75,pos_temp[2][0],4,WHITE,BLUE);  //顯示數值    LCD_Num(80+160,75,pos_temp[2][1],4,WHITE,BLUE); //顯示數值 LCD_Num(80,95,pos_temp[3][0],4,WHITE,BLUE); //顯示數值 LCD_Num(80+160,95,pos_temp[3][1],4,WHITE,BLUE); //顯示數值  //擴大100倍顯示 LCD_Num(220,120,fac*100,3,WHITE,BLUE); //顯示數值,該數值必須在95~105範圍之內. continue; }//正確了 //計算結果 Pen_Point.xfac=(float)440/(pos_temp[1][0]-pos_temp[0][0]);//得到xfac   Pen_Point.xoff=(480-Pen_Point.xfac*(pos_temp[1][0]+pos_temp[0][0]))/2;//得到xoff    Pen_Point.yfac=(float)232/(pos_temp[2][1]-pos_temp[0][1]);//得到yfac Pen_Point.yoff=(272-Pen_Point.yfac*(pos_temp[2][1]+pos_temp[0][1]))/2;//得到yoff  
      LCD_Num(50,140,????Pen_Point.xfac*100000,6,WHITE,BLUE);     LCD_Num(50,180,Pen_Point.xoff,6,WHITE,BLUE);       LCD_Num(50,210,Pen_Point.yfac*100000,6,WHITE,BLUE);     LCD_Num(50,240,Pen_Point.yoff,6,WHITE,BLUE); if(abs(Pen_Point.xfac)>2||abs(Pen_Point.yfac)>2)//觸屏和預設的相反了. { cnt=0; LCD_Clear(WHITE);//清屏  Drow_Touch_Point(20,20);     // LCD_Num(150,50,abs(Pen_Point.xfac),4,WHITE,BLUE);    // LCD_Num(150,80,abs(Pen_Point.yfac),4,WHITE,BLUE);           LCD_String(35,110,"TP Need readjust!",GREEN,WHITE); Pen_Point.touchtype=!Pen_Point.touchtype;//修改觸屏類型. if(Pen_Point.touchtype)//X,Y方向與屏幕相反 { CMD_RDX=0X90; CMD_RDY=0XD0;   }else   //X,Y方向與屏幕相同    { CMD_RDX=0XD0; CMD_RDY=0X90;   } delay_ms(500);           Pen_Int_Set(0);//關閉中斷           Pen_Point.Key_Sta=Key_Up;           delay_ms(500);           Pen_Int_Set(1);//開啟中斷 continue; } POINT_COLOR=BLUE; // LCD_Clear(WHITE);//清屏          LCD_String(35,110,"Touch Screen Adjust OK!",GREEN,WHITE);//校正完成 delay_ms(500); LCD_Clear(WHITE);//清屏    return;//校正完成   // break;  }     }   } }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
frank504
1楼-- · 2019-07-21 04:15
所以沒人知道原因了喔!好吧再自己努力看看了喔!謝謝各位版大
正点原子
2楼-- · 2019-07-21 06:45
 精彩回答 2  元偷偷看……
frank504
3楼-- · 2019-07-21 11:57
謝謝原子哥,我換過兩三個屏,結果都一樣,請問原子哥除了這問題,還有甚麼需注意呢?非常謝謝原子哥回答.
正点原子
4楼-- · 2019-07-21 13:32
回复【4楼】frank504:
---------------------------------
你可以直接输出XPT2046读取到的物理坐标值,看看变化是不是线性的?
frank504
5楼-- · 2019-07-21 19:13
 精彩回答 2  元偷偷看……
frank504
6楼-- · 2019-07-21 19:55
這應該要五點定位,好像不能線性,不知原子哥有沒有五點定位的範例.謝謝!!

一周热门 更多>