STMCUBEMX_外部中断_EC11旋转编码器
说明:
1、有按键有滚轮,调节非常方便
2、只需要三个中断引脚就可以,采集旋钮的状态和按键状态
实际工程应用:
1、工程配置(给旋钮的两个引脚和按键引脚配置三个外部中断)
2、代码应用
main.c
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while(1)
{
}
}
void HAL_GPIO_EXTI_Callback(unsigned short GPIO_Pin)
{
if(GPIO_Pin == ENCODER_PIN_A) //下降沿触发
{
if(READ_ENCODER_B == 1)
{
encoder_dev.encoderNum++;
if(encoder_dev.encoderNum > 100) encoder_dev.encoderNum = 100;
Debug_printf("encoderNum:%d\r\n",encoder_dev.encoderNum);
}
else
{
if(encoder_dev.encoderNum != 0) encoder_dev.encoderNum--;
Debug_printf("encoderNum:%d\r\n",encoder_dev.encoderNum);
}
}
if(GPIO_Pin == ENCODER_PIN_B) //上升沿触发
{
if(READ_ENCODER_A == 0)
{
if(encoder_dev.encoderNum != 0) encoder_dev.encoderNum--;
Debug_printf("encoderNum:%d\r\n",encoder_dev.encoderNum);
}
else
{
encoder_dev.encoderNum++;
if(encoder_dev.encoderNum > 100) encoder_dev.encoderNum = 100;
Debug_printf("encoderNum:%d\r\n",encoder_dev.encoderNum);
}
}
if(GPIO_Pin == ENCODER_PIN_DOWN) //上升沿触发
{
encoder_dev.encoderDown = !encoder_dev.encoderDown;
Debug_printf("encoderDown:%d\r\n",encoder_dev.encoderDown);
}
}
encodeer.c
#include "encoder.h"
encoder_status_t encoder_dev = {0,0};
encoder_status_t encoder_dev_old = {0,0};
void encoder_init(void)
{
memcpy(&encoder_dev_old,&encoder_dev,sizeof(encoder_dev));
}
void encoder_task(void)
{
if(memcmp(&encoder_dev,&encoder_dev_old,sizeof(encoder_dev)) != 0)
{
if(encoder_dev.encoderDown != encoder_dev_old.encoderDown)
{
}
if(encoder_dev.encoderNum != encoder_dev_old.encoderNum)
{
}
memcpy(&encoder_dev_old,&encoder_dev,sizeof(encoder_dev));
Debug_printf("encoder update\r\n");
}
}
encodeer.h
#ifndef __ENCODER_H
#define __ENCODER_H
#include "main.h"
#include "log.h"
#include <string.h>
typedef struct encoder_status
{
unsigned char encoderNum;
unsigned char encoderDown;
}encoder_status_t;
extern encoder_status_t encoder_dev;
#define ENCODER_PIN_A GPIO_PIN_1
#define ENCODER_PIN_B GPIO_PIN_0
#define ENCODER_PIN_DOWN GPIO_PIN_15
#define READ_ENCODER_A HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_1)
#define READ_ENCODER_B HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_0)
#define READ_ENCODER_DOWN HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_15)
void encoder_init(void);
void encoder_task(void);
#endif