1、首先在原理图中寻找LED灯
2、还要有key
KEY被摁下后接地,有一个低电平信号。
所以能通过检测PA0,PA1判断是拉高还是拉低了
3、摁一下熄灭,再摁点亮
使用cubeMX找到STM32F103C8T6芯片,选择PA0,PA1作为输入端口,PB8,PB9作为输出端口,同时设置Debug为串口。生成代码。
①定义一个函数,检测电平,判断按键状态
uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET)
{
while(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET);
return KEY_ON;
/*按键按下*/
}
else
{
return KEY_OFF;
/*按键松开*/
}
}
②实现按下按钮就切换LED灯的电平,实现亮和灭
按键按下产生低电平信号,接收信号反转电平,实现LED灯亮灭
while (1)
{
/* USER CODE END WHILE */
if(Key_Scan(GPIOA,GPIO_PIN_0) == KEY_ON)
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
if(Key_Scan(GPIOA,GPIO_PIN_1) == KEY_ON)
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
/* USER CODE BEGIN 3 */
}
宏指令:一般状态用宏指令
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
#define KEY_ON 0
#define KEY_OFF 1
③灯的亮灭过于灵敏,可以用while()循环减少扰动
while(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET);
/*按住时一直是函数里的状态,实现防抖*/