由于网上找不到这个触摸屏 FT5336芯片的寄存器信息,只能从别人的驱动中找到寄存器信息,还好只需要配置个把寄存器,然后直接读取坐标信息即可,支持5个触摸点坐标读取。
原理图部分,芯片采用IIC通讯,地址为:0x70,2个IIC数据线,1个中断线,测试也比较简单,读取id寄存器0xA8,如果读取到数据为0x51,那么恭喜你,基本通讯已经成功了。
代码如下:
/*************************************************************************************************************
* 文件名 : FT5336.c
* 功能 : FT5336电容触摸屏驱动
* 作者 : cp1300@139.com
* 创建时间 : 2020-02-14
* 最后修改时间 : 2020-02-14
* 详细: FT5336默认开启的触摸中断输出,并且空闲高电平,中断为低电平触发
FT5336最大更新速度120Hz,支持5点触摸
*************************************************************************************************************/
#include "stm32f7xx.h"
#include "system.h"
#include "main.h"
#include "FT5336.h"
static bool FT5336_SetIntOutMode(FT5336_HANDLE *pHandle, bool isPolling);//FT5336芯片中断输出模式
/*************************************************************************************************************************
*函数 : bool FT5336_Init(FT5336_HANDLE *pHandle, u8 SlaveAddr,
bool (*Func_ReadReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum),
bool (*Func_WriteReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum))
*功能 : FT5336初始化
*参数 : pHandle:句柄;SlaveAddr通讯地址;Func_ReadReg:读寄存器接口;Func_WriteReg:写寄存器接口
*返回 : TRUE:初始化成功;FALSE:初始化失败
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2020-02-16
*最后修改时间 : 2020-02-16
*说明 : 需要提前初始化IIC接口
*************************************************************************************************************************/
bool FT5336_Init(FT5336_HANDLE *pHandle, u8 SlaveAddr,
bool (*Func_ReadReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum),
bool (*Func_WriteReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum))
{
u8 id;
u8 retry;
u8 temp;
if(pHandle == NULL || Func_ReadReg == NULL || Func_WriteReg == NULL)
{
DEBUG("FT5336_Init 无效的参数\r\n");
return FALSE;
}
pHandle->SlaveAddr = SlaveAddr; //通讯地址
pHandle->Func_ReadReg = Func_ReadReg; //读寄存器接口
pHandle->Func_WriteReg = Func_WriteReg; //写寄存器接口
pHandle->ActiveTouchCount = 0; //复位当前有效触摸点数量
pHandle->ActiveTouchIndex = 0; //复位当前处理的有效触摸点索引
pHandle->isInitialization = FALSE; //初始化未成功
//读取芯片id
for(retry = 0;retry < 5;retry ++)
{
id = FT5336_ReadID(pHandle); //读取芯片id
if(FT5336_ID_VALUE != id)
{
SYS_DelayMS(10);
}
}
if(FT5336_ID_VALUE != id)
{
DEBUG("[FT5336读取失败],无效的id:0x%02X\r\n",id);
return FALSE;
}
//查看工作模式
temp = 0xff;
pHandle->Func_ReadReg(pHandle->SlaveAddr, FT5336_DEV_MODE_REG, &temp, 1);
if(temp != FT5336_DEV_MODE_WORKING)
{
DEBUG("[FT5336]:异常的工作模式%d\r\n", temp);
}
//检查固件版本
temp = 0xff;
pHandle->Func_ReadReg(pHandle->SlaveAddr, FT5336_FIRMID_REG, &temp, 1);
if(temp == 0 || temp == 0xff)
{
DEBUG("[FT5336]:异常的固件版本%d\r\n", temp);
}
else
{
uart_printf("[FT5336固件版本]:0x%02X\r\n", temp);
}
//此处初始化成功了,进行后续操作
FT5336_SetIntOutMode(pHandle, TRUE); //设置触摸中断为低电平保持模式
FT5336_SetCtrlMode(pHandle, FT5336_CTRL_KEEP_ACTIVE_MODE); //设置FT5336芯片控制模式
pHandle->isInitialization = TRUE; //初始化成功了
return TRUE;
}
/*************************************************************************************************************************
*函数 : u8 FT5336_ReadID(FT5336_HANDLE *pHandle)
*功能 : FT5336读取芯片id
*参数 : pHandle:句柄
*返回 : id;0:无效
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2020-02-16
*最后修改时间 : 2020-02-16
*说明 :
*************************************************************************************************************************/
u8 FT5336_ReadID(FT5336_HANDLE *pHandle)
{
u8 id;
if(pHandle->Func_ReadReg(pHandle->SlaveAddr, FT5336_CHIP_ID_REG, &id, 1) == FALSE)
{
return 0; //读取失败
}
return id;
}
/*************************************************************************************************************************
*函数 : bool FT5336_SetIntOutMode(FT5336_HANDLE *pHandle, bool isPolling)
*功能 : FT5336芯片中断输出模式
*参数 : pHandle:句柄;isPolling:TRUE:触摸一直保持低电平,松开后恢复高电平;FALSE:触摸过程中定时输出低电平脉冲
*返回 : TRUE:成功;FALSE:失败
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2020-02-16
*最后修改时间 : 2020-02-16
*说明 : 用于设置触摸屏的触摸中断状态输出模式
*************************************************************************************************************************/
bool FT5336_SetIntOutMode(FT5336_HANDLE *pHandle, bool isPolling)
{
u8 regValue = 0;
if(isPolling) //触摸保持低电平
{
regValue = FT5336_G_MODE_INTERRUPT_POLLING;
}
else
{
regValue = FT5336_G_MODE_INTERRUPT_TRIGGER;
}
return pHandle->Func_WriteReg(pHandle->SlaveAddr, FT5336_GMODE_REG, ®Value, 1); //写入FT5336中断寄存器
}
/*************************************************************************************************************************
*函数 : bool FT5336_SetCtrlMode(FT5336_HANDLE *pHandle, FT5336_CTRL_MODE CtrlMode)
*功能 : 设置FT5336芯片控制模式
*参数 : pHandle:句柄;CtrlMode:控制模式;见:FT5336_CTRL_MODE
*返回 : TRUE:成功;FALSE:失败
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2020-02-16
*最后修改时间 : 2020-02-16
*说明 : 用于设置触摸屏的工作模式
*************************************************************************************************************************/
bool FT5336_SetCtrlMode(FT5336_HANDLE *pHandle, FT5336_CTRL_MODE CtrlMode)
{
u8 regValue = CtrlMode;
return pHandle->Func_WriteReg(pHandle->SlaveAddr, FT5336_CTRL_REG, ®Value, 1); //写入FT5336寄存器
}
/*************************************************************************************************************************
*函数 : u8 FT5336_GetTouchPointCount(FT5336_HANDLE *pHandle)
*功能 : FT5336芯片返回有效的触摸点数量
*参数 : pHandle:句柄
*返回 : 0-5:触摸点数量
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2020-02-16
*最后修改时间 : 2020-02-16
*说明 :
*************************************************************************************************************************/
u8 FT5336_GetTouchPointCount(FT5336_HANDLE *pHandle)
{
u8 nbTouch = 0;
//读取寄存器 FT5336_TD_STAT_REG 获取有效的触摸点数量
if(pHandle->Func_ReadReg(pHandle->SlaveAddr, FT5336_TD_STAT_REG, &nbTouch, 1) == FALSE)
{
nbTouch = 0;
}
nbTouch &= 0x07;
if(nbTouch > FT5336_MAX_DETECTABLE_TOUCH) //点数超过了最大值,读取的数据可能是无效的,直接清零
{
nbTouch = 0;
}
pHandle->ActiveTouchCount = nbTouch; //记录当前有效触摸点数量
pHandle->ActiveTouchIndex = 0; //复位当前处理的有效触摸点索引
return nbTouch;
}
/*************************************************************************************************************************
*函数 : u8 FT5336_GetTouchAreaInfo(FT5336_HANDLE *pHandle, FT5336_TOUCH_TYPE pTouchArea[FT5336_USER_TOUCHT_COUNT])
*功能 : FT5336获取触摸区域信息
*参数 : pHandle:句柄;pTouchArea:触摸区域信息,见FT5336_TOUCH_TYPE定义
*返回 : 0-5:触摸点数量
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2020-02-16
*最后修改时间 : 2020-02-16
*说明 : x,y坐标只有12bit有效位;x坐标的最高2位为触摸状态,具体值定义见:
*************************************************************************************************************************/
u8 FT5336_GetTouchAreaInfo(FT5336_HANDLE *pHandle, FT5336_TOUCH_TYPE pTouchArea[FT5336_USER_TOUCHT_COUNT])
{
u8 num;
u8 buff[FT5336_USER_TOUCHT_COUNT * FT5336_ONE_TOUCH_REG_CNT]; //读取缓冲区
u8 i;
u8 *p = buff;
num = FT5336_GetTouchPointCount(pHandle); //获取触摸点数量
if(num > FT5336_USER_TOUCHT_COUNT) num = FT5336_USER_TOUCHT_COUNT; //限制触摸点的数量-由用户决定支持的数量
if(num > 0) //有触摸,读取触摸点的信息
{
if(pHandle->Func_ReadReg(pHandle->SlaveAddr, FT5336_P1_XH_REG, buff, num * FT5336_ONE_TOUCH_REG_CNT) == FALSE)
{
DEBUG("读取触摸区域信息失败\r\n");
num = 0;
}
else //读取成功了,填充信息
{
for(i = 0;i < num;i ++)
{
#if(FT5336_TOUCH_POS_XY_EXCHANGE) //需要对调XY坐标
pTouchArea[i].Ypos = *p ++; //X高位
pTouchArea[i].Ypos <<= 8;
pTouchArea[i].Ypos |= *p ++; //X低位
pTouchArea[i].Event = (pTouchArea[i].Ypos >> FT5336_TOUCH_EVT_FLAG_SHIFT)&FT5336_TOUCH_EVT_FLAG_MASK; //Event
pTouchArea[i].Ypos &= FT5336_TOUCH_POS_DATA_MASK;
pTouchArea[i].Xpos = *p ++; //Y高位
pTouchArea[i].Xpos <<= 8;
pTouchArea[i].Xpos |= *p ++; //Y低位
pTouchArea[i].Xpos &= FT5336_TOUCH_POS_DATA_MASK;
#else //不需要对调
pTouchArea[i].Xpos = *p ++; //X高位
pTouchArea[i].Xpos <<= 8;
pTouchArea[i].Xpos |= *p ++; //X低位
pTouchArea[i].Event = (pTouchArea[i].Xpos >> FT5336_TOUCH_EVT_FLAG_SHIFT)&FT5336_TOUCH_EVT_FLAG_MASK; //Event
pTouchArea[i].Xpos &= FT5336_TOUCH_POS_DATA_MASK;
pTouchArea[i].Ypos = *p ++; //Y高位
pTouchArea[i].Ypos <<= 8;
pTouchArea[i].Ypos |= *p ++; //Y低位
pTouchArea[i].Ypos &= FT5336_TOUCH_POS_DATA_MASK;
#endif //FT5336_TOUCH_POS_XY_EXCHANGE
pTouchArea[i].Weight = *p ++; //触摸压力
pTouchArea[i].Area = *p ++; //触摸区域
}
}
}
return num;
}
//头文件
/*************************************************************************************************************
* 文件名 : FT5336.h
* 功能 : FT5336电容触摸屏驱动
* 作者 : cp1300@139.com
* 创建时间 : 2020-02-14
* 最后修改时间 : 2020-02-14
* 详细: 使用的IIC与FT5336通讯
*************************************************************************************************************/
#ifndef __FT5336_H__
#define __FT5336_H__
#include "system.h"
#include "SoftwareIIC.h"
#define FT5336_IIC_SLAVE_ADDRESS ((u8)0x70) //FT5336 IIC通讯地址
//触摸屏宽高定义
#define FT5336_MAX_WIDTH ((u16)480) //触摸屏最大宽度
#define FT5336_MAX_HEIGHT ((u16)272) //触摸屏最大高度
#define FT5336_TOUCH_POS_XY_EXCHANGE 1 //是否将横坐标与纵坐标对调
//芯片支持的最大触摸点数
#define FT5336_MAX_DETECTABLE_TOUCH (0x05)
//FT5336的当前工作模式寄存器,用于判断触摸屏是否在正常工作
#define FT5336_DEV_MODE_REG ((u8)0x00)
#define FT5336_DEV_MODE_WORKING ((u8)0x00) //默认工作模式
#define FT5336_DEV_MODE_FACTORY ((u8)0x04) //工厂模式
#define FT5336_DEV_MODE_MASK ((u8)0x07)
#define FT5336_DEV_MODE_SHIFT ((u8)0x04)
//手势ID寄出去你
#define FT5336_GEST_ID_REG ((u8)0x01)
//相关手势值
#define FT5336_GEST_ID_NO_GESTURE ((u8)0x00)
#define FT5336_GEST_ID_MOVE_UP ((u8)0x10)
#define FT5336_GEST_ID_MOVE_RIGHT ((u8)0x14)
#define FT5336_GEST_ID_MOVE_DOWN ((u8)0x18)
#define FT5336_GEST_ID_MOVE_LEFT ((u8)0x1C)
#define FT5336_GEST_ID_SINGLE_CLICK ((u8)0x20)
#define FT5336_GEST_ID_DOUBLE_CLICK ((u8)0x22)
#define FT5336_GEST_ID_ROTATE_CLOCKWISE ((u8)0x28)
#define FT5336_GEST_ID_ROTATE_C_CLOCKWISE ((u8)0x29)
#define FT5336_GEST_ID_ZOOM_IN ((u8)0x40)
#define FT5336_GEST_ID_ZOOM_OUT ((u8)0x49)
//触摸数据状态寄存器:读取将有效触摸点的数量 (0..5)
#define FT5336_TD_STAT_REG ((u8)0x02)
//XH或YH的最高2位代表的触摸按钮状态信息
#define FT5336_TOUCH_EVT_FLAG_PRESS_DOWN ((u8)0x00)
#define FT5336_TOUCH_EVT_FLAG_LIFT_UP ((u8)0x01)
#define FT5336_TOUCH_EVT_FLAG_CONTACT ((u8)0x02)
#define FT5336_TOUCH_EVT_FLAG_NO_EVENT ((u8)0x03)
#define FT5336_TOUCH_EVT_FLAG_SHIFT ((u8)12) //从X坐标的最高2位获取EVT
#define FT5336_TOUCH_EVT_FLAG_MASK ((u8)3)
//触摸区域坐标的掩码-12bit有效值
#define FT5336_TOUCH_POS_DATA_MASK ((u16)0x0FFF) //掩码
//触摸区域信息相关寄存器
#define FT5336_ONE_TOUCH_REG_CNT 6 //一个触摸点由6个寄存器组成
//#1触摸点信息
#define FT5336_P1_XH_REG ((u8)0x03) //X坐标信息
#define FT5336_P1_XL_REG ((u8)0x04)
#define FT5336_P1_YH_REG ((u8)0x05) //Y坐标信息
#define FT5336_P1_YL_REG ((u8)0x06)
#define FT5336_P1_WEIGHT_REG ((u8)0x07) //触摸点压力
#define FT5336_P1_MISC_REG ((u8)0x08) //触摸区域
//#2触摸点信息
#define FT5336_P2_XH_REG ((u8)0x09)
#define FT5336_P2_XL_REG ((u8)0x0A)
#define FT5336_P2_YH_REG ((u8)0x0B)
#define FT5336_P2_YL_REG ((u8)0x0C)
#define FT5336_P2_WEIGHT_REG ((u8)0x0D)
#define FT5336_P2_MISC_REG ((u8)0x0E)
//#3触摸点信息
#define FT5336_P3_XH_REG ((u8)0x0F)
#define FT5336_P3_XL_REG ((u8)0x10)
#define FT5336_P3_YH_REG ((u8)0x11)
#define FT5336_P3_YL_REG ((u8)0x12)
#define FT5336_P3_WEIGHT_REG ((u8)0x13)
#define FT5336_P3_MISC_REG ((u8)0x14)
//#4触摸点信息
#define FT5336_P4_XH_REG ((u8)0x15)
#define FT5336_P4_XL_REG ((u8)0x16)
#define FT5336_P4_YH_REG ((u8)0x17)
#define FT5336_P4_YL_REG ((u8)0x18)
#define FT5336_P4_WEIGHT_REG ((u8)0x19)
#define FT5336_P4_MISC_REG ((u8)0x1A)
//#5触摸点信息
#define FT5336_P5_XH_REG ((u8)0x1B)
#define FT5336_P5_XL_REG ((u8)0x1C)
#define FT5336_P5_YH_REG ((u8)0x1D)
#define FT5336_P5_YL_REG ((u8)0x1E)
#define FT5336_P5_WEIGHT_REG ((u8)0x1F)
#define FT5336_P5_MISC_REG ((u8)0x20)
//控制寄存器-设置模式
#define FT5336_CTRL_REG ((u8)0x86)
//Active模式 正常模式,没有触摸是依旧保持活动,功耗大
#define FT5336_CTRL_KEEP_ACTIVE_MODE ((u8)0x00)
//Monitor模式 省电模式,没有触摸时自动从活动模式切换到监控模式,降低功耗
#define FT5336_CTRL_KEEP_AUTO_SWITCH_MONITOR_MODE ((u8)0x01)
//Hibernate模式 休眠模式
#define FT5336_CTRL_HIBERNATE_MODE ((u8)0x02)
//Monitor模式下:无触摸时从活动模式切换到监控模式的时间段寄存器
#define FT5336_TIMEENTERMONITOR_REG ((u8)0x87)
//Active模式下更新速度寄存器
#define FT5336_PERIODACTIVE_REG ((u8)0x88)
//Monitor模式下更新速度寄存器
#define FT5336_PERIODMONITOR_REG ((u8)0x89)
//中断模式寄存器(在中断模式下使用)
#define FT5336_GMODE_REG ((u8)0xA4)
#define FT5336_G_MODE_INTERRUPT_POLLING ((u8)0x00) //中断模式-触摸过程中保持低电平自己轮训
#define FT5336_G_MODE_INTERRUPT_TRIGGER ((u8)0x01) //脉冲触发模式-触摸过程中输出脉冲-默认模式
//FT5336 芯片ID寄存器
#define FT5336_CHIP_ID_REG ((u8)0xA8)
#define FT5336_ID_VALUE ((u8)0x51) //FT5336 芯片ID
//下面这些寄存器暂时用不上,也找不到资料
//旋转手势模式下的最小允许角度值寄存器
#define FT5336_RADIAN_VALUE_REG ((u8)0x91)
//左移和右移手势时的最大偏移寄存器
#define FT5336_OFFSET_LEFT_RIGHT_REG ((u8)0x92)
//上移和下移手势时的最大偏移寄存器
#define FT5336_OFFSET_UP_DOWN_REG ((u8)0x93)
//左右移动手势时的最小距离寄存器
#define FT5336_DISTANCE_LEFT_RIGHT_REG ((u8)0x94)
//向上和向下手势时的最小距离寄存器
#define FT5336_DISTANCE_UP_DOWN_REG ((u8)0x95)
//放大和缩小手势时的最大距离寄存器
#define FT5336_DISTANCE_ZOOM_REG ((u8)0x96)
//LIB版本信息的高8位寄存器
#define FT5336_LIB_VER_H_REG ((u8)0xA1)
//LIB版本信息的低8位寄存器
#define FT5336_LIB_VER_L_REG ((u8)0xA2)
//芯片选择寄存器
#define FT5336_CIPHER_REG ((u8)0xA3)
//当前的电源模式-只读寄存器
#define FT5336_PWR_MODE_REG ((u8)0xA5)
//FT5336固件版本寄存器
#define FT5336_FIRMID_REG ((u8)0xA6)
//发布代码版本寄存器
#define FT5336_RELEASE_CODE_ID_REG ((u8)0xAF)
//FT5336系统当前的运行模式寄存器-只读
#define FT5336_STATE_REG ((u8)0xBC)
//滤波系数寄存器
#define FT5336_TH_DIFF_REG ((u8)0x85)
//触摸检测阈值
#define FT5336_TH_GROUP_REG ((u8)0x80)
#define FT5336_USER_TOUCHT_COUNT 5 //用户定义的触摸点数量支持1-FT5336_MAX_DETECTABLE_TOUCH
#if( FT5336_USER_TOUCHT_COUNT == 0 || FT5336_USER_TOUCHT_COUNT > FT5336_MAX_DETECTABLE_TOUCH)
#error("定义的无效的触摸点数量支持!");
#endif //FT5336_USER_TOUCHT_COUNT
//工作模式
typedef enum
{
FT5336_ACTIVE_MODE = FT5336_CTRL_KEEP_ACTIVE_MODE, //Active模式 正常模式,没有触摸是依旧保持活动,功耗大
FT5336_MONITOR_MODE = FT5336_CTRL_KEEP_AUTO_SWITCH_MONITOR_MODE, //Monitor模式 省电模式,没有触摸时自动从活动模式切换到监控模式,降低功耗
FT5336_HIBERNATE_MODE = FT5336_CTRL_HIBERNATE_MODE, //Hibernate模式 休眠模式
}FT5336_CTRL_MODE;
//触摸区域定义
typedef struct
{
u16 Xpos; //触摸区域中心X坐标
u16 Ypos; //触摸区域中心Y坐标
u8 Weight; //触摸的压力
u8 Area; //触摸区域
u8 Event; //触摸状态
}FT5336_TOUCH_TYPE;
//FT5336 句柄
typedef struct
{
bool (*Func_ReadReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum); //功能接口-读寄存器
bool (*Func_WriteReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum); //功能接口-写寄存器
bool isInitialization; //是否初始化成功了
u8 SlaveAddr; //通讯地址
u8 ActiveTouchCount; //当前有效触摸点数量
u8 ActiveTouchIndex; //当前处理的有效触摸点索引
}FT5336_HANDLE;
//FT5336初始化
bool FT5336_Init(FT5336_HANDLE *pHandle, u8 SlaveAddr,
bool (*Func_ReadReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum),
bool (*Func_WriteReg)(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum));
u8 FT5336_ReadID(FT5336_HANDLE *pHandle); //FT5336读取芯片id
u8 FT5336_GetTouchPointCount(FT5336_HANDLE *pHandle); //FT5336芯片返回有效的触摸点数量
bool FT5336_SetCtrlMode(FT5336_HANDLE *pHandle, FT5336_CTRL_MODE CtrlMode); //设置FT5336芯片控制模式
u8 FT5336_GetTouchAreaInfo(FT5336_HANDLE *pHandle, FT5336_TOUCH_TYPE pTouchArea[FT5336_USER_TOUCHT_COUNT]);//FT5336获取触摸区域信息
#endif //__FT5336_H__
IIC部分代码自己去实现,我这边就不再例举了,下面是我的IIC读写寄存器接口
//触摸屏IIC读取寄存器接口
bool TP_FT5336_IIC_ReadReg(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum)
{
return SIIC_ReadReg(&g_SysGlobal.mIIC_Handle, SlaveAddr, RegAddr, TRUE, pDataBuff, ByteNum);
}
//触摸屏IIC写寄存器接口
bool TP_FT5336_IIC_WriteReg(u16 SlaveAddr, u8 RegAddr, u8 *pDataBuff, u16 ByteNum)
{
return SIIC_WriteReg(&g_SysGlobal.mIIC_Handle, SlaveAddr, RegAddr, TRUE, pDataBuff, ByteNum);
}
//初始化
FT5336_IO_Init(); //触摸屏IO进行初始化
isStatus = FT5336_Init(&g_SysGlobal.mFT5336_Handle, FT5336_IIC_SLAVE_ADDRESS, TP_FT5336_IIC_ReadReg, TP_FT5336_IIC_WriteReg);
//中断IO定义
/
//TOUCH FT5336 触摸屏
#define FT5336_INT_Pin() PIin(13)
#define FT5336_INT_EFFECTIVE_LEVEL 0 //中断有效电平:低电平
//触摸屏IO初始化
__inline void FT5336_IO_Init(void)
{
SYS_DeviceClockEnable(DEV_GPIOI,TRUE); //GPIO I 时钟使能
SYS_GPIOx_OneInit(GPIOI, 13, IN_FLOATING, IN_NONE); //PI13输入
}
//获取触摸按下状态
__inline bool FT5336_GetisTouchDown(void) {if(FT5336_INT_Pin() == FT5336_INT_EFFECTIVE_LEVEL) return TRUE; else return FALSE;}
//测试代码,测试设计到LCD屏幕操作,你也可以注释掉LCD屏幕操作部分,使用printf打印触摸按钮相关的信息
//触摸屏测试
if(1)
{
FT5336_TOUCH_TYPE TouchArea[2][FT5336_USER_TOUCHT_COUNT];
u32 ColorBuff[FT5336_USER_TOUCHT_COUNT] = {0xFFFF8080, 0xFF80FF80, 0xFF8080FF, 0xFF808080, 0xFF80FFFF};
u8 i;
u8 temp;
bool isFist[FT5336_USER_TOUCHT_COUNT];
memset(isFist, TRUE, FT5336_USER_TOUCHT_COUNT);
while(1)
{
LED1 = FT5336_GetisTouchDown();
if(FT5336_GetisTouchDown() == TRUE)
{
temp = FT5336_GetTouchAreaInfo(&g_SysGlobal.mFT5336_Handle, TouchArea[0]);
if(temp > 0)
{
for(i = 0;i < temp;i ++)
{
if(isFist[i] == TRUE) //首次启动
{
memcpy(&TouchArea[1][i], &TouchArea[0][i], sizeof(FT5336_TOUCH_TYPE)); //初始化[1]中存储上一次的坐标
isFist[i] = FALSE; //去掉状态
}
else //非首次触摸
{
GDI_DrawLine(pLTDC_Layer1_GRAM_HANDLE, TouchArea[1][i].Xpos, TouchArea[1][i].Ypos,TouchArea[0][i].Xpos, TouchArea[0][i].Ypos,ColorBuff[i]); //绘制直线(可以倾斜)
memcpy(&TouchArea[1][i], &TouchArea[0][i], sizeof(FT5336_TOUCH_TYPE)); //缓存本次的坐标到[1]
}
//uart_printf("触摸点%d:\tX:%d\tY:%d\t", i+1, TouchArea[i].Xpos, TouchArea[i].Ypos);
//uart_printf("压力:%d\t区域:%d\tEvent:%d\r\n", TouchArea[i].Weight, TouchArea[i].Area, TouchArea[i].Event);
}
uart_printf("\r\n");
}
OSTimeDlyHMSM(0,0,0,10);
}
else
{
memset(isFist, TRUE, FT5336_USER_TOUCHT_COUNT);//抬起来了,清零
OSTimeDlyHMSM(0,0,0,30);
}
}
}
把GUI相关的注释掉,直接用串口打印调试信息最简单,就是下面2行代码
//uart_printf("触摸点%d:\tX:%d\tY:%d\t", i+1, TouchArea[i].Xpos, TouchArea[i].Ypos);
//uart_printf("压力:%d\t区域:%d\tEvent:%d\r\n", TouchArea[i].Weight, TouchArea[i].Area, TouchArea[i].Event);
下面是我的测试效果,触摸绘图
代码只经过简单的测试,发现可以用,具体实际使用过程中如果有bug欢迎指正。