登录/注册

stm32按键控制流水灯方向

stm32按键控制流水灯方向

更多

以下是一个基于STM32的按键控制流水灯方向变化的实现代码(使用HAL库),包含详细的中文注释:

#include "main.h"

// 定义LED引脚 (以GPIOA为例,实际根据电路修改)
#define LED_PORT GPIOA
const uint16_t LED_PINS[] = {
    GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3,
    GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7
};
#define LED_COUNT 8)

// 定义按键引脚 (以GPIOB的PIN0为例)
#define KEY_PIN GPIO_PIN_0
#define KEY_PORT GPIOB

// 全局变量
uint8_t direction = 0; // 0=从左到右, 1=从右到左
uint8_t current_led = 0; // 当前点亮LED位置

int main(void) {
    HAL_Init();
    SystemClock_Config();

    // 初始化LED GPIO为推挽输出
    GPIO_InitTypeDef gpio = {0};
    gpio.Pin = 0x00FF; // PA0-PA7
    gpio.Mode = GPIO_MODE_OUTPUT_PP;
    gpio.Pull = GPIO_NOPULL;
    gpio.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(LED_PORT, &gpio);

    // 初始化按键GPIO为输入模式(带上拉)
    gpio.Pin = KEY_PIN;
    gpio.Mode = GPIO_MODE_INPUT;
    gpio.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(KEY_PORT, &gpio);

    // 初始关闭所有LED
    HAL_GPIO_WritePin(LED_PORT, 0x00FF, GPIO_PIN_SET);

    while (1) {
        // 检测按键按下(低电平有效)
        if (HAL_GPIO_ReadPin(KEY_PORT, KEY_PIN) == GPIO_PIN_RESET) {
            HAL_Delay(20); // 消抖延时
            if (HAL_GPIO_ReadPin(KEY_PORT, KEY_PIN) == GPIO_PIN_RESET) {
                // 切换方向
                direction = !direction;
                // 等待按键释放
                while (HAL_GPIO_ReadPin(KEY_PORT, KEY_PIN) == GPIO_PIN_RESET);
            }
        }

        // 关闭当前LED
        HAL_GPIO_WritePin(LED_PORT, LED_PINS[current_led], GPIO_PIN_SET);

        // 根据方向更新位置
        if (direction == 0) {
            current_led = (current_led + 1) % LED_COUNT; // 向右移动
        } else {
            current_led = (current_led == 0) ? LED_COUNT - 1 : current_led - 1; // 向左移动
        }

        // 点亮新LED
        HAL_GPIO_WritePin(LED_PORT, LED_PINS[current_led], GPIO_PIN_RESET);

        HAL_Delay(200); // 流水灯速度控制
    }
}

// 系统时钟配置函数(需根据实际MCU型号实现)
void SystemClock_Config(void) {
    // 此处添加你的时钟配置代码
    // 例: 使用HSI时钟
    RCC_OscInitTypeDef osc = {0};
    osc.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    osc.HSIState = RCC_HSI_ON;
    osc.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    HAL_RCC_OscConfig(&osc);

    RCC_ClkInitTypeDef clk = {0};
    clk.ClockType = RCC_CLOCKTYPE_SYSCLK;
    clk.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
    clk.AHBCLKDivider = RCC_SYSCLK_DIV1;
    clk.APB1CLKDivider = RCC_HCLK_DIV1;
    HAL_RCC_ClockConfig(&clk, FLASH_LATENCY_0);
}

关键说明:

  1. 硬件连接

    • LED:连接在GPIOA0~GPIOA7(低电平点亮)
    • 按键:连接在GPIOB0(按下为低电平,内部上拉)
  2. 功能逻辑

    • 初始状态:LED从左向右流动(PA0→PA1→...→PA7)
    • 每次按下按键:流水方向反转
    • 按键带消抖处理(20ms延时)
  3. 自定义调整

    • 修改:调整LED_PINS数组和LED_COUNT
    • 速度修改:调整HAL_Delay(200)中的延时值
    • 电平逻辑:若LED高电平点亮,将GPIO_PIN_SETGPIO_PIN_RESET互换
  4. 时钟配置

    • 需要根据实际使用的STM32型号补充SystemClock_Config()内容
    • 示例中使用内部HSI时钟(8MHz)

注意:实际使用时需在STM32CubeMX中配置引脚,或手动修改为实际使用的GPIO引脚。

基于单片机的按键控制四级变速流水灯设计

四个按键控制流水灯变速,实现四级速度控制。

2023-08-14 10:47:22

基于51单片机按键控制流水灯设计

遇到一个问题,如何按键按下既能控制流水灯又能把键值在数码管中显示呢?流水灯

2023-03-23 15:50:45

按键控制led的流水灯的流速

文章目录前言一、问题二、代码前言对于某些实验室的初级考核内容,以下是代码实例一、问题流水灯独立按键之控制速度用

2022-02-24 08:03:34

STM32f103精英版之用寄存器实现按键控制led流水灯的流向

STM32f103精英版之用寄存器实现按键控制led流水灯的流向1.前言2.环境+st

资料下载 ah此生不换 2021-12-08 17:21:11

按键控制流水灯转向

实现按键控制流水灯的启动和转向 #include "reg52.h" //定义一些特殊寄存器 #include<intrins.h> //调用

资料下载 佚名 2021-11-23 17:21:13

Proteus:单片机按键控制流水灯方向

题目概述:单片机:按键控制流水灯方向。编程:#include <reg51.h>#include<in

资料下载 31274 2021-11-23 17:06:42

C语言查询按键控制8个流水灯

C语言查询按键控制8个流水灯一.仿真电路图注意发光二极管的方向以及接的电阻的大小。二.C语言代码

资料下载 李霞 2021-11-21 16:51:04

按键控制数码管流水灯和蜂鸣器的程序和工程文件免费下载

本文档的主要内容详细介绍的是按键控制数码管流水灯和蜂鸣器的程序和工程文件免费下载。

资料下载 老巷忆梦 2020-05-08 08:00:00

如何用STM32F103VET按键控制流水灯

如何用STM32F103VET按键控制流水灯?

2022-01-20 06:29:58

单片机按键控制流水灯方向的实现方法

题目概述:单片机:按键控制流水灯方向。编程:#include #include#define uchar unsigned char#defin

2021-12-02 06:39:28

C语言查询按键控制8个流水灯相关资料分享

C语言查询按键控制8个流水灯一.仿真电路图注意发光二极管的方向以及接的电阻的大小。二.C语言代码

2021-11-30 07:53:15

如何利用STM32F103VET按键控制流水灯

如何利用STM32F103VET按键控制流水灯?

2021-11-25 06:23:28

利用按键控制led流水灯的闪烁

一、实验说明本次实验是在上次实验的基础上,稍加修改,通过中断方式,利用按键控制led流水灯的闪烁,配置非常简单,只需要几分钟搞定。(附加上次实验链接:Proteus仿真

2021-08-13 07:48:30

按键控制流水灯数码管

三个独立按键控制流水灯闪烁,数码管计数等

2020-12-21 19:11:26

两个按键控制流水灯

两个按键控制流水灯停止启

2019-10-31 19:44:34
7天热门专题 换一换
相关标签