一、接线图,外接上拉
二、CubeMX配置
时钟配置
引脚配置
打开串口一,选择异步
生成工程
三、代码
在K2引脚的下降沿检测K3引脚的电平
在K2引脚的上升沿检测K3引脚的电平
串口重定向和定义引脚
/* USER CODE BEGIN Includes */
#include "stdio.h"
#define EC11_DATA_A HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)
#define EC11_DATA_B HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)
#define EC11_DATA_key HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xFFFF);
return ch;
}
/* USER CODE END Includes */
此处需要打开use MicroLIB
顺便打开烧录自动复位
并取消pack选项
main.c中
/* USER CODE BEGIN 0 */
int16_t Encoder_EC11_Scan(int16_t key,int16_t EC11_A,int16_t EC11_B)
{
static int8_t sta=0,sta_key=0;
int16_t ScanResult = 0;
if(sta_key==0 && key==1){sta_key=1;}
else if(sta_key==1){
if(key==0){sta_key=2;}
}
else if(sta_key==2){
if(key==1){
sta_key=0;
ScanResult=3;
}
}
if(EC11_A==0 && sta==0){
sta=1;
}
else if(sta==1){
if(EC11_A==1){
if(EC11_B==1){
if(key==0){ScanResult=2;sta_key=0;}
else {ScanResult=1;}
}
else if(EC11_B==0){
if(key==0){ScanResult=-2;sta_key=0;}
else {ScanResult=-1;}
}
sta=0;
}
}
if(ScanResult!=0)printf("%d\r\n",ScanResult); //输出查看,不需要可删除
return ScanResult; //返回值的取值: 0:无动作; 1:正转; -1:反转; 2:按下正转; -2:按下反转; 3:只按下并松开
}
/* USER CODE END 0 */
while
while (1)
{ Encoder_EC11_Scan(EC11_DATA_key,EC11_DATA_A,EC11_DATA_B);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
运行效果
链接: https://pan.baidu.com/s/1pvYa3uHqwQEmemLVQ-cfnA?pwd=7via 提取码: 7via