首页 > 其他分享 >【STM32】按键控制小灯的亮灭

【STM32】按键控制小灯的亮灭

时间:2024-08-19 15:54:24浏览次数:12  
标签:小灯 GREEN LED KEY2 KEY1 STM32 HAL 按键 GPIO

今天我们用STM32单片机上的按键来控制小灯泡的亮灭,楼主在b站STM32教学中进行学习,其中有几点是楼主觉得对于新手有点难理解的地方进行讲解,详细视频教学请参考,文中配图来源于keysking视频教学(up主做的挺好的,点赞!!!)

【【STM32入门教程-2024】第4集 按键控制小灯 GPIO输入 | keysking的stm32教程】 https://www.bilibili.com/video/BV1Z84y157dx/?p=5&share_source=copy_web&vd_source=9509e6dea87ae27d12da0fcdc70da468

今天需要用STM32完成的任务是:

1、按住单片机上的KEY1键,LED_GREEN亮起,松开KEY1,LED_GREEN熄灭

2、按下单片机上的KEY2键,LED_RED亮起,再按下KEY2,LED_RED熄灭(反转亮灭)

任务1:

下图中的电容作用:消除按键抖动

下图中的10K电阻,为上拉电阻

下图中的PB12为浮空输入模式(并入一个非常非常大的电阻,假设是a,KEY1断开情况下,10K电阻与电阻a进行分压,10K电阻在无穷大的电阻面前,分到的电压几乎为0,所以PB12几乎为3.3V)

此处PB12用于检测KEY1状态(KEY1断开,则PB12直接接入3.3V;KEY1闭合,则PB12接入0V)

代码部分:

  while (1)
  {
	HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin);
	if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET){
		HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin, GPIO_PIN_SET);
	}else{
		HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin, GPIO_PIN_RESET);
	}

  }

代码理解:

HAL_GPIO_ReadPin:用来获取KEY1状态,如果按键被按下,则PB12为低电平,则让LED_GREEN处于高电平点亮;反之如果按键被松开,则执行else语句,LED_GREEN处于低电平熄灭

任务2:

该图为KEY2的原理图,与KEY1图的区别在于,没有了上拉电阻

所以PB13为上拉输入模式(个人理解:自带高电平)

代码部分:

  while (1)
  {	
    if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET){
		HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
		while(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET){}
    }

代码理解:

HAL_GPIO_TogglePin的作用是反转,如果灯是熄灭的则变为点亮,如果灯点亮则变为熄灭

问题:如果不加while循环,可以实现功能吗?

答案:不能,因为在按键被按下时,while(1)飞速循环,HAL_GPIO_ReadPin一直在检测KEY2的状态,一直是被按下的状态,则灯泡一直在反转,由于频率太快,肉眼看不出来闪烁,所以一直亮。当松开的时候会出现两种情况,第一种是在松开前灯泡反转为熄灭,松开后灯泡一直亮;第二种是在松开前灯泡反转为亮,松开后灯泡一直熄灭,所以按下按键后,灯泡不一定是亮的。

加上while循环后,在松开前灯泡反转一次后,一直处于死循环,直到下一次按键被按下,灯泡再进行反转。

大家有什么问题,欢迎大家留言讨论!!!!

您的支持是我学习的最大动力!!!

标签:小灯,GREEN,LED,KEY2,KEY1,STM32,HAL,按键,GPIO
From: https://blog.csdn.net/zzh820383817/article/details/141271564

相关文章

  • STM32中断系统之TIM定时中断
    文章目录前言一、TIM定时器简介1.1定时器的基本功能1.2时基单元1.3定时器的其他功能1.4TIM定时器的分类二、TIM定时器的内部结构2.1基本定时器2.2通用定时器2.3高级定时器三、定时中断的基本结构四、时序图4.1预分频器时序4.2计数器时序4.3计数器无预装时序4......
  • 基于STM32的寄存器实现点亮LED--基于RUST实现
    main.rs#![no_std]#![no_main]usecore::ptr;usecortex_m_rt::entry;usepanic_haltas_;//当发生panic时停止执行//定义寄存器地址constRCC_BASE:u32=0x40021000;constGPIOB_BASE:u32=0x40010C00;constRCC_APB2ENR_OFFSET:u32=0x18;constGPIOB......
  • 17.实现一个算法根据电话按键上的数字和字母的映射关系,输入一个或多个数字返回所有它
    17.LetterCombinationsofaPhoneNumber题目Givenastringcontainingdigitsfrom2-9inclusive,returnallpossiblelettercombinationsthatthenumbercouldrepresent.Amappingofdigittoletters(justlikeonthetelephonebuttons)isgivenbelo......
  • 基于STM32的寄存器实现点亮LED
    1.启动文件startup_stm32f103xe.s;********************(C)COPYRIGHT2017STMicroelectronics********************;*FileName:startup_stm32f103xe.s;*Author:MCDApplicationTeam;*Description:STM32F103xEDevicesvectort......
  • STM32L031 使用外部时钟卡死的问题,不能正常启动的原因
    芯片是STM32L031G6U6,芯片没有外部晶振引脚,想要高精度时钟只能通过PA0输入外部时钟,选用有源晶振8MHz按照CubeMX生产的初始化时钟函数后发现启动不了,必须用HSI才行,仿真发现卡死在ADC校准函数  HAL_ADCEx_Calibration_Start(&stm32_adc_obj[i].ADC_Handler,ADC_SINGLE_ENDED)......
  • 【STM32】寻迹小车项目复盘
    寻迹小车项目复盘前言复盘简述项目无思路,无大局观描述复盘项目无架构描述复盘下次项目改进思路DEBUG无思路前言博主近日首次完成了一个简单的循迹小车。但让我意外的是,在我上手如此简单的项目时,我的思路却十分混乱,开发过程毫无逻辑,虽说跌跌撞撞的做出来了,但效率低......
  • 基于STM32开发的智能停车场管理系统
    目录引言环境准备工作硬件准备软件安装与配置系统设计系统架构硬件连接代码实现系统初始化车辆检测与计数显示与状态指示Wi-Fi通信与远程监控应用场景小型停车场自动管理大型商场停车场管理系统常见问题及解决方案常见问题解决方案结论1.引言智能停车......
  • stm32 printf 重定向问题
    最终解决方案新建一个stm32_printf.h头文件,在main.c中include#ifndefSTM32_SPIDMA_MODE_STM32_PRINT_H#defineSTM32_SPIDMA_MODE_STM32_PRINT_H#include"stm32f1xx_hal.h"#include"string.h"externUART_HandleTypeDefhuart1;voidprint_f(char*str){......
  • 单击键盘按键弹出窗口案例
    如题(记录学习过程)html文件<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Documen......
  • 基于stm32智能家居
    智能家居,基于stm32f103c8t6+温湿度传感器+超声波传感器+光敏智能家居物联网的一个课题项目,然后接下来我就介绍一下我在做课设的时候,一些步骤,最后将完整代码放入最后,方便各类爱好者提出问题以及修改。主要功能通过阿里云控制继电器,在阿里云云端上面显示当前传感器数据通过连......