Files
lcd_model/BSP/gt911.c
T
2025-06-20 11:48:33 +08:00

270 lines
6.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "gt911.h"
#include "math.h"
#include <stdlib.h>
//GT911(原GT9147)配置参数表
//第一个字节为版本号(0X60),必须保证新的版本号大于等于GT911内部
//flash原有版本号,才会更新配置.
const uint8_t GT9147_CFG_TBL[]=
{
0X60,0XE0,0X01,0X20,0X03,0X05,0X35,0X00,0X02,0X08,
0X1E,0X08,0X50,0X3C,0X0F,0X05,0X00,0X00,0XFF,0X67,
0X50,0X00,0X00,0X18,0X1A,0X1E,0X14,0X89,0X28,0X0A,
0X30,0X2E,0XBB,0X0A,0X03,0X00,0X00,0X02,0X33,0X1D,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X32,0X00,0X00,
0X2A,0X1C,0X5A,0X94,0XC5,0X02,0X07,0X00,0X00,0X00,
0XB5,0X1F,0X00,0X90,0X28,0X00,0X77,0X32,0X00,0X62,
0X3F,0X00,0X52,0X50,0X00,0X52,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,
0X0F,0X03,0X06,0X10,0X42,0XF8,0X0F,0X14,0X00,0X00,
0X00,0X00,0X1A,0X18,0X16,0X14,0X12,0X10,0X0E,0X0C,
0X0A,0X08,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X29,0X28,0X24,0X22,0X20,0X1F,0X1E,0X1D,
0X0E,0X0C,0X0A,0X08,0X06,0X05,0X04,0X02,0X00,0XFF,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF
};
/*创建触摸结构体*/
touch_struct User_Touch;
void GT911_WriteReg(uint16_t _usRegAddr, uint8_t *_pRegBuf, uint8_t _ucLen)
{
HAL_I2C_Mem_Write(&GT911_I2C, GT911_DIV_W, _usRegAddr, I2C_MEMADD_SIZE_16BIT, _pRegBuf, _ucLen, 0xff);
}
void GT911_ReadReg(uint16_t _usRegAddr, uint8_t *_pRegBuf, uint8_t _ucLen)
{
HAL_I2C_Mem_Read(&GT911_I2C, GT911_DIV_R, _usRegAddr, I2C_MEMADD_SIZE_16BIT, _pRegBuf, _ucLen, 0xff);
}
/*
配置gt911,发送gt911配置参数
参数1mode0,参数不保存到flash1,参数保存到flash
*/
void GT911_Send_Config(uint8_t mode)
{
uint8_t buf[2];
buf[0] = 0;
buf[1] = mode; //是否写入到GT9147 FLASH? 即是否掉电保存
for(uint8_t i=0; i<sizeof(GT9147_CFG_TBL); i++)
{
buf[0] += GT9147_CFG_TBL[i];//计算校验和
}
buf[0]=(~buf[0])+1;
GT911_WriteReg(GT_CFGS_REG, (uint8_t *)GT9147_CFG_TBL, sizeof(GT9147_CFG_TBL));//发送寄存器配置
GT911_WriteReg(GT_CHECK_REG, buf, 2);//写入校验和,和配置更新标记
}
/*
功能:软件复位gt911
参数1gt_SR_type(为1时开始软件复位,为0时结束软件复位)
*/
void GT911_Software_Reset(uint8_t gt_SR_type)
{
uint8_t _temp=0; //中间变量
if(gt_SR_type)
{
_temp=2;
GT911_WriteReg(GT_CTRL_REG, &_temp, 1);
}
else
{
_temp=0;
GT911_WriteReg(GT_CTRL_REG, &_temp, 1);
}
}
/*
功能:gt911触摸扫描,判断当前是否被触摸
参数1
*/
uint8_t GT911_Scanf(void)
{
if(User_Touch.status & 0x40)
{
uint8_t touch_status = 0;
GT911_ReadReg(GT_GSTID_REG, &touch_status, 1);
User_Touch.number = (touch_status & 0x0f); //获取触摸点数
User_Touch.state = (TOUCH_STATE_enum)(touch_status & 0x80); //触摸状态
switch(User_Touch.state) //判断是否有触摸数据
{
case TOUCH__NO:{ //没有数据
User_Touch.state &= 0x7F;
return 0;
}break;
case TOUCH_ING:{ //触摸中~后,有数据,并读出数据
/*
if(User_Touch.number == 0)
{
break;
}
*/
uint8_t _temp = 0; //中间变量
//static uint8_t touch_data[30];
//GT911_ReadReg(GT_TPD_Sta, touch_data, User_Touch.number * 6);
// 处理触摸数据
for (int i = 0; i < User_Touch.number; i++)
{
/*
User_Touch.point[i].x = touch_data[i * 8 + X_L] | touch_data[i * 8 + X_H] << 8;
User_Touch.point[i].y = touch_data[i * 8 + Y_L] | touch_data[i * 8 + Y_H] << 8;
User_Touch.point[i].s = touch_data[i * 8 + S_L] | touch_data[i * 8 + S_H] << 8;
*/
uint16_t x = 0,y = 0;
GT911_ReadReg((GT_TPD_Sta + i*8 + X_L), &_temp, 1); //读出触摸x坐标的低8位
x = _temp;
GT911_ReadReg((GT_TPD_Sta + i*8 + X_H), &_temp, 1); //读出触摸x坐标的高8位
x |= (_temp<<8);
GT911_ReadReg((GT_TPD_Sta + i*8 + Y_L), &_temp, 1); //读出触摸y坐标的低8位
y = _temp;
GT911_ReadReg((GT_TPD_Sta + i*8 + Y_H), &_temp, 1); //读出触摸y坐标的高8位
y |= (_temp<<8);
GT911_ReadReg((GT_TPD_Sta + i*8 + S_L), &_temp, 1); //读出触摸大小数据的低8位
User_Touch.point[i].s = _temp;
GT911_ReadReg((GT_TPD_Sta + i*8 + S_H), &_temp, 1); //读出触摸大小数据的高8位
User_Touch.point[i].s |= (_temp<<8);
User_Touch.point[i].x = abs(480 - y);
User_Touch.point[i].y = x;
}
// 清除标志位
touch_status = 0;
GT911_WriteReg(GT_GSTID_REG, &touch_status, 1);
}break;
}
User_Touch.status &= 0xBF;
}
return User_Touch.number;
}
void GT911_getPos(uint16_t *x,uint16_t *y)
{
(*x) = User_Touch.point[0].x;
(*y) = User_Touch.point[0].y;
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//return;
if (GPIO_Pin == CTP_INIT_Pin)
{
if(User_Touch.status & 0x80)
{
User_Touch.status |= 0x40;
}
}
}
/*
* 函数名称: GT911_Init
* 功能描述: 初始化GT911触摸屏
* 传入参数: 无
* 返回值: 0,初始化成功;1,初始化失败
*/
uint8_t GT911_Init(uint8_t addr)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = CTP_RST_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(CTP_RST_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = CTP_INIT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(CTP_INIT_GPIO_Port, &GPIO_InitStruct);
if(addr == 0x28)
{
HAL_GPIO_WritePin(CTP_RST_GPIO_Port,CTP_RST_Pin,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(CTP_INIT_GPIO_Port,CTP_INIT_Pin,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(CTP_INIT_GPIO_Port,CTP_INIT_Pin,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(CTP_RST_GPIO_Port,CTP_RST_Pin,GPIO_PIN_SET);
HAL_Delay(2000);
}
else //默认是 0xBA
{
HAL_GPIO_WritePin(CTP_RST_GPIO_Port,CTP_RST_Pin,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(CTP_INIT_GPIO_Port,CTP_INIT_Pin,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(CTP_RST_GPIO_Port,CTP_RST_Pin,GPIO_PIN_SET);
HAL_Delay(2000);
}
GPIO_InitStruct.Pin = CTP_INIT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(CTP_INIT_GPIO_Port, &GPIO_InitStruct);
HAL_Delay(100);
//Software_Reset(1);
User_Touch.status = 0x80;
User_Touch.state = (TOUCH_STATE_enum)0;
User_Touch.number = 0;
//Software_Reset(0);
return 0;
}