一般LCD都会组合触摸屏以扩展相应的功能,这里要注意,触摸屏和LCD是不同的东西,前者用于收集用户的触控信息,后者用于显示。人机交互实际上是单片机通过触摸屏收集到触控信息后,根据触控在LCD上显示。下面介绍触摸屏的原理及相应触摸屏驱动芯片的作用。
触摸屏
组成
触摸屏分为表面电容式触摸屏和投射式触摸屏。前者不透光,一般用于如笔记本电脑触控板之类的非显示领域;后者透光,一般用在手机屏幕等显示领域。投射式触摸屏实际上由三层物质组成,如下图所示:
三层物质的特点如下:
名称 | 特点 | 作用 |
---|---|---|
保护玻璃 | 手指直接接触的地方 | 保护内部结构 |
ITO层 | 有电极组成,具有导电性和透光性 | 用于完成触控检测的核心部件 |
基板 | 具有相应接口,承上启下 | 支撑、连接检测电路 |
检测原理
触摸屏按照检测原理可以分为交互电容型和自我电容型,交互电容型触摸屏的ITO层XY两组电极之间彼此结合组成电容,而自我电容型触摸屏两组电极与地构成电容,结构上的差别也导致检测方法的差别,这里介绍一下交互电容型触摸屏检测方法。
交互式电容触摸屏的ITO层XY轴之间的电容位置代表了触摸屏的实际坐标,检测电容的充电时间即可确定是否有手指按下,和电容按键原理类似。检测触点坐标时,第1条X轴的电极发出激励信号,所有Y轴的电极接收信号,通过检测交互电容的充电时间可检测出各条Y轴与第1条X轴相交的交互电容的大小。接着各条X轴依次发出激励信号,Y轴重复上述步骤,根据得到的触摸屏电容量变化的二维数据表,即可得知触摸点的坐标。
GT1151Q芯片
简介
触摸屏控制芯片用于检测ITO层电极之间电容的变化,从而得到手指按压的具体坐标,同时将这些坐标和状态信息进行编码,并保存在芯片内部相应的寄存器内,供微控制器读取和调用。
GT1151Q芯片触摸扫描频率为120Hz,检测通道有16个驱动通道和29个感应通道,两种通道分别对应ITO层的X和Y电极数,数字越大表示检测坐标的精度越高。GT1151Q最高支持10点触控,其引脚功能如下表所示:
引脚号 | 名称 | 功能描述 |
---|---|---|
1 ~ 3 | DRV02 ~ DRV00 | 触摸驱动信号输出 |
4 | DRV00 | 模拟地 |
5 ~ 33 | SENS00 ~ SENS28 | 触摸模拟信号输入 |
34 | AVDD28 | 模拟电压输入 |
35 | AVDD22 | LDO输出 |
36 | DVDD12 | LDO输出 |
37 | DGND | 数字地 |
38 | INT | 中断信号 |
39 ~ 40 | Sensor_OPT1 ~ Sensor_OPT2 | 模组识别口 |
41 | I2C_SDA | I2C数据信号 |
42 | I2C_SCL | I2C时钟信号 |
43 | NC | |
44 | VDDIO | GPIO电平控制 |
45 | /RST | 系统复位脚 |
46 ~ 58 | DRV15 ~ DRV03 | 触摸驱动信号输出 |
GT1151Q芯片的大部分引脚与触摸屏连接,用于输出触摸驱动信号和获取触摸模拟信号,只有4个引脚与开发板连接,分别是INT、/RST、I2C_SCL和I2C_SDA。其中INT为中断引脚,用于检测坐标变化,/RST为复位引脚,I2C_SCL和I2C_SDA为I2C接口的时钟线和数据线。
GT1151Q芯片使用I2C协议与微控制器进行通信,器件地址为0x14。
寄存器
这里将要介绍一下GT1151Q芯片相应的寄存器,在相应文件可使用宏定义方便控制:
#define GT1151Q_CTRL_REG 0x8040 //GT1151Q控制寄存器
#define GT1151Q_CFGS_REG 0x8050 //GT1151Q配置起始地址寄存器
#define GT1151Q_PID_REG 0x8140 //GT1151Q产品ID寄存器
#define GT1151Q_GSTID_REG 0x814E //GT1151Q当前检测到的触摸情况
#define GT1151Q_TP1_REG 0x8150 //第一个触摸点数据地址
#define GT1151Q_TP2_REG 0x8158 //第二个触摸点数据地址
#define GT1151Q_TP3_REG 0x8160 //第三个触摸点数据地址
#define GT1151Q_TP4_REG 0x8168 //第四个触摸点数据地址
#define GT1151Q_TP5_REG 0x8170 //第五个触摸点数据地址
//IIC设备地址(含最低位)
#define GT1151Q_DEVICE_ADDR 0x28
控制寄存器(0x8040)
控制寄存器用于设置GT1151Q芯片完成相应的操作,具体介绍如下表:
状态寄存器(0x814E)
状态寄存器用于存储当前的触点数目,具体介绍如下表,其中bit7为标志位,触点不为0时该位为1,并且不会自动清零。bit3 ~ bit0为触点数目:
坐标寄存器(0x8150 ~ 0x819D)
坐标寄存器用于存储触点信息,共有60个,即每个触点通过6个寄存器存储信息,以触点1为例,如下表所示,0x8150 ~ 0x8151用于存储触点1X坐标值的低字节和高字节,0x8152 ~ 0x8153用于存储触点1Y坐标值的低字节和高字节,0x8154 ~ 0x8155用于存储触点1的宽和高:
对触点坐标值的存放,可使用以下结构体:
typedef struct
{
u16 x; //横坐标,0xFFFF表示无效值
u16 y; //纵坐标,0xFFFF表示无效值
u16 size; //触点大小
}StructTouchPoint;
核心代码
作为核心功能为获取触点坐标的芯片,获取的数据可通过存放于以下结构体:
typedef struct
{
u8 pointNum; //触摸点数,最多支持POINT_NUM_MAX个触摸点
u8 pointFlag[POINT_NUM_MAX]; //触摸点按下标志位,1-触摸点按下,0-未检测到触摸点按下
StructTouchPoint point[POINT_NUM_MAX]; //坐标点数据
}StructTouchDev;
通过以下函数可获取数据(仅供参考):
void ScanGT1151Q(StructTouchDev* dev)
{
static u16 s_arrRegAddr[5] = {GT1151Q_TP1_REG, GT1151Q_TP2_REG, GT1151Q_TP3_REG, GT1151Q_TP4_REG, GT1151Q_TP5_REG};//各个触点数据地址
u8 regValue;
u8 buf[6];
u8 i;
u16 swap;
//读取状态寄存器
IICCommonReadBytesEx(&s_structIICDev, GT1151Q_GSTID_REG, ®Value, 1, IIC_COMMON_NACK);//读取地址为GT1151Q_GSTID_REG,长度为1字节的数据至regValue中
regValue = regValue & 0x0F;
//记录触摸点个数
dev->pointNum = regValue;
//清除状态寄存器
regValue = 0;
IICCommonWriteBytesEx(&s_structIICDev, GT1151Q_GSTID_REG, ®Value, 1);
//循环获取5个触摸点数据
for(i = 0; i < 5; i++)
{
//检测到触点
if(dev->pointNum >= (i + 1))
{
IICCommonReadBytesEx(&s_structIICDev, s_arrRegAddr[i], buf, 6, IIC_COMMON_NACK);
dev->point[i].x = (buf[1] << 8) | buf[0];
dev->point[i].y = (buf[3] << 8) | buf[2];
dev->point[i].size = (buf[5] << 8) | buf[4];
//横屏坐标转换
if(1 == s_structLCDDev.dir)
{
swap = dev->point[i].x;
dev->point[i].x = dev->point[i].y;
dev->point[i].y = swap;
dev->point[i].x = 800 - dev->point[i].x;
}
//标记触摸点按下
dev->pointFlag[i] = 1;
}
//未检测到触点
else
{
dev->pointFlag[i] = 0; //未检测到
dev->point[i].x = 0xFFFF; //无效值
dev->point[i].y = 0xFFFF; //无效值
}
}
}