diff --git a/HW_Devices/touch.c b/HW_Devices/touch.c index 942231e..772b741 100644 --- a/HW_Devices/touch.c +++ b/HW_Devices/touch.c @@ -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()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;