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

该笔记描述了使用STM32F03ZET6微控制器通过按键控制红绿灯模块的工作模式。在STM32CubeMX中配置LED引脚和按键输入,然后在代码中定义两种模式:红灯常亮和周期循环,并通过按键KEY0和KEY1切换模式。当KEY0按下,系统从红灯常亮切换到周期循环;当KEY1按下,系统从周期循环切换到红灯常亮。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值