各位板大,小弟有一個問題,小弟用原子哥的觸控屏去修改成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;
}
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
值在一區間會讀錯誤則是因為STM32F407速度較快,導致觸發偏移所以讀不到資料,
加delay就解決了,非常謝謝原子哥幫忙!!
一周热门 更多>