标题:
HSJ121触摸按键STM32F103单片机驱动程序
[打印本页]
作者:
电子锁1
时间:
2019-3-2 10:32
标题:
HSJ121触摸按键STM32F103单片机驱动程序
里面有完整的资料
单片机源程序如下:
/* 包含的头文件 --------------------------------------------------------------*/
#include "bsp.h"
#include "HSJ121.h"
#include "i2c.h"
#include "timer.h"
#include "aboutdata.h"
uint8_t HSJ121_SendData[HSJ121_SendDataLength]; //命令发送数据
uint8_t HSJ121_ReciveData[HSJ121_ReciveDataLength]; //数据回复接收
uint8_t HSJ121_Mode_LowScan[HSJ121ModeSetLength]={0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x80,0x0A}; //低速扫描
uint8_t HSJ121_Mode_NearInduction[HSJ121ModeSetLength]={0x01,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x80,0x0A}; //临场接近感应
uint8_t HSJ121_KeyScanTime[HSJ121_KeyScanTimeLength]={02,05}; //按键扫描时间
//函数声明(内部调用)
uint8_t HSJ121_SendAndRecive(uint8_t *SendData,uint8_t *ReciveData); //发送和接收
uint8_t HSJ121_SendComByIIC(uint8_t sla,uint8_t *s,uint8_t num); //通过IIC发送命令
uint8_t HSJ121_RecDataByIIC(uint8_t sla,uint8_t *s); //通过IIC接收回复数据
//函数声明(外部调用)
void HSJ121Init(void); //模块初始化
uint8_t HSJ121_Set_LowScanMode(uint8_t *Mode); //设置低速扫描模式
uint8_t HSJ121_Set_NearInductionMode(uint8_t *Mode); //设置临近感应模式
uint8_t HSJ121_Get_Config(void); //获取配置信息
uint8_t HSJ121_Get_Key(void); //获取键值
uint8_t HSJ121_Set_ScanTime(uint8_t *ScanTme); //设置按键扫描时间
uint8_t HSJ121_Get_ScanTime(void); //获取按键扫描时间
uint8_t HSJ121_Set_SleepMode(void); //设置睡眠模式
uint8_t HSJ121_Into_SleepMode(void); //进入睡眠模式
uint8_t HSJ121_WakeUp(void); //唤醒芯片
/*--------------------------内部调用函数---------------------------------------*/
/************************************************
函数名称 : SendComByIIC
功 能 : 通过IIC发送命令数据帧
参 数 : uint8_t sla —— 器件地址
uint8_t *s —— 命令数据缓冲区
uint8_t num —— 命令长度
返 回 值 : TRUE —— 正确
FALSE —— 错误
作 者 :
*************************************************/
uint8_t HSJ121_SendComByIIC(uint8_t sla,uint8_t *s,uint8_t num)
{
uint8_t i,j;
uint8_t ack=2;
I2C_Start(); //启动信号
//发送器件地址
ack=I2C_WriteByte(sla|I2C_WR);
if(ack==I2C_NOACK){
// printf("send address fail by write\n");
return FALSE;
}else if(ack==I2C_ACK){
// printf("send address success by write\n");
}
TIMDelay_Nms(1); //延时
//循环发送命令数据帧
for(i=0;i<num;i++)
{
ack=I2C_WriteByte(*s);
if(ack==I2C_NOACK){
// printf("send command data fail\n");
return FALSE;
}
s++;
TIMDelay_Nms(1); //延时
}
I2C_Stop(); //停止信号
return TRUE;
}
/************************************************
函数名称 : RecDataByIIC
功 能 : 通过IIC接收模块返回数据帧
参 数 : uint8_t sla —— 器件地址
uint8_t *s —— 接收回复数据帧缓冲区
uint8_t num —— 回复数据帧长度
返 回 值 : TRUE —— 正确
FALSE —— 错误
作 者 :
*************************************************/
uint8_t HSJ121_RecDataByIIC(uint8_t sla,uint8_t *s)
{
uint8_t i=0;
uint8_t HSJ121_Length;
uint8_t j=0;
uint8_t ack=2;
uint8_t num;
j=250;
while(1)
{
I2C_Start(); //启动信号
ack=I2C_WriteByte(sla+1); //发送器件地址+写入命令
// TIMDelay_Nms(5); //延时
if(ack==I2C_ACK){
// printf("Send address success by read\n");
break; //模块应答成功,退出循环,准备接收数据
}
//模块超时没有应答,返回出错
if(j--==0){
I2C_Stop();
// printf("Send address fail by read\n");
return FALSE;
}
}
// TIMDelay_Nms(1000); //延时
HSJ121_Length=I2C_ReadByte(I2C_ACK); //接收第一个字节数据,获取数据帧长度
*s = HSJ121_Length;
s++;
if(HSJ121_Length==0x00){
I2C_Stop();
return FALSE;
}
for(i=0;i<HSJ121_Length-1;i++) //循环接受数据(除校验码外)
{
*s=I2C_ReadByte(I2C_ACK);
s++;
}
//接收检验码
*s=I2C_ReadByte(I2C_NOACK);
I2C_Stop(); //停止信号
return TRUE;
}
/************************************************
函数名称 : HSJ121_SendAndRecive(uint8_t *SendData,uint8_t *ReciveData)
功 能 : 命令发送和回复数据接收
参 数 : *SendData -- 发送命令缓冲区
*ReciveData -- 接收数据缓冲区
返 回 值 : TRUE —— 正确
FALSE —— 错误
作 者 :
*************************************************/
uint8_t HSJ121_SendAndRecive(uint8_t *SendData,uint8_t *ReciveData)
{
uint8_t Command;
uint8_t RepetCnt=5;
Command=SendData[CMD];
SendData[SendData[Length]]=GetBcc(SendData,SendData[Length]); //获取BCC校验码
//发送命令数据帧
while(RepetCnt) //重复次数,循环几次,避免模块没有及时发出ACK而退出
{
RepetCnt--;
//发送命令数据帧
if(HSJ121_SendComByIIC(HSJ121_ADD,SendData,(SendData[Length]+1))==TRUE){
// printf("Send command success\n");
break;
}
//发送命令数据帧出错
if(RepetCnt==0){
// printf("IIC send command timeout\n");
return FALSE;
}
}
TIMDelay_Nms(5);
RepetCnt=250;
//接收模块返回数据帧
while(RepetCnt)
{
RepetCnt--;
if(HSJ121_RecDataByIIC(HSJ121_ADD,ReciveData)==TRUE){
// printf("Receive data success\n");
break;
}
//接收模块返回数据帧出错
if(RepetCnt==0){
// printf("IIC receive data timeout\n");
return FALSE;
}
}
//对模块返回的数据帧进行校验
if(!GetBcc(ReciveData,ReciveData[Length]+1)){
// printf("Bcc check success\n");
if(Command==ReciveData[CMD]){
// printf("Command check success\n");
return TRUE; //校验成功
}else{
// printf("Command check success\n");
}
}else{
// printf("Bcc check fail\n");
}
return FALSE;
}
/*--------------------------外部调用函数---------------------------------------*/
/******************************************/
//函数原型: void HSJ121Init(void)
//输入参数: 无
//输出参数: 无
//函数返回:
//功能描述: 芯片初始化
/******************************************/
void HSJ121Init(void)
{
I2C_Initializes(); //I2C通信初始化
TIMDelay_Nms(10); //上电等待3ms,芯片稳定
printf("HSJ121 init success\n");
}
/******************************************/
//函数原型: HSJ121_Set_LOWScanMode(uint8_t *Mode)
//输入参数: *Mode 设置模式码(10个字节)
//输出参数: 无
//函数返回: TRUE or FALSE
//功能描述: 设置低速扫描模式
/******************************************/
uint8_t HSJ121_Set_LowScanMode(uint8_t *Mode)
{
uint8_t State;
EXTI->IMR&=~(1<<13); //屏蔽13线上中断
ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
HSJ121_SendData[Length]=0x0C; //添加数据长度
HSJ121_SendData[CMD]=0x70; //添加命令码
CopyData(&HSJ121_SendData[DataPOS],Mode,10);
State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
// 将模块回复的数据从HEX码转成Char
HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
EXTI->IMR|=1<<13; //开13线上中断
return State;
}
/******************************************/
//函数原型: HSJ121_Set_NearInductionMode(uint8_t *Mode)
//输入参数: *Mode 设置模式码(10个字节)
//输出参数: 无
//函数返回: TRUE or FALSE
//功能描述: 设置临近感应模式
/******************************************/
uint8_t HSJ121_Set_NearInductionMode(uint8_t *Mode)
{
uint8_t State;
EXTI->IMR&=~(1<<13); //屏蔽13线上中断
ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
HSJ121_SendData[Length]=0x0C; //添加数据长度
HSJ121_SendData[CMD]=0x70; //添加命令码
CopyData(&HSJ121_SendData[DataPOS],Mode,10);
State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
// 将模块回复的数据从HEX码转成Char
HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
EXTI->IMR|=1<<13; //开13线上中断
return State;
}
/******************************************/
//函数原型: uint8_t HSJ121_Get_Config()
//输入参数: 无
//输出参数: 无
//函数返回: TRUE or FALSE
//功能描述: 获取配置信息
/******************************************/
uint8_t HSJ121_Get_Config(void)
{
uint8_t State;
EXTI->IMR&=~(1<<13); //屏蔽13线上中断
ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
HSJ121_SendData[Length]=0x02; //添加数据长度
HSJ121_SendData[CMD]=0x80; //添加命令码
State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
// 将模块回复的数据从HEX码转成Char
HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
EXTI->IMR|=1<<13; //开13线上中断
return State;
}
/******************************************/
//函数原型: HSJ121_Get_Key(void)
//输入参数: 无
//输出参数: 无
//函数返回: TRUE or FALSE
//功能描述: 获取键值
/******************************************/
uint8_t HSJ121_Get_Key(void)
{
uint8_t num;
uint8_t State;
EXTI->IMR&=~(1<<13); //屏蔽13线上中断
ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
HSJ121_SendData[Length]=0x02; //添加数据长度
HSJ121_SendData[CMD]=0xA0; //添加命令码
for(num=0;num<3;num++)
{
State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
if(State==TRUE){
break;
}
}
// 将模块回复的数据从HEX码转成Char
HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
EXTI->IMR|=1<<13; //开13线上中断
return State;
}
/******************************************/
//函数原型: HSJ121_Set_ScanTime(uint8_t *ScanTme)
//输入参数: *ScanTme 扫描时间
//输出参数: 无
//函数返回: TRUE or FALSE
//功能描述: 设置扫描时间
/******************************************/
uint8_t HSJ121_Set_ScanTime(uint8_t *ScanTme) //设置按键扫描时间
{
uint8_t State;
EXTI->IMR&=~(1<<13); //屏蔽13线上中断
ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
HSJ121_SendData[Length]=0x04; //添加数据长度
HSJ121_SendData[CMD]=0x71; //添加命令码
CopyData(&HSJ121_SendData[DataPOS],ScanTme,HSJ121_KeyScanTimeLength);
State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
// 将模块回复的数据从HEX码转成Char
HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
EXTI->IMR|=1<<13; //开13线上中断
return State;
}
/******************************************/
//函数原型: HSJ121_Get_ScanTime(void)
//输入参数: 无
//输出参数: 无
//函数返回: TRUE or FALSE
//功能描述: 获取扫描时间
/******************************************/
uint8_t HSJ121_Get_ScanTime(void) //获取按键扫描时间
{
uint8_t State;
EXTI->IMR&=~(1<<13); //屏蔽13线上中断
ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
HSJ121_SendData[Length]=0x02; //添加数据长度
HSJ121_SendData[CMD]=0x81; //添加命令码
State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
// 将模块回复的数据从HEX码转成Char
HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
EXTI->IMR|=1<<13; //开13线上中断
return State;
}
/******************************************/
//函数原型: HSJ121_Set_SleepMode(void)
//输入参数: 无
//输出参数: 无
//函数返回: TRUE or FALSE
//功能描述: 设置睡眠模式
/******************************************/
uint8_t HSJ121_Set_SleepMode(void)
{
uint8_t State;
EXTI->IMR&=~(1<<13); //屏蔽13线上中断
ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
HSJ121_SendData[Length]=0x03; //添加数据长度
HSJ121_SendData[CMD]=0x91; //添加命令码
// HSJ121_SendData[DataPOS]=0x00; //关闭睡眠模式
HSJ121_SendData[DataPOS]=0x01; //使能睡眠模式
State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
// 将模块回复的数据从HEX码转成Char
HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
EXTI->IMR|=1<<13; //开13线上中断
return State;
}
/******************************************/
//函数原型: HSJ121_Into_SleepMode(void)
//输入参数: 无
//输出参数: 无
//函数返回: TRUE or FALSE
//功能描述: 进入睡眠模式
/******************************************/
uint8_t HSJ121_Into_SleepMode(void)
{
uint8_t State;
EXTI->IMR&=~(1<<13); //屏蔽13线上中断
ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
HSJ121_SendData[Length]=0x02; //添加数据长度
HSJ121_SendData[CMD]=0x90; //添加命令码
State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
// 将模块回复的数据从HEX码转成Char
HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
EXTI->IMR|=1<<13; //开13线上中断
return State;
}
/******************************************/
//函数原型: HSJ121_WakeUp()
//输入参数: 无
//输出参数: 无
//函数返回: TRUE or FALSE
//功能描述: 唤醒芯片,进入工作模式
/******************************************/
uint8_t HSJ121_WakeUp(void)
{
uint8_t State;
EXTI->IMR&=~(1<<13); //屏蔽13线上中断
ClearData(HSJ121_SendData,HSJ121_SendDataLength); //清零发送数据
ClearData(HSJ121_ReciveData,HSJ121_ReciveDataLength); //清零接收数据
HSJ121_SendData[Length]=0x02; //添加数据长度
HSJ121_SendData[CMD]=0xA6; //添加命令码
State=HSJ121_SendAndRecive(HSJ121_SendData,HSJ121_ReciveData);
// 将模块回复的数据从HEX码转成Char
HexToChar(HSJ121_ReciveData,(HSJ121_ReciveData[Length]+1));
EXTI->IMR|=1<<13; //开13线上中断
return State;
}
复制代码
//////////////////////////////////////////////////////////////////////////////////
//本程序只供测试使用,不能用作产品代码
//////////////////////////////////////////////////////////////////////////////////
/* 包含的头文件 --------------------------------------------------------------*/
#include "bsp.h"
#include "i2c.h"
#include "timer.h"
#include "usart.h"
#include "aboutdata.h"
#include "HSJ121.h"
/************************************************
函数名称 : System_Initializes
功 能 : 系统初始化
参 数 : 无
返 回 值 : 无
作 者 :
*************************************************/
void System_Initializes(void)
{
BSP_Initializes(); //底层初始化
TIMER_Initializes(); //TIMER初始化
USART_Initializes(); //串口1初始化
}
/************************************************
函数名称 : main
功 能 : 主函数入口
参 数 : 无
返 回 值 : int
作 者 :
*************************************************/
int main(void)
{
System_Initializes(); //系统初始化
HSJ121Init(); //芯片初始化
//所有命令都必须在唤醒成功的状态下执行
//---------------------芯片唤醒-------------------------//
#if HSJ_WakeUp_en
if(HSJ121_WakeUp()==TRUE){
printf("Wake Up Success\n");
USART1_PrintfNChar(CharData,strlen(CharData));
//-----------------------------------------------------//
//---------------------低速扫描模式---------------------//
#if HSJ_LowScanMode_en
if(HSJ121_Set_LowScanMode(HSJ121_Mode_LowScan)==TRUE){
printf("Set Low Scan Mode Success\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}else{
printf("Set Low Scan Mode Fail\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}
#endif
//---------------------接近感应模式---------------------//
#if HSJ_NearInductionMode_en
if(HSJ121_Set_NearInductionMode(HSJ121_Mode_NearInduction)==TRUE){
printf("Set Near Induction Mode Success\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}else{
printf("Set Near Induction Mode Fail\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}
#endif
//---------------------获取配置-------------------------//
#if HSJ_GetConfig_en
if(HSJ121_Get_Config()==TRUE){
printf("Get Config Success\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}else{
printf("Get Config Fail\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}
#endif
//---------------------设置扫描时间----------------------//
#if HSJ_SetScanTime_en
if(HSJ121_Set_ScanTime(HSJ121_KeyScanTime)==TRUE){
printf("Set Scan Time Success\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}else{
printf("Set Scan Time Fail\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}
#endif
//---------------------获取扫描时间----------------------//
#if HSJ_GetScanTime_en
if(HSJ121_Get_ScanTime()==TRUE){
printf("Get Scan Time Success\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}else{
printf("Get Scan Time Fail\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}
#endif
//---------------------设置睡眠模式----------------------//
#if HSj_SetSleepMode_en
if(HSJ121_Set_SleepMode()==TRUE){
printf("Set Sleep Mode Success\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}else{
printf("Set Sleep Mode Fail\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}
#endif
//---------------------进入睡眠模式---------------------//
#if HSJ_IntoSleepMode_en
if(HSJ121_Into_SleepMode()==TRUE){
printf("Into Sleep Mode Success\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}else{
printf("Into Sleep Mode Fail\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}
#endif
//-----------------------------------------------------//
}else{
printf("Wake Up Fail\n");
USART1_PrintfNChar(CharData,strlen(CharData));
}
#endif
while(1);
}
/******************************* end ************************************/
复制代码
所有资料51hei提供下载:
HSJ121-STM32F103RCT6.7z
(391.06 KB, 下载次数: 15)
2019-3-2 17:40 上传
点击文件名下载附件
作者:
Mayday8888
时间:
2019-6-5 10:39
楼主,我IIC读出来的数据一直是0,你有么有碰到类似的情况?
作者:
Mayday8888
时间:
2019-6-5 19:31
楼主我用了你的hsj121的源码,就是read的时候一直是0,很奇怪
作者:
狂野的野马
时间:
2019-6-8 11:36
感谢楼主的分享,好好学习下
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1