/** * @brief Returns Status and positions of the Touch screen. * @param None * @retval Pointer to TS_STATE structure holding Touch Screen information. */ TS_STATE* IOE_TS_GetState(void) { uint16_t xDiff, yDiff , x , y; static uint16_t _x = 0, _y = 0; /* Check if the Touch detect event happened */ TS_State.TouchDetected = (I2C_ReadDeviceRegister(IOE_1_ADDR, IOE_REG_TSC_CTRL) & 0x80); if(TS_State.TouchDetected) { x = IOE_TS_Read_X(); y = IOE_TS_Read_Y(); xDiff = x > _x? (x - _x): (_x - x); yDiff = y > _y? (y - _y): (_y - y); if (xDiff + yDiff > 5) { _x = x; _y = y; } } /* Update the X position */ TS_State.X = _x; /* Update the Y position */ TS_State.Y = _y; /* Update the Z position index */ TS_State.Z = IOE_TS_Read_Z(); /* Clear the interrupt pending bit and enable the FIFO again */ I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_FIFO_STA, 0x01); I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_FIFO_STA, 0x00); /* Return pointer to the updated structure */ return &TS_State; }
/** * @brief Lcd_Touch Calibration test * @param None * @retval None */ void Lcd_Touch_Calibration(void) { #define CURSOR_LEN (10) uint8_t k,i; float ratio1,ratio2; Point_Struct left_upper_point,right_upper_point,left_down_point,right_down_point,tst_point; int tpx_sum = 0,tpy_sum = 0; /*Indicates whether Calibration is OK*/ uint8_t adjust_OK_Falg = 0; TS_STATE *pstate = NULL; /* Clear the LCD */ LCD_Clear(White); LCD_SetTextColor(Red); delay(100); while (!adjust_OK_Falg) { tpx_sum = 0; tpy_sum = 0; /*wait for Calibration */ for (k = 0;k < 4;k++) { LCD_DrawUniLine( point_Base[k].x - CURSOR_LEN, point_Base[k].y, point_Base[k].x + CURSOR_LEN, point_Base[k].y); LCD_DrawUniLine( point_Base[k].x, point_Base[k].y - CURSOR_LEN, point_Base[k].x, point_Base[k].y + CURSOR_LEN); do { pstate = IOE_TS_GetState(); } while(!pstate->TouchDetected); delay(10); /*Read AD convert result*/ for(i = 0; i < 16; i++) { tpx_sum += IOE_TS_Read_X(); tpy_sum += IOE_TS_Read_Y(); delay(2); } tpx_sum >>= 4; tpy_sum >>= 4; switch (k) { case 0: left_upper_point.x = tpx_sum; left_upper_point.y = tpy_sum; break; case 1: right_upper_point.x = tpx_sum; right_upper_point.y = tpy_sum; break; case 2: left_down_point.x = tpx_sum; left_down_point.y = tpy_sum; break; case 3: right_down_point.x = tpx_sum; right_down_point.y = tpy_sum; break; default: break; } delay(200); } ratio1 = (float)((point_Base[1].x - point_Base[0].x) + (point_Base[3].x - point_Base[2].x)) / 2.0; ratio2 = (float)((right_upper_point.x - left_upper_point.x) + (right_down_point.x - left_down_point.x)) / 2.0; adjust_Para.xScale = ratio1 / ratio2; ratio1 = (float)((point_Base[2].y - point_Base[0].y) + (point_Base[3].y - point_Base[1].y)) / 2.0; ratio2 = (float)((left_down_point.y - left_upper_point.y) + (right_down_point.y - right_upper_point.y)) / 2.0; adjust_Para.yScale = ratio1 / ratio2; ratio1 = (((float)right_upper_point.x * adjust_Para.xScale - (float)point_Base[1].x) + ((float)left_upper_point.x * adjust_Para.xScale - (float)point_Base[0].x)) / 2.0; adjust_Para.xOffset = (int)ratio1; ratio1 = (((float)right_upper_point.y * adjust_Para.yScale - (float)point_Base[1].y) + ((float)left_upper_point.y * adjust_Para.yScale - (float)point_Base[0].y)) / 2.0; adjust_Para.yOffset = (int)ratio1; /*Draw cross sign for calibration points*/ LCD_DrawUniLine(point_Base[4].x - CURSOR_LEN, point_Base[4].y, point_Base[4].x + CURSOR_LEN, point_Base[4].y); LCD_DrawUniLine(point_Base[4].x, point_Base[4].y - CURSOR_LEN, point_Base[4].x, point_Base[4].y + CURSOR_LEN); do { pstate = IOE_TS_GetState(); } while(!pstate->TouchDetected); delay(10); tpx_sum = 0; tpy_sum = 0; /*Read AD convert result*/ for(i = 0; i < 16; i++) { tpx_sum += IOE_TS_Read_X(); tpy_sum += IOE_TS_Read_Y(); delay(2); } tpx_sum >>= 4; tpy_sum >>= 4; tst_point.x = tpx_sum; tst_point.y = tpy_sum; tst_point.x = (int)(tst_point.x * adjust_Para.xScale - adjust_Para.xOffset); tst_point.y = (int)(tst_point.y * adjust_Para.yScale - adjust_Para.yOffset); if (tst_point.x > (point_Base[4].x + CALIBRATION_RANGE) || tst_point.x < (point_Base[4].x - CALIBRATION_RANGE) || tst_point.y > (point_Base[4].y + CALIBRATION_RANGE) || tst_point.y < (point_Base[4].y - CALIBRATION_RANGE)) { adjust_OK_Falg = 0; LCD_DisplayStringLine(LINE(8)," Calibration Fail! "); delay(200); LCD_Clear(White); delay(300); } else { adjust_OK_Falg = 1; } } LCD_DisplayStringLine(LINE(8)," Calibration OK! "); delay(200); }