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();
 
                             
                            
3 条评论
?技术类评语?
这篇文章提供了宝贵的经验和见解,对读者有很大的启发和帮助。
《维也纳血案第三季》欧美剧高清在线免费观看:https://www.jgz518.com/xingkong/93504.html