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);
}
关键说明:
-
硬件连接:
- LED:连接在GPIOA0~GPIOA7(低电平点亮)
- 按键:连接在GPIOB0(按下为低电平,内部上拉)
-
功能逻辑:
- 初始状态:LED从左向右流动(PA0→PA1→...→PA7)
- 每次按下按键:流水方向反转
- 按键带消抖处理(20ms延时)
-
自定义调整:
- 修改:调整
LED_PINS数组和LED_COUNT - 速度修改:调整
HAL_Delay(200)中的延时值 - 电平逻辑:若LED高电平点亮,将
GPIO_PIN_SET和GPIO_PIN_RESET互换
- 修改:调整
-
时钟配置:
- 需要根据实际使用的STM32型号补充
SystemClock_Config()内容 - 示例中使用内部HSI时钟(8MHz)
- 需要根据实际使用的STM32型号补充
注意:实际使用时需在STM32CubeMX中配置引脚,或手动修改为实际使用的GPIO引脚。
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
单片机按键控制流水灯方向的实现方法
题目概述:单片机:按键控制流水灯方向。编程:#include #include#define uchar unsigned char#defin
2021-12-02 06:39:28
利用按键控制led流水灯的闪烁
一、实验说明本次实验是在上次实验的基础上,稍加修改,通过中断方式,利用按键控制led流水灯的闪烁,配置非常简单,只需要几分钟搞定。(附加上次实验链接:Proteus仿真
2021-08-13 07:48:30
7天热门专题
换一换
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机