STM32F103ZET6+Cubemx+HAL库配置按键控制LED灯

该笔记记录的是由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 */
}

猜你喜欢

转载自blog.csdn.net/leiting0817/article/details/131819485