CST816S触摸驱动

本文针对淘宝所购买的1.69寸LCD触摸屏驱动进行讲解。

屏幕购买链接如下:

1.69寸全视角IPSTFT彩屏 液晶显示屏SPI位接口ST7789V驱动工业屏-淘宝网 (taobao.com) 

我们先搞一下IIC驱动

	#define CST816_SCL_Clr() 	HAL_GPIO_WritePin(TP_SCL_GPIO_Port,TP_SCL_Pin, GPIO_PIN_RESET)//SCL=SCLK
	#define CST816_SCL_Set() 	HAL_GPIO_WritePin(TP_SCL_GPIO_Port,TP_SCL_Pin, GPIO_PIN_SET)

	#define CST816_SDA_IN() 	GPIO_InitStruct.Pin = TP_SDA_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(TP_SDA_GPIO_Port, &GPIO_InitStruct)
	#define CST816_SDA_Get()	HAL_GPIO_ReadPin(TP_SDA_GPIO_Port,TP_SDA_Pin)

	#define CST816_SDA_OUT()	GPIO_InitStruct.Pin = TP_SDA_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(TP_SDA_GPIO_Port, &GPIO_InitStruct)
	#define CST816_SDA_Clr() 	HAL_GPIO_WritePin(TP_SDA_GPIO_Port,TP_SDA_Pin, GPIO_PIN_RESET)
	#define CST816_SDA_Set() 	HAL_GPIO_WritePin(TP_SDA_GPIO_Port,TP_SDA_Pin, GPIO_PIN_SET)

由于我所用到的是HAL库,所以这里针对IIC驱动做了宏定义。

用标准库的开发者可以根据需要进行改动。

//模拟IIC部分的函数声明
void CST816_IIC_ACK(void);
void CST816_IIC_NACK(void);
unsigned char CST816_IIC_Wait_ACK(void);
void CST816_IIC_Start(void);
void CST816_IIC_Stop(void);
void CST816_IIC_SendByte(unsigned char byte);
void CST816_IIC_WriteREG(unsigned char reg,unsigned char date);
unsigned char CST816_IIC_ReadREG(unsigned char reg);
unsigned char CST816_IIC_RecvByte(void);

我们IIC的目的是对CST816的寄存器进行读写,所以根据手册内容,我们做出下面的寄存器声明

//CST816寄存器
#define GestureID			0x01		//手势寄存器
#define FingerNum			0x02		//手指数量
#define XposH				0x03		//x高四位
#define XposL				0x04		//x低八位
#define YposH				0x05		//y高四位
#define YposL				0x06		//y低八位
#define ChipID				0xA7		//芯片型号
#define	MotionMask		    0xEC		//触发动作
#define AutoSleepTime	    0xF9		//自动休眠
#define IrqCrl				0xFA		//中断控制
#define AutoReset			0xFB		//无手势休眠
#define LongPressTime	    0xFC		//长按休眠
#define DisAutoSleep	    0xFE		//使能低功耗模式

多数寄存器我们是不需要去打理的,我们最关心的是XposH、XposL、YposH、YposL用于读取手指触摸位置的坐标,以及FingerNum用于读取触摸状态

typedef struct
{
	unsigned char chipID;
	unsigned int X_Pos;			//X坐标
	unsigned int Y_Pos;			//Y坐标
	unsigned char Sta;			//记录触摸状态	
}CST816_Info;

接下来我们创建触摸屏实例,用于触摸屏的信息管理,内容包括芯片ID,X\Y坐标,以及触摸状态等。

下面是函数实现

//IIC驱动实现
#include "CST816.h"
#include "math.h"


CST816_Info	CST816_Instance;			//创建CST816实例。

#define delay_num 4        //宏定义延时时间



GPIO_InitTypeDef GPIO_InitStruct = {0};

//IIC起始信号
void CST816_IIC_Start(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
	
  CST816_SDA_OUT();
	
  CST816_SDA_Set();
  CST816_SCL_Set();
  delay_us(delay_num);	
  CST816_SDA_Clr();
  delay_us(delay_num); 
  CST816_SCL_Clr();
}

//IIC停止信号
void CST816_IIC_Stop(void)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	CST816_SDA_OUT();
	
	CST816_SCL_Clr(); 
	CST816_SDA_Clr();  
	delay_us(delay_num);	
	CST816_SCL_Set();
	CST816_SDA_Set();
	delay_us(delay_num);
}

//发送ACK应答
void CST816_IIC_ACK(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  CST816_SDA_OUT();
	
  CST816_SCL_Clr();
  CST816_SDA_Clr();
  delay_us(delay_num);     
  CST816_SCL_Set();
  delay_us(delay_num);                  
  CST816_SCL_Clr();   
}

//发送NACK不应答
void CST816_IIC_NACK(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  CST816_SDA_OUT();
	
  CST816_SCL_Clr();
  CST816_SDA_Set();
  delay_us(delay_num);     
  CST816_SCL_Set();
  delay_us(delay_num);                  
  CST816_SCL_Clr(); 
}

