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();


最后修改:2020 年 10 月 24 日
声明:无闻风博客|版权所有,违者必究|如未注明,均为原创| 转载:转载请注明原文链接