encoder.c
#include "encoder.h"
struct encoder en;
/*
#define BUTTON HAL_GPIO_ReadPin(EN_BT_GPIO_Port,EN_BT_Pin)
在头文件定义了button,直接返回引脚状态
*/
uint8_t trun_button()
{
//有时候按钮是低电平触发,所以需要转换一下,使得按钮触发时返回1
switch(BUTTON)
{
case 0:
return 1;
break;
case 1:
return 0;
break;
}
return 255;
}
/*
读取按钮的状态
返回值:255 长按状态
其他 连击次数
*/
uint8_t read_button_flag()
{
#define t 500 //连击阈值(ms)
uint8_t a=0;
static char louck=0;
static uint32_t time=0;
static uint16_t times=0;
if(trun_button())
{
if(louck==0)
{
if(HAL_GetTick()<time+t)//在一定时间内连续点击
{
times++;
time=HAL_GetTick();
louck=1;
}else
{
times=1; //否则重新计数
time=HAL_GetTick();
louck=1;
}
}
if(louck==1)
{
if(HAL_GetTick()>time+t)//持续按住超过t ms
{a=255;} //长按状态
}
}
if(!trun_button())
{
if(louck==1)
{
if(a==255)
{
}else
{
a=times;
}
louck=0;
}
}
return a;
}
/*
读取编码器的值
直接返回某个方向的格数,负数左,正数右
每次读取自动对缓存清零
*/
int read_encoder()
{
int a=en.coder_flag;
en.coder_flag=0;
return a;
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//回调函数 编码器
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
switch (GPIO_Pin)
{
case EN_B_Pin:
switch(B)
{
case 1:
switch(A)
{
case 1:
//++;
en.coder_flag++;
break;
case 0:
break;
}
break;
case 0:
switch(A)
{
case 1:
//--;
en.coder_flag--;
break;
case 0:
break;
}
break;
}
break;
default:
break;
}
}
encoder.h
#include "main.h"
#define A HAL_GPIO_ReadPin(EN_A_GPIO_Port,EN_A_Pin)
#define B HAL_GPIO_ReadPin(EN_B_GPIO_Port,EN_B_Pin)
#define BUTTON HAL_GPIO_ReadPin(EN_BT_GPIO_Port,EN_BT_Pin)
struct encoder
{
int coder;
int coder_flag;
uint8_t button_flag;
};
extern struct encoder en;
uint8_t read_button_flag();
int read_encoder();