该笔记记录的是由stm32F03ZET6+红绿灯模块。通过按键key0和key1来调整红绿灯的状态。
key1(PE3):红绿灯以一定的周期循环亮灭
key2(PE4):红灯常亮
PB9:红灯,PB5:绿灯,PB7:黄灯
1.打开STM32CubeMX进行引脚设置,先打开时钟
2.设置LED引脚和按键key0、key1
PB5,PB7,PB9设置为输出 ;PE3,PE4设置为输入,因为按键另一边接地,所以按下按键就为低电平,所以内部上拉,设置为高电平,反之,如果按键接高电平的话,内部需要设置下拉,设置为低电平。原理图如下:
只复制需要的库
创建 ,并打开工程
3.keli5编写代码
typedef enum {
MODE_RED_ON,
MODE_CYCLE,
} LedMode;
LedMode current_mode = MODE_CYCLE; // 初始化为循环模式
定义模式的结构体,方便后面通过按键切换红绿灯的模式
/* USER CODE BEGIN WHILE */
while (1)
{
if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == GPIO_PIN_RESET) { // KEY0
HAL_Delay(10);
if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == GPIO_PIN_RESET) {
while (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == GPIO_PIN_RESET);
if (current_mode == MODE_RED_ON) {
current_mode = MODE_CYCLE; // 切换到循环模式
}
}
}
if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET) { // KEY1
HAL_Delay(10);
if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET) {
while (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET);
if (current_mode == MODE_CYCLE) {
current_mode = MODE_RED_ON; // 切换到红灯常亮模式
}
}
}
// 根据当前模式执行相应的操作
switch (current_mode) {
case MODE_RED_ON:// 红灯常亮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
break;
case MODE_CYCLE:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET); // 红
HAL_Delay(3000);//亮3秒
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); // 绿
HAL_Delay(3000);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); // 黄
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
break;
default:
break;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}