//等待IIC应答信号
unsigned char CST816_IIC_Wait_ACK(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  unsigned char t = 0;

	CST816_SDA_IN();
	CST816_SDA_Set();
	delay_us(delay_num); 
	CST816_SCL_Set();
	delay_us(delay_num); 
	while(CST816_SDA_Get())
	{
		t++;
		if(t>250)
		{
			CST816_IIC_Stop();
			return 1;
		}
	}
  CST816_SCL_Clr();              
  return 0;	
}


//IIC发送一字节数据
void CST816_IIC_SendByte(unsigned char byte)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	unsigned char  BitCnt;
	CST816_SDA_OUT();
	CST816_SCL_Clr();
	for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位
	{
		if(byte&0x80) CST816_SDA_Set();//判断发送位
		else CST816_SDA_Clr(); 
		byte<<=1;
		delay_us(delay_num); 
		CST816_SCL_Set();
		delay_us(delay_num);
		CST816_SCL_Clr();
		delay_us(delay_num);
	}
}

//IIC接收一字节数据
unsigned char CST816_IIC_RecvByte(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  unsigned char retc;
  unsigned char BitCnt;
  retc=0; 
  CST816_SDA_IN();//置数据线为输入方式                
  for(BitCnt=0;BitCnt<8;BitCnt++)
  {        
		CST816_SCL_Clr();
		delay_us(delay_num);
		CST816_SCL_Set();//置时钟线为高使数据线上数据有效                
		retc=retc<<1;
		if(CST816_SDA_Get()) retc++;//读数据位,接收的数据位放入retc中 
		delay_us(delay_num);
  }
  return(retc);
}

//IIC写入指定寄存器数据
void CST816_IIC_WriteREG(unsigned char reg,unsigned char date)
{
	CST816_IIC_Start();
	CST816_IIC_SendByte(0x2A);
	CST816_IIC_Wait_ACK();
	CST816_IIC_SendByte(reg);
	CST816_IIC_Wait_ACK();
	CST816_IIC_SendByte(date);
	CST816_IIC_Wait_ACK();
	CST816_IIC_Stop();
	HAL_Delay(10);
}

//IIC读取指定寄存器数据
unsigned char CST816_IIC_ReadREG(unsigned char reg)
{
	unsigned char date;
	CST816_IIC_Start();
	CST816_IIC_SendByte(0x2A);
	CST816_IIC_Wait_ACK();
	CST816_IIC_SendByte(reg);
	CST816_IIC_Wait_ACK();
	CST816_IIC_Start();
//	delay_us(4);
	CST816_IIC_SendByte(0x2B);
	CST816_IIC_Wait_ACK();
	date=CST816_IIC_RecvByte();
	CST816_IIC_ACK();
	CST816_IIC_Stop();
//	delay_us(5);
	return date;
}

 IIC协议部分不展开介绍,我们来看有关CST816寄存器的读取

void CST816_Init(void)
{
    //我自己不需要做任何操作,由于习惯就写了Init函数。
    //可根据自己需求进行修改
}
unsigned char CST816_Get_ChipID()
{
	return CST816_IIC_ReadREG(ChipID);    //读取芯片ID
}


void CST816_Get_XY()
{

    //这个函数非常值得注意,为什么我没有使用上面提到的直接读取指定寄存器的函数,
    //因为这个CST816芯片的原因,当读取过XY坐标四个寄存器之中的任意一个之后,其他寄存器会被清空,得到的数据不准确。
    //因此必须连续读取,这样也可以学习下IIC总线的读取逻辑嘛对不对。

	unsigned char temp[4];
	unsigned int x,y;
	
	CST816_IIC_Start();
	CST816_IIC_SendByte(0x2A);
	CST816_IIC_Wait_ACK();
	CST816_IIC_SendByte(0x03);
	CST816_IIC_Wait_ACK();
	CST816_IIC_Start();
//	delay_us(4);
	CST816_IIC_SendByte(0x2B);
	CST816_IIC_Wait_ACK();
	temp[0]=CST816_IIC_RecvByte();
	CST816_IIC_ACK();
	temp[1]=CST816_IIC_RecvByte();
	CST816_IIC_ACK();
	temp[2]=CST816_IIC_RecvByte();
	CST816_IIC_ACK();
	temp[3]=CST816_IIC_RecvByte();
	CST816_IIC_ACK();
	CST816_IIC_Stop();
	
	x=(unsigned int)((temp[0]&0x0F)<<8)|temp[1];//(temp[0]&0X0F)<<4|
	y=(unsigned int)((temp[2]&0x0F)<<8)|temp[3];//(temp[2]&0X0F)<<4|
	if(x<240&&y<280)
	{
		CST816_Instance.X_Pos	=	x;
		CST816_Instance.Y_Pos	=	y;
	}
}



unsigned char CST816_Get_Sta()
{
	unsigned char sta;
	
	CST816_IIC_Start();
	CST816_IIC_SendByte(0x2A);
	CST816_IIC_Wait_ACK();
	CST816_IIC_SendByte(0x01);
	CST816_IIC_Wait_ACK();
	CST816_IIC_Start();
//	delay_us(4);
	CST816_IIC_SendByte(0x2B);
	CST816_IIC_Wait_ACK();
	CST816_IIC_RecvByte();
	CST816_IIC_ACK();
	sta=CST816_IIC_RecvByte();
	CST816_IIC_ACK();
	CST816_IIC_Stop();
	if(sta!=255&sta!=0)return 1;
	else return 0;     
}

剩下的寄存器用到的情况很少,如果有需要可以自己去定义一个函数。

类似这样,仅做展示,作者并没有测试是否可行,就不帖出来喽~

unsigned char CST816_Get_Sta(void);			//更新触摸状态
void CST816_Set_MotionMask(unsigned char Motion);
void CST816_Set_IrqCtrl(unsigned char IRQCtrl);
void CST816_Set_AutoRST(unsigned char time);				//设置多长时间无触摸自动复位,默认5s,写0则禁用功能
void CST816_Set_LongPressRST(unsigned char time);		//设置长按多长时间复位,默认为10s,写0禁用功能
void CST816_Set_AutoSleep(unsigned char en);				//是否使能自动进入低功耗模式

unsigned char CST816_Get_Gesture(void);

 

  • 19
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 37
    评论
### 回答1: CST816S是一本关于特定设备或产品的数据手册。这份手册会提供关于CST816S设备的详细信息,供用户参考使用。 首先,手册会介绍CST816S设备的规格和技术参数。包括设备的尺寸、重量、电源要求等等。这些信息对于用户了解设备的外观和基本要求非常有帮助。 其次,手册会详细介绍CST816S设备的主要功能和特点。比如,它可能会提供的测量或实验功能,以及不同的工作模式或设置选项。用户可以通过这些信息了解到CST816S设备的适用范围,并根据自己的需求进行配置和操作。 此外,手册还可能提供关于CST816S的操作指南和建议。例如,它可能会解释设备的操作方法,以及如何解决一些常见问题。这对于初次接触CST816S设备的用户来说非常有价值,可以帮助他们快速上手并提高工作效率。 最后,手册还可能提供CST816S设备的安全注意事项和维护建议。设备的操作必须遵守相关的安全规定,而适当的维护可以延长设备的使用寿命和保持良好的工作状态。手册中的这些信息对于用户的安全和设备的长期使用都非常重要。 总之,CST816S数据手册会为用户提供关于设备的规格、功能、操作指南、安全注意事项和维护建议的详细信息。这将帮助用户更好地了解和使用CST816S设备,以满足他们的需要和要求。 ### 回答2: CST816S是一款数据手册,帮助用户了解和使用该设备的功能和特性。该手册包含了详细的技术规格、使用说明和常见问题解答,可以作为用户日常操作和故障排除的参考指南。 首先,CST816S的技术规格包括外观尺寸、重量、工作环境要求等详细信息。用户可以通过阅读这些规格了解该设备是否适用于自己的工作场景,以及是否满足自己的需求。 其次,该数据手册提供了使用说明,包括设备的启动和关闭、功能设置、数据传输等操作步骤。用户可以根据手册上的指导来正确使用设备,从而提高工作效率。 此外,手册还列出了常见问题和解答,用户可以通过查看手册来解决设备操作中遇到的一些常见问题。这些问题包括设备无法启动、无法连接到计算机、数据传输异常等等,手册中给出了可能的原因和解决方法,方便用户在遇到问题时快速解决。 综上所述,CST816S数据手册是一份重要的参考资料,用户可以通过阅读手册了解设备的技术规格,掌握正确的使用方法,并且在操作过程中遇到问题时能够得到解答。这将帮助用户更好地利用CST816S设备进行工作。 ### 回答3: CST816S是一款具有丰富功能和高性能的数据手册。这个数据手册是为了帮助用户更好地了解和使用CST816S而设计的。 首先,CST816S拥有强大的计算能力,能够处理大量的数据。它配备了高性能的处理器和大容量的存储空间,能够快速、准确地分析和处理各种数据。 其次,CST816S拥有多种传感器,能够实时采集和监测各种物理参数。例如,它可以测量温度、湿度、气压、光线强度等,并能够通过无线传输技术将这些数据传输到其他设备上。 此外,CST816S还具有高度的可定制性。用户可以根据自己的需求,自定义参数和设置,以满足各种不同的应用场景。它还支持多种通信接口,方便与其他设备进行连接和数据交换。 随着物联网技术的快速发展,CST816S还具有广泛的应用前景。它可以用于气象预报、环境监测、农业、工业自动化等领域。通过收集和分析大量的数据,可以帮助用户更好地了解和应对各种问题。 总之,CST816S数据手册是一款功能强大、性能优越的设备,能够帮助用户高效、准确地处理和分析各种数据。它的可定制性和广泛的应用前景使其成为许多行业的首选。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Distance_90

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值