如题,先看原子哥程序:
/***********************************************************
* 函数名称:Touch_Adjust
* 函数功能:触摸屏校准代码( 得到四个校准参数 )
* 入口参数:无 出口参数:0/1
***********************************************************/
void Touch_Adjust(void)
{
signed short pos_temp[4][2];//坐标缓存值
u8 cnt=0;
u16 d1,d2;
u32 tem1,tem2;
float fac;
cnt=0;
LCD_Clear(WHITE);//清屏
Drow_Touch_Point(20,20,RED);//画点1
  en_Point.Key_Sta=Key_Up;//消除触发信号
  en_Point.xfac=0;//xfac用来标记是否校准过,所以校准之前必须清掉!以免错误
while(1)
{
if(Pen_Point.Key_Sta==Key_Down)//按键按下了
{
if(TOUCH_ReadTPOnce())//得到单次按键值
{
pos_temp[cnt][0]=Pen_Point.X;
pos_temp[cnt][1]=Pen_Point.Y;
cnt++;
}
switch(cnt)
{
case 1:
LCD_Clear(WHITE);//清屏
Drow_Touch_Point(220,20,RED);//画点2
break;
case 2:
LCD_Clear(WHITE);//清屏
Drow_Touch_Point(20,300,RED);//画点3
break;
case 3:
LCD_Clear(WHITE);//清屏
Drow_Touch_Point(220,300,RED);//画点4
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<0.95||fac>1.05||d1==0||d2==0)//不合格
{
cnt=0;
LCD_Clear(WHITE);//清屏
Drow_Touch_Point(20,20,RED);
ADJ_INFO_SHOW("ver fac is:",RED);
LCD_ShowNum(40+24,40,pos_temp[0][0],4,0,RED); //显示数值
LCD_ShowNum(40+24+80,40,pos_temp[0][1],4,0,RED); //显示数值
LCD_ShowNum(40+24,60,pos_temp[1][0],4,0,RED); //显示数值
LCD_ShowNum(40+24+80,60,pos_temp[1][1],4,0,RED); //显示数值
LCD_ShowNum(40+24,80,pos_temp[2][0],4,0,RED); //显示数值
LCD_ShowNum(40+24+80,80,pos_temp[2][1],4,0,RED); //显示数值
LCD_ShowNum(40+24,100,pos_temp[3][0],4,0,RED); //显示数值
LCD_ShowNum(40+24+80,100,pos_temp[3][1],4,0,RED); //显示数值
//扩大100倍显示
LCD_ShowNum(40,140,fac*100,3,0,RED);//显示数值,该数值必须在95~105范围之内.
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<0.95||fac>1.05)//不合格
{
cnt=0;
LCD_Clear(WHITE);//清屏
Drow_Touch_Point(20,20,RED);
ADJ_INFO_SHOW("hor fac is:",RED);
LCD_ShowNum(40+24,40,pos_temp[0][0],4,0,RED); //显示数值
LCD_ShowNum(40+24+80,40,pos_temp[0][1],4,0,RED); //显示数值
LCD_ShowNum(40+24,60,pos_temp[1][0],4,0,RED); //显示数值
LCD_ShowNum(40+24+80,60,pos_temp[1][1],4,0,RED); //显示数值
LCD_ShowNum(40+24,80,pos_temp[2][0],4,0,RED); //显示数值
LCD_ShowNum(40+24+80,80,pos_temp[2][1],4,0,RED); //显示数值
LCD_ShowNum(40+24,100,pos_temp[3][0],4,0,RED); //显示数值
LCD_ShowNum(40+24+80,100,pos_temp[3][1],4,0,RED); //显示数值
//扩大100倍显示
LCD_ShowNum(40,140,fac*100,3,0,RED);//显示数值,该数值必须在95~105范围之内.
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<0.95||fac>1.05)//不合格
{
cnt=0;
LCD_Clear(WHITE);//清屏
Drow_Touch_Point(20,20,RED);
ADJ_INFO_SHOW("dia fac is:",RED);
LCD_ShowNum(40+24,40,pos_temp[0][0],4,0,RED); //显示数值
LCD_ShowNum(40+24+80,40,pos_temp[0][1],4,0,RED); //显示数值
LCD_ShowNum(40+24,60,pos_temp[1][0],4,0,RED); //显示数值
LCD_ShowNum(40+24+80,60,pos_temp[1][1],4,0,RED); //显示数值
LCD_ShowNum(40+24,80,pos_temp[2][0],4,0,RED); //显示数值
LCD_ShowNum(40+24+80,80,pos_temp[2][1],4,0,RED); //显示数值
LCD_ShowNum(40+24,100,pos_temp[3][0],4,0,RED); //显示数值
LCD_ShowNum(40+24+80,100,pos_temp[3][1],4,0,RED); //显示数值
//扩大100倍显示
LCD_ShowNum(40,140,fac*100,3,0,RED);//显示数值,该数值必须在95~105范围之内.
continue;
}//正确了
//计算结果
  en_Point.xfac=(float)200/(pos_temp[1][0]-pos_temp[0][0]);//得到xfac
  en_Point.xoff=(240-Pen_Point.xfac*(pos_temp[1][0]+pos_temp[0][0]))/2;//得到xoff
  en_Point.yfac=(float)280/(pos_temp[2][1]-pos_temp[0][1]);//得到yfac
  en_Point.yoff=(320-Pen_Point.yfac*(pos_temp[2][1]+pos_temp[0][1]))/2;//得到yoff
if(abs(Pen_Point.xfac)>2||abs(Pen_Point.yfac)>2)//触屏和预设的相反了.
{
cnt=0;
LCD_Clear(WHITE);//清屏
Drow_Touch_Point(20,20,RED);
LCD_ShowString(35,110,"TP Need readjust!",0,RED);
  en_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_nms(500);
continue;
}
LCD_Clear(WHITE);//清屏
LCD_ShowString(35,110,"Touch Screen Adjust OK!",0,BLUE);//校正完成
Delay_nms(500);
LCD_Clear(WHITE);//清屏
return;//校正完成
}
}
}
}
if(fac<0.95||fac>1.05||d1==0||d2==0)//不合格
和
if(abs(Pen_Point.xfac)>2||abs(Pen_Point.yfac)>2)//触屏和预设的相反了.
这两句对于菜鸟的我真的不太理解:
一、fac为什么要在0.95和1.05之间;
二、Pen_Point.xfac 为什么大于2就认为触屏和预设相反了;
论坛找遍了也没找到解释,麻烦原子哥和各位知道的朋友在百忙中给小弟解解惑,
|