一、接线图,外接上拉
二、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