添加了一些注释
This commit is contained in:
+34
-20
@@ -154,45 +154,49 @@ void TP_adjustment()
|
||||
{
|
||||
//判断是否需要校准,从eeprom获取数据
|
||||
EEPROM_READ_BATY(16,(char *)&tconfig,sizeof(touch_config));
|
||||
if(tconfig.begin==0xab&&tconfig.end==0xcd)
|
||||
if(tconfig.begin==0xab&&tconfig.end==0xcd) //判断校准标记
|
||||
{
|
||||
return;
|
||||
return; //已经校准过了
|
||||
}
|
||||
|
||||
char str[64];
|
||||
uint16_t y_adc,x_adc,step=0,r=10;
|
||||
uint16_t y1,y2,y3,y4,x1,x2,x3,x4;
|
||||
int y5,x5,xd,xl,yd,yl;
|
||||
float acc_x,acc_y;
|
||||
int offset_x,offset_y;
|
||||
uint32_t wait=HAL_GetTick()+50000,ms100=0;
|
||||
//校准方法比较简单,读取4个坐标计算ad值与像素的关系
|
||||
char str[64]; //用于字符串提示
|
||||
uint16_t y_adc,x_adc,step=0,r=10; //adc缓存,校准步骤,坐标的半径
|
||||
uint16_t y1,y2,y3,y4,x1,x2,x3,x4; //4个点缓存
|
||||
int y5,x5,xd,xl,yd,yl; //通过4个点算出xy的长边和短边
|
||||
float acc_x,acc_y; //算出的关系倍率
|
||||
int offset_x,offset_y; //算出的偏差
|
||||
uint32_t wait=HAL_GetTick()+50000,ms100=0; //校准时间,50秒没操作就自动退出
|
||||
//显示字符串提示
|
||||
LCD_Clear(GRAY);
|
||||
LCD_ShowString(0,50,"Calibrate the touch screen",16,RED,RED);
|
||||
//TP_DrwaTrage(30,30,10);
|
||||
//开始校准
|
||||
while(HAL_GetTick()<wait)
|
||||
{
|
||||
if(TPEN==0)
|
||||
if(TPEN==0) //如果屏幕被按下
|
||||
{
|
||||
wait=HAL_GetTick()+50000;
|
||||
wait=HAL_GetTick()+50000; //重置50秒
|
||||
|
||||
TP_Read_XY2(&x_adc,&y_adc);
|
||||
TP_Read_XY2(&x_adc,&y_adc); //读取xy ad值
|
||||
//将读到的值显示出来
|
||||
sprintf(str,"ADC_X:%04d",x_adc);
|
||||
LCD_ShowString(100, 0, str, 16, RED, GRAY);
|
||||
sprintf(str,"ADC_Y:%04d",y_adc);
|
||||
LCD_ShowString(100, 16, str, 16, RED, GRAY);
|
||||
|
||||
//特效,半径开始收缩
|
||||
if(HAL_GetTick()>ms100)
|
||||
{
|
||||
ms100=HAL_GetTick()+100;
|
||||
if(r>0){r--;}
|
||||
}
|
||||
}
|
||||
|
||||
//步骤0,将点画在(30,30)此时半径为10
|
||||
if(step==0)
|
||||
{
|
||||
TP_DrwaTrage(30,30,r);
|
||||
if(r==0)
|
||||
if(r==0)//当半径收缩为0的时候
|
||||
{
|
||||
//进入下一个步骤,缓存这个点的值,显示出来
|
||||
step+=1;
|
||||
y1=y_adc;
|
||||
x1=x_adc;
|
||||
@@ -200,6 +204,7 @@ void TP_adjustment()
|
||||
LCD_ShowString(0,66,str,16,RED,RED);
|
||||
}
|
||||
}
|
||||
//步骤1,等待屏幕被松开,进入下一个步骤,重置半径
|
||||
if(step==1)
|
||||
{
|
||||
if(TPEN==1)
|
||||
@@ -209,6 +214,7 @@ void TP_adjustment()
|
||||
}
|
||||
|
||||
}
|
||||
//下面几个步骤和上面一样
|
||||
if(step==2)
|
||||
{
|
||||
TP_DrwaTrage(290,30,r);
|
||||
@@ -271,41 +277,49 @@ void TP_adjustment()
|
||||
r=10;
|
||||
}
|
||||
}
|
||||
//当4个点读取完,开始计算关系
|
||||
if(step==8)
|
||||
{
|
||||
//其实只需要两个点就能校准,通过取平均值获得xy的长边和短边
|
||||
xd=((x1+x3)/2);
|
||||
xl=((x2+x4)/2);
|
||||
yd=((y1+y2)/2);
|
||||
yl=((y3+y4)/2);
|
||||
//长边减去短边可以再获得一个点
|
||||
x5=xl-xd;
|
||||
y5=yl-yd;
|
||||
//这个点如果是负数,肯定有错,可能是xy搞反了
|
||||
if(x5<0||y5<0)
|
||||
{
|
||||
//显示error
|
||||
sprintf(str,"ERROR");
|
||||
LCD_ShowString(0,66+16+16+16+16,str,16,RED, GRAY);
|
||||
}else
|
||||
{
|
||||
//计算关系倍率
|
||||
//ad的长边减去短边再除去实际屏幕像素的长边减短边(260=320-30-30,180=240-30-30)
|
||||
acc_x=x5/260.0;
|
||||
acc_y=y5/180.0;
|
||||
|
||||
//验证倍率,将实际值减去验证值就等于误差值,因为有两个点,所以计算了两个误差后求了平均值
|
||||
offset_x=(((xd/acc_x)-30)+((xl/acc_x)-290))/2;
|
||||
offset_y=(((yd/acc_y)-30)+((yl/acc_y)-210))/2;
|
||||
|
||||
//保存计算结果
|
||||
tconfig.x_acc=acc_x;
|
||||
tconfig.x_offset=offset_x;
|
||||
tconfig.y_acc=acc_y;
|
||||
tconfig.y_offset=offset_y;
|
||||
|
||||
//eeprom块标记
|
||||
tconfig.begin=0xab;
|
||||
tconfig.end=0xcd;
|
||||
|
||||
|
||||
//显示计算结果
|
||||
sprintf(str,"x_acc=%f y_acc=%f",acc_x,acc_y);
|
||||
LCD_ShowString(0,66+16+16+16+16,str,16,RED,RED);
|
||||
sprintf(str,"x_offset=%d y_offset=%d",offset_x,offset_y);
|
||||
LCD_ShowString(0,66+16+16+16+16+16,str,16,RED,RED);
|
||||
|
||||
}
|
||||
//将结果保存起来
|
||||
EEPROM_WRITE_BATY(16,(char *)&tconfig,sizeof(touch_config));
|
||||
HAL_Delay(1000);
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user