一、触摸芯片简介 7inch Capacitive Touch LCD (F) 是电容触摸屏,触控芯片是GT811,如下为GT811的中文数据手册。 GT811可同时识别5个触摸点位的实时位置,移动轨迹及触摸面积。其管脚定义如下。 参考应用电路如下图,实际上我们在使用的时候只需关心四个引脚即可。I2C_SDA,I2C_SCL为I2C通信引脚,/RSTB为系统复位引脚,INT为中断信号引脚,但有触摸时,INT输出触发信号,如果MCU对应的管脚开启外部中断则会触发MCU进入外部中断。 二、GT811控制方式 GT811提供标准的I2C通信接口,由SCL和SDA与MCU进行通信,其最高通信速度为600K bps。 GT811 的从设备地址有三组可选,以方便主控调配。三组地址分别为:0xBA/0xBB、 0x6E/0x6F 和 0x28/0x29。即:0xBA——对 GT811 进行写操作;0xBB——对 GT811 进行读操作。 上图为主 CPU 对 GT811 进行的写操作流程图。首先主 CPU 产生一个起始信号, 然后发送地址信息及读写位信息“0”表示写操作:0XBA。 在收到应答后,主 CPU 发送寄存器的 16 位地址,随后是 8 位要写入到寄存器的 数据内容。 GT811 寄存器的地址指针会在写操作后自动加 1,所以当主 CPU 需要对连续地 址的寄存器进行写操作时,可以在一次写操作中连续写入。写操作完成,主 CPU 发送停止信号结束当前写操作。 上图为主 CPU 对 GT811 进行的读操作流程图。首先主 CPU 产生一个起始信号, 然后发送设备地址信息及读写位信息“0”表示写操作:0XAA。 在收到应答后,主 CPU 发送首寄存器的 16 位地址信息,设置要读取的寄存器地 址。在收到应答后,主 CPU 重新发送一次起始信号,发送读操作:0XAB。收到 应答后,主 CPU 开始读取数据。 GT811 同样支持连续的读操作,默认为连续读取数据。主 CPU 在每收到一个 Byte 数据后需发送一个应答信号表示成功接收。在接收到所需的最后一个 Byte 数据 后,主 CPU 发送“非应答信号 NACK”,然后再发送停止信号结束通讯。 GT811有两组寄存器,一组为配置&功能设置寄存器,在初始化的时候配置。触摸屏配置参数由制造商提供。我们只需了解下面这个四个寄存器即可,此处为设置显示屏的分辨率。 另一组为输出信息寄存器,读取这组寄存器既可以判断当前屏幕的触摸状态。TouchpointFlag寄存器存储当前触摸的点数,tp0~tp4位触点状态标识为,当tp0置1时,即表示有触点0按下。 GT811最多支持5个触点,若刚开始一次由三个触点按下,tp0,tp1,tp2均置1,表示有三个触点。若此时第二个触点释放,则tp1清零,只有tp0,tp2为1。当再次有触点按下时,则为tp1置1,最新按下的是触点2,而不是触点3和触点4。 三、新建工程 本章在前面显示字符个工程上修改,复制刚才的的工程修改文件夹名。打开Cube工程更加原理图重新配置。PD7设置为中断输入,本章采用模拟I2C,PD12,PD13设置为GPIO输出模式,PD11输出GPIO输出。并设置用户标签。 开启外部中断。 生成报告以及初始化代码,编译程序。若程序没有出错,下载下面的应用程序解压放在BSP文件里面并添加进工程中。 其中 TS_I2C 为模拟 I2C 驱动程序,下面为读写寄存器操作函数。 /*******************************************************************************
* Function Name : I2C_WR_Reg
* Description : Writes to the selected register.
* Input : - reg: address of the selected register.
* - buf: Need to write the BUF pointer.
* - len: The length of the array
* Output : None
* Return : ret
-0 succeed
-1 error
* Attention : None
*******************************************************************************/
uint8_t I2C_WriteReg(uint8_t I2c_Addr,uint16_t reg,uint8_t *buf,uint8_t len)
{
uint8_t i;
uint8_t ret=0;
I2C_Start();
I2C_Send_Byte(I2c_Addr); //Slaver Addr
I2C_Wait_Ack();
#ifdef I2C_MEMADD_16BIT
I2C_Send_Byte(reg>>8); //Data Addr high
I2C_Wait_Ack();
#endif
I2C_Send_Byte(reg&0xFF); //Data Addr low
I2C_Wait_Ack();
for(i=0;i<len;i++)
{
I2C_Send_Byte(buf[i]);
ret=I2C_Wait_Ack();
if(ret)break;
}
I2C_Stop();
return ret;
}
/*******************************************************************************
* Function Name : i2C_RD_Reg
* Description : Writes to the selected register.
* Input : - reg: address of the selected register.
* - buf: Need to read the BUF pointer.
* - len: The length of the array
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
void I2C_ReadReg(uint8_t I2c_Addr,uint16_t reg,uint8_t *buf,uint8_t len)
{
uint8_t i;
I2C_Start();
I2C_Send_Byte(I2c_Addr);
I2C_Wait_Ack();
#ifdef I2C_MEMADD_16BIT
I2C_Send_Byte(reg>>8); //Data Addr high
I2C_Wait_Ack();
#endif
I2C_Send_Byte(reg&0xFF); //Data Addr low
I2C_Wait_Ack();
I2C_Stop();
I2C_Start();
I2C_Send_Byte(I2c_Addr+1);
I2C_Wait_Ack();
for(i=0;i<len;i++)
{
buf[i]=I2C_Read_Byte(i==(len-1)?0:1);
}
I2C_Stop();
}GT811.c为触摸芯片的驱动文件,下面简单介绍一下初始化函数和读取触摸状态函数。程序开始先拉低复位管脚复位芯片,注意如果延时时间过短则会导致复位不成功。读取GT811的ID值判断通信是否正常。设置屏幕分辨率并将配置参数写入到配置&功能寄存器组中。TS_StateTypeDef结构体在GT811.h中定义。删除原来的应用代码,在main文件中添加头文件。声明变量,其中TS_State为当前触摸状态,TS_BKState为上一次触摸状态。TS_flag为触摸标志,TouchPoit存储触点数。PointColor存储各个触点的显示颜色。 /* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
TS_StateTypeDef TS_State={0};
uint8_t TS_flag ;
uint8_t TouchPoit;
TS_StateTypeDef TS_BKState;
uint8_t value = 0;
uint16_t i;
uint32_t PointColor[]={LCD_COLOR_BLUE,LCD_COLOR_GREEN,LCD_COLOR_RED,LCD_COLOR_MAGENTA,LCD_COLOR_YELLOW};
/* USER CODE END PV */在while循环中添加如下应用程序,程序首先判断触摸标志,如果有触摸,则读取触摸状态。循环中分为三分部,第一部分即清楚上次显示的内容,即将显示内容设为背景色黑色覆盖。第二部分在对应触摸的位置显示一个点和水平垂直量两条先。第三部分就这次的触摸状态存储到备份状态结构体中,以便下一次擦除。 在main文件后面添加外部中断回调函数,当屏幕有触摸是触发中断,触摸标志位置1。 |