[STM32F1] 使用STM32实现按键控制LED灯的简单示例

[复制链接]
5001|17
 楼主| Wordsworth 发表于 2024-9-28 07:55 | 显示全部楼层 |阅读模式
最近我在使用STM32做一个简单的按键控制LED的项目。通过点击按键,LED可以打开或关闭。这个项目虽然简单,但是可以帮助我更好地理解GPIO输入输出的操作。下面是我的基本实现过程和代码共享。
硬件连接:
  • 我使用了STM32F103C8T6这块开发板。
  • 一个LED连接在GPIO口(比如PC13)上,用于指示状态。
  • 一个按钮连接在GPIO口(比如PA0)上,作为输入信号。
软件配置:使用STM32CubeMX来配置GPIO:
  • PC13配置为输出模式,用于控制LED。
  • PA0配置为输入模式,使用上拉电阻,作为按键输入。
CubeMX代码生成:在STM32CubeMX配置好GPIO后,生成了代码框架。接下来,我们只需要在main.c文件中添加逻辑代码,来检测按键状态并控制LED。
代码示例:
  1. #include "main.h"

  2. int main(void)
  3. {
  4.   HAL_Init();
  5.   SystemClock_Config();
  6.   
  7.   // 初始化所有外设,包括GPIO
  8.   MX_GPIO_Init();

  9.   // 初始化变量,记录LED状态
  10.   uint8_t ledState = 0;
  11.   
  12.   while (1)
  13.   {
  14.     // 读取按键状态
  15.     if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) // 按键按下
  16.     {
  17.       HAL_Delay(50); // 消抖延时
  18.       if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) // 按键依然按下
  19.       {
  20.         ledState = !ledState; // 切换LED状态
  21.         HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, ledState ? GPIO_PIN_RESET : GPIO_PIN_SET); // 控制LED
  22.       }
  23.       
  24.       // 等待按键松开
  25.       while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET);
  26.     }
  27.    
  28.     HAL_Delay(10); // 主循环延时
  29.   }
  30. }
关键部分说明:
  • HAL_GPIO_ReadPin函数用于读取按键状态,当按键按下时,GPIO_PIN_0会被拉低。
  • 按键按下后,我用**HAL_Delay(50)**进行消颤,再次确认按键状态。
  • 使用一个ledState变量来记录LED的当前状态,每次按键按下时,LED状态就会发生。
  • HAL_GPIO_WritePin用来设置PC13引脚的电平,控制LED的亮灭。
效果:
  • 按一下按键,LED亮起。
  • 再次按下按钮,LED 就会出现。
  • 按键每次按下后,LED状态会切换。
这是个非常简单的项目,但通过它我学会了如何配置GPIO,处理按键输入以及使用HAL库控制LED。希望这个例子能够对同样初学STM32的朋友有所帮助!

评论

正在初学,正好需要。  发表于 2024-10-6 08:37
公羊子丹 发表于 2024-9-28 07:57 | 显示全部楼层
“哈哈,这个项目很经典啊,适合入门学习!”
童雨竹 发表于 2024-9-28 07:57 | 显示全部楼层
谢谢分享,正好我最近在学STM32,马上试试!
周半梅 发表于 2024-9-28 07:57 | 显示全部楼层
按键消抖那块思路不错,我之前没有加延迟,结果按键误触发。
帛灿灿 发表于 2024-9-28 07:58 | 显示全部楼层
这个LED控制项目简单明了,太适合新手了!
万图 发表于 2024-9-28 07:59 | 显示全部楼层
我也是用F103练手,这个例子正好可以试一试。
Pulitzer 发表于 2024-9-28 07:59 | 显示全部楼层
你这个按键控制的逻辑大概,我之前做类似的项目没有考虑消抖。
Bblythe 发表于 2024-9-28 07:59 | 显示全部楼层
这个能不能扩展一下做多个按键和多个LED的控制?
Uriah 发表于 2024-9-28 08:00 | 显示全部楼层
小项目很实用,尤其是消抖那部分学到了!
Clyde011 发表于 2024-9-28 08:00 | 显示全部楼层
请问您用的CubeMX配置部分能再详细说说吗?
4y1b3 发表于 2024-9-29 22:19 来自手机 | 显示全部楼层
在STM32CubeMX配置好GPIO后
kzlzqi 发表于 2024-9-29 22:55 来自手机 | 显示全部楼层
LED可以打开或关闭
根特皇宫w 发表于 2024-12-31 19:42 | 显示全部楼层
由于按钮的机械特性,可能会产生抖动,导致多次触发。
地瓜patch 发表于 2024-12-31 19:54 来自手机 | 显示全部楼层
挺简单的功能
OKAKAKO 发表于 2024-12-31 22:00 | 显示全部楼层
LED更好地理解GPIO输入输出的操作
LOVEEVER 发表于 2024-12-31 23:07 | 显示全部楼层
CubeMX代码生成:在STM32CubeMX配置好GPIO后,生成了代码框架
您需要登录后才可以回帖 登录 | 注册

本版积分规则

161

主题

6119

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部