|
emwin自带的两点校准程序在实际应用中无法满足要求,想改成更精准的四点或五点校准,
但在emwin中不知道如何修改,求高手指点,谢谢!
void TouchAdjTask(void)
{
int aPhysX[4], aPhysY[4], aLogX[4], aLogY[4];
uint8_t i, ucXYChang;
uint16_t d1,d2,d3,d4,d5,d6;
float fac1,fac2,fac3;
uint8_t TP_Adj_Flag = 0xAB;
ucXYChang = 0;
GUI_Init();
GUI_SetBkColor(GUI_WHITE);
GUI_Clear();
GUI_SetColor(GUI_BLACK);
GUI_SetFont(&GUI_Font13B_ASCII);
GUI_Delay(1000);
GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 799, 0, 1023);
GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 479, 0, 1023);
/* Âß¼-×ø±êò2¾íêÇLCDμÄ×ø±ê */
aLogX[0] = 15;
aLogY[0] = 15;
aLogX[1] = LCD_GetXSize() - 15;
aLogY[1] = 15;
aLogX[2] = 15;
aLogY[2] = LCD_GetYSize() - 15;
aLogX[3] = LCD_GetXSize() - 15;
aLogY[3] = LCD_GetYSize() - 15;
/* μÃμ½á½¸öλÖÃμÄÎïàí×ø±ê£¬ò2¾íêÇAD×a»»μÃμ½μÄêyÖμ */
while(1)
{
for (i = 0; i < 4; i++)
{
_GetPhysValues(aLogX, aLogY, &aPhysX, &aPhysY, _acPos);
}
d1 = TOUCH_Abs(aPhysX[0] - aPhysX[1]);//*TOUCH_Abs()
d2 = TOUCH_Abs(aPhysX[2] - aPhysX[3]);
d3 = TOUCH_Abs(aPhysY[0] - aPhysY[3]);
d4 = TOUCH_Abs(aPhysY[1] - aPhysY[2]);
d5 = sqrt(d1*d1+d3*d3);
d6 = sqrt(d2*d2+d4*d4);
fac1 = (float)d1/d2;
fac2 = (float)d3/d4;
fac3 = (float)d5/d6;
if((fac1>0.95&&fac1<1.05)&&(fac2>0.95&&fac2<1.05)&&(fac3>0.95&&fac3<1.05)&&(d1!=0)&&(d2!=0)&&(d3!=0)&&(d4!=0))
{
break;
}
}
GUI_Clear(); /* μÃμ½D£×¼êyÖμoóÇåÆá */
GUI_TOUCH_Calibrate(0, aLogX[0], aLogX[3], (aPhysX[0]+aPhysX[2])/2, (aPhysX[1]+aPhysX[3])/2); /* D£×¼XÖá */
GUI_TOUCH_Calibrate(1, aLogY[0], aLogY[3], (aPhysY[0]+aPhysY[1])/2, (aPhysY[2]+aPhysY[3])/2); /* D£×¼YÖá */
/*
ÏÂÃæμÄÅD¶Ïóï¾äÖ÷òaêÇêμÏÖX,Y′¥Ãt·-×aμÄê¶±e£¬èç1ûóD·-×aμÄ»°£¬μ÷óÃemWinμÄ·-×aÖ¸áîÇD»»1yà′¡£
ÅD¶Ï·-×aμÄ·½·¨êÇ£oÏÔê¾Æá¶Ô½ÇμÄὸöADC×ø±ê£¬XoíYò»¸öêÇADCêyÖμμYÔö£¬ò»¸öêÇêyÖμμY¼õ£¬ÔòX,Y
·¢éú·-×aáË£¬èç1û¶¼êÇμYÔö»òÕßμY¼õËμÃ÷ûóD·-×a¡£
èç1ûXÖáμÄADCêyÖμ»òÕßYÖáμÄADCêyÖμ¾μÏñáË£¨¾μÏñêÇÏà¶ÔóúÂß¼-×ø±ê£¬ò2¾íêÇADC×ø±êà′ËμμÄ£©£¬óÃ
éÏÃæμÄGUI_TOUCH_Calibrateoˉêy¾íÄü¾àÕy1yà′¡£
*/
if(((aPhysX[0] > aPhysX[3]) && (aPhysY[0] < aPhysY[3])) || ((aPhysX[0] < aPhysX[3]) && (aPhysY[0] > aPhysY[3])))
{
GUI_TOUCH_SetOrientation(GUI_SWAP_XY);
ucXYChang = 1;
}
/* ±£′æ′¥Ãt2Îêyμ½EEPROMàïÃæ */
g_tTPSL.usAdcX1 = (aPhysX[0]+aPhysX[2])/2;
g_tTPSL.usAdcX2 = (aPhysX[1]+aPhysX[3])/2;
g_tTPSL.usAdcY1 = (aPhysY[0]+aPhysY[1])/2;
g_tTPSL.usAdcY2 = (aPhysY[2]+aPhysY[3])/2;
g_tTPSL.XYChange = ucXYChang;
ee_WriteBytes((uint8_t *)&g_tTPSL, 32758, sizeof(g_tTPSL));
/* ¶áè¡EEPROMÖDμÄ2Îêy */
ee_ReadBytes((uint8_t *)&g_tTPSL, 32758, sizeof(g_tTPSL));
if((g_tTPSL.usAdcX1 == ((aPhysX[0]+aPhysX[2])/2))&&
(g_tTPSL.usAdcX2 == ((aPhysX[1]+aPhysX[3])/2))&&
(g_tTPSL.usAdcY1 == ((aPhysY[0]+aPhysY[1])/2))&&
(g_tTPSL.usAdcY2 == ((aPhysY[2]+aPhysY[3])/2))&&
(g_tTPSL.XYChange == ucXYChang))
{
_DispStringCentered("Calibration Success\n");
ee_WriteBytes((uint8_t *)&TP_Adj_Flag, 3, 1);
}
else
{
_DispStringCentered("Calibration fail\n");
}
/* ÏÔê¾êó±ê */
GUI_CURSOR_Show();
while(1)
{
GUI_PID_STATE State;
GUI_TOUCH_GetState(&State);
if (State.Pressed == 1)
{
//GUI_FillCircle(State.x, State.y, 5);
GUI_SetPenSize(5);
GUI_DrawPoint(State.x, State.y);
}
GUI_Delay(1);
}
} |
|