???????一般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
#define GT1151Q_CFGS_REG 0x8050
#define GT1151Q_PID_REG 0x8140
#define GT1151Q_GSTID_REG 0x814E
#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
#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;
u16 y;
u16 size;
}StructTouchPoint;
核心代码
???????作为核心功能为获取触点坐标的芯片,获取的数据可通过存放于以下结构体:
typedef struct
{
u8 pointNum;
u8 pointFlag[POINT_NUM_MAX];
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);
regValue = regValue & 0x0F;
dev->pointNum = regValue;
regValue = 0;
IICCommonWriteBytesEx(&s_structIICDev, GT1151Q_GSTID_REG, ®Value, 1);
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;
}
}
}
|