硬件:
STM32F407ZG + GT9147
其中: GT9147使用模拟I2C通讯SCL和SDA。
还有RST复位引脚。
INT中断引脚:为有效减轻主CPU负担,有触摸时GT9147才会通知主CPU读取坐标信息。
触摸屏类似矩阵键盘通过x和y确定点击位置。
移植厂商触摸芯片GT9147驱动。
我们只需关心下面几个寄存器的值。
芯片状态寄存器,很关键。
由于芯片支持最多5点触摸,故还需要读取下面每个触摸点的坐标数据。
触摸扫描函数代码:
typedef struct{
uint16_t touchnumber;
uint16_t x[TOUCH_NUMBER];
uint16_t y[TOUCH_NUMBER];
}Coordinates_TypeDef;
const uint16_t GT9147_TPX_TBL[5] =
{ GT_TP1_REG, GT_TP2_REG, GT_TP3_REG, GT_TP4_REG, GT_TP5_REG };
Coordinates_TypeDef Coordinates = {0};
uint8_t GT9147_ScanTouch(void)
{
struct TouchStatus{
uint8_t NumberOfTouch : 4;
uint8_t HaveKey : 1;
uint8_t ProximityValid : 1;
uint8_t LargeDetect : 1;
uint8_t BufferStatus : 1;
};
uint8_t i = 0;
uint8_t temp[4] = {0};
struct TouchStatus touch = {0};
GT9147_RD_Reg(GT_GSTID_REG, (uint8_t*)&touch, 1);
GT9147_WR_Reg(GT_GSTID_REG, temp, 1);
memset(&Coordinates, 0, sizeof(Coordinates_TypeDef));
if(touch.BufferStatus == 0) return 0;
if(touch.NumberOfTouch > 5 || touch.NumberOfTouch == 0) return 0;
Coordinates.touchnumber = touch.NumberOfTouch;
for(i = 0; i < touch.NumberOfTouch; i++)
{
GT9147_RD_Reg(GT9147_TPX_TBL[i], temp, 4);
memcpy(&Coordinates.x[i], temp, 2);
memcpy(&Coordinates.y[i], temp + 2, 2);
//printf("i = %d, x = %d, y = %d\r\n", i, Coordinates.x[i], Coordinates.y[i]);
}
return 1;
}
测试代码:F407TFT-LCD4.rar_stm32cubeide触摸屏-嵌入式文档类资源-CSDN下载
全篇完。
本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可加入QQ群657407920下载交流经验。感谢~!