📄 touchscreen.c
字号:
/**
******************************************************************************
* @file touchscreen.c
* @author MCD Application Team
* @version V2.0.0
* @date 11-July-2011
* @brief Touchscreen Driver
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "touchscreen.h"
#include "graphicObject.h"
#include "TscHal.h"
#include "LcdHal.h"
/** @addtogroup Embedded_GUI_Library
* @{
*/
/** @defgroup touchscreen
* @brief touchscreen main functions
* @{
*/
/* External variables --------------------------------------------------------*/
/* Private typedef -----------------------------------------------------------*/
/* Private defines -----------------------------------------------------------*/
#define RESCALE_FACTOR 1000000
#define CalibrationDone_Offset ((uint8_t)0 * sizeof(uint32_t))
#define A2_Offset ((uint8_t)1 * sizeof(uint32_t))
#define B2_Offset ((uint8_t)2 * sizeof(uint32_t))
#define C2_Offset ((uint8_t)3 * sizeof(uint32_t))
#define D2_Offset ((uint8_t)4 * sizeof(uint32_t))
#define E2_Offset ((uint8_t)5 * sizeof(uint32_t))
#define F2_Offset ((uint8_t)6 * sizeof(uint32_t))
/* Private macros ------------------------------------------------------------*/
#define TS_ReadCalibrationVaraible(offset) (*(__IO uint32_t*)(CalibrationAddr + offset))
/* Private variables ---------------------------------------------------------*/
int32_t A2 = 0, B2 = 0, C2 = 0, D2 = 0, E2 = 0, F2 = 0;
/* Pointer to Penultimate Flash Memory Address */
uint32_t EndAddr = 0;
uint32_t CalibrationAddr = 0;
uint32_t TSC_Value_X;
uint32_t TSC_Value_Y;
/* Flash Memory Variables */
uint32_t EraseCounter = 0x00;
uint32_t FlashFree_Address = 0;
__IO uint32_t NbrOfPage = 0x00;
__IO TSC_FLASH_Status TSC_FlashStatus;
__IO TSC_Flash_TestStatus TSC_MemoryProgramStatus;
/* Private function prototypes -----------------------------------------------*/
static void TS_SaveCalibrationVariables(void);
/* Private functions ---------------------------------------------------------*/
/**
* @brief Calibrate TouchScreen coordinates by LCD touch in 5 points
* @param None
* @retval None
*/
void TS_Calibration(void)
{
uint32_t coordinate_X1a = 0, coordinate_X2a = 0, coordinate_X3a = 0, coordinate_X4a = 0, coordinate_X5a = 0;
uint32_t coordinate_Y1a = 0, coordinate_Y2a = 0, coordinate_Y3a = 0, coordinate_Y4a = 0, coordinate_Y5a = 0;
uint32_t coordinate_X1b = 0, coordinate_X2b = 0, coordinate_X3b = 0, coordinate_X4b = 0, coordinate_X5b = 0;
uint32_t coordinate_Y1b = 0, coordinate_Y2b = 0, coordinate_Y3b = 0, coordinate_Y4b = 0, coordinate_Y5b = 0;
uint32_t coordinate_X1 = 0, coordinate_X2 = 0, coordinate_X3 = 0, coordinate_X4 = 0, coordinate_X5 = 0;
uint32_t coordinate_Y1 = 0, coordinate_Y2 = 0, coordinate_Y3 = 0, coordinate_Y4 = 0, coordinate_Y5 = 0;
uint16_t Xd1 = (LCD_Width / 2), Xd2 = 1 * (LCD_Width / 5), Xd3 = 4 * (LCD_Width / 5), Xd4 = 4 * (LCD_Width / 5), Xd5 = 1 * (LCD_Width / 5);
uint16_t Yd1 = (LCD_Height / 2), Yd2 = 1 * (LCD_Height / 5), Yd3 = 1 * (LCD_Height / 5), Yd4 = 4 * (LCD_Height / 5), Yd5 = 4 * (LCD_Height / 5);
double A = 0.0, B = 0.0, C = 0.0, D = 0.0, E = 0.0, F = 0.0;
double d = 0.0, dx1 = 0.0, dx2 = 0.0, dx3 = 0.0, dy1 = 0.0, dy2 = 0.0, dy3 = 0.0;
uint32_t X2_1 = 0, X2_2 = 0, X2_3 = 0, X2_4 = 0, X2_5 = 0;
uint32_t Y2_1 = 0, Y2_2 = 0, Y2_3 = 0, Y2_4 = 0, Y2_5 = 0;
uint32_t XxY_1 = 0, XxY_2 = 0, XxY_3 = 0, XxY_4 = 0, XxY_5 = 0;
uint32_t XxXd_1 = 0, XxXd_2 = 0, XxXd_3 = 0, XxXd_4 = 0, XxXd_5 = 0;
uint32_t YxXd_1 = 0, YxXd_2 = 0, YxXd_3 = 0, YxXd_4 = 0, YxXd_5 = 0;
uint32_t XxYd_1 = 0, XxYd_2 = 0, XxYd_3 = 0, XxYd_4 = 0, XxYd_5 = 0;
uint32_t YxYd_1 = 0, YxYd_2 = 0, YxYd_3 = 0, YxYd_4 = 0, YxYd_5 = 0;
uint32_t alfa = 0, beta = 0, chi = 0, Kx = 0, Ky = 0, Lx = 0, Ly = 0;
uint16_t epsilon = 0, fi = 0, Mx = 0, My = 0;
GL_SetBackColor(GL_White);
GL_SetTextColor(GL_Black);
GL_Clear(White);
GL_DisplayAdjStringLine(3 * (LCD_Height / 7), LCD_Width - 25, "Run Calibration.", GL_FALSE);
GL_Delay(40);
GL_DisplayAdjStringLine(3 * (LCD_Height / 7), LCD_Width - 25, "Run Calibration..", GL_FALSE);
GL_Delay(40);
GL_DisplayAdjStringLine(3 * (LCD_Height / 7), LCD_Width - 25, "Run Calibration...", GL_FALSE);
GL_Delay(30);
touch_done = 0;
GL_Clear(White);
GL_Cross( (LCD_Height / 2), (LCD_Width / 2) ); /* Absolute Central Point */
while ( touch_done == 0)
{
TSC_Read();
}
coordinate_X1a = TSC_Value_X;
coordinate_Y1a = TSC_Value_Y;
GL_Delay(90); /* This is to catch only one touch event */
TSC_Init();
touch_done = 0;
GL_Clear(White);
GL_Cross(1*(LCD_Height / 5), 1*(LCD_Width / 5)); /* Nord-East Corner point */
while ( touch_done == 0)
{
TSC_Read();
}
coordinate_X2a = TSC_Value_X;
coordinate_Y2a = TSC_Value_Y;
GL_Delay(90); /* This is to catch only one touch event */
TSC_Init();
touch_done = 0;
GL_Clear(White);
GL_Cross(1*(LCD_Height / 5), 4*(LCD_Width / 5)); /* Nord-West Corner */
while ( touch_done == 0)
{
TSC_Read();
}
coordinate_X3a = TSC_Value_X;
coordinate_Y3a = TSC_Value_Y;
GL_Delay(90); /* This is to catch only one touch event */
TSC_Init();
touch_done = 0;
GL_Clear(White);
GL_Cross(4*(LCD_Height / 5), 4*(LCD_Width / 5)); /* Sud-West Corner */
while ( touch_done == 0)
{
TSC_Read();
}
coordinate_X4a = TSC_Value_X;
coordinate_Y4a = TSC_Value_Y;
GL_Delay(90); /* This is to catch only one touch event */
TSC_Init();
touch_done = 0;
GL_Clear(White);
GL_Cross(4*(LCD_Height / 5), 1*(LCD_Width / 5)); /* Sud-East Corner point */
while ( touch_done == 0)
{
TSC_Read();
}
coordinate_X5a = TSC_Value_X;
coordinate_Y5a = TSC_Value_Y;
GL_Delay(90); /* This is to catch only one touch event */
TSC_Init();
touch_done = 0;
GL_Clear(White);
GL_Cross( (LCD_Height / 2), (LCD_Width / 2) ); /* Absolute Central Point */
while ( touch_done == 0)
{
TSC_Read();
}
coordinate_X1b = TSC_Value_X;
coordinate_Y1b = TSC_Value_Y;
GL_Delay(90); /* This is to catch only one touch event */
TSC_Init();
touch_done = 0;
GL_Clear(White);
GL_Cross(1*(LCD_Height / 5), 1*(LCD_Width / 5)); /* Nord-East Corner point */
while ( touch_done == 0)
{
TSC_Read();
}
coordinate_X2b = TSC_Value_X;
coordinate_Y2b = TSC_Value_Y;
GL_Delay(90); /* This is to catch only one touch event */
TSC_Init();
touch_done = 0;
GL_Clear(White);
GL_Cross(1*(LCD_Height / 5), 4*(LCD_Width / 5)); /* Nord-West Corner */
while ( touch_done == 0)
{
TSC_Read();
}
coordinate_X3b = TSC_Value_X;
coordinate_Y3b = TSC_Value_Y;
GL_Delay(90); /* This is to catch only one touch event */
TSC_Init();
touch_done = 0;
GL_Clear(White);
GL_Cross(4*(LCD_Height / 5), 4*(LCD_Width / 5)); /* Sud-West Corner */
while ( touch_done == 0)
{
TSC_Read();
}
coordinate_X4b = TSC_Value_X;
coordinate_Y4b = TSC_Value_Y;
GL_Delay(90); /* This is to catch only one touch event */
TSC_Init();
touch_done = 0;
GL_Clear(White);
GL_Cross(4*(LCD_Height / 5), 1*(LCD_Width / 5)); /* Sud-East Corner point */
while ( touch_done == 0)
{
TSC_Read();
}
coordinate_X5b = TSC_Value_X;
coordinate_Y5b = TSC_Value_Y;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -