STM32之通过按键控制LED灯亮灭

这篇具有很好参考价值的文章主要介绍了STM32之通过按键控制LED灯亮灭。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

之前我们已经实现了LED灯的亮灭,我们对LED灯的结构应该有一个大致的了解。接下来我们对按键控制led进行学习。

首先我们要了解一下按键的结构。按键结构如图。STM32之通过按键控制LED灯亮灭

 由此可知,此处我们有两种按键,一种是普通的按键KEY0, KEY1(KEY2),他们连接的串口分别是PE4, PE3(PE2),对应的GPIO口为GPIOE;另一种是重置按键WAKE_UP_KEY,它连接的串口为PA0,对应的GPIO口为GPIOA。这两种按键的区别是阴极(非严格意义上的)的极性,普通按键KEY0的阴极接地,按键未按下的时候呈现高阻态,需要一个稳定的高电平,来维护未按下的状态,于是我们采用上拉输入,来获得一个稳定的高电平;相应的,WAKE_UP_KEY阴极接VCC,当未按下的时候呈现高阻态,需要一个稳定的低电平来维持稳定的未按下状态,于是我们选用下拉输入,来获得稳定的低电平。

总结而言,WAKE_UP_KEY采用下拉输入,KEY0/1/2采用上拉输入,对应的GPIO_IniyTypeDef结构体的成员为Pull。

之后我们再介绍一个针对按键非常重要的知识点——软件消抖:

STM32之通过按键控制LED灯亮灭

 我们知道,由于按键中的金属弹性,在按下松开的时候会有一定的不稳定干扰,信号会很乱,导致单片机对按键状态的误判,因此,我们需要了解软件消抖。

接下来直接给出一段按键扫描的程序,其中包含了软件消抖的应用:

uint8_t key_scan(void){

    if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0){
        delay_ms(10);

        while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0){
            return 1;
        }

    }

    delay_ms(10);
    return 0;
}

以key2为例,软件消抖的原理就是在按键按下后,由触发的低电平给我们的HAL_GPIO_ReadPin()函数一个低电平信号,然后我们采取10ms的延时来消抖,再接受稳定的低电平信号,返回1值表示按键已经按下;松开时候也同理,我们的按键在按下之前一直是低电平,当我们的按键松开时候,按键输出高电平,while循环的条件被破坏,跳出循环和if语句,然后进行后一个延迟,然后在返回0表示没有按下。

这里的HAL_GPIO_ReadPin()函数有两个参数,第一个是对应的GPIO,第二个是对应的GPIO口,作用是读取实时的串口值。

那么接下来我们就进行相应程序文件的编写

key.h:

#ifndef __KEY_H
#define __KEY_H

#include "./SYSTEM/sys/sys.h"

void key_init(void);
uint8_t key_scan(void); 

#endif

key.c:

#include "./BSP/KEY/key.h"

void key_init(void){
    GPIO_InitTypeDef gpio_init_struct;

    __HAL_RCC_GPIOE_CLK_ENALBE();

    gpio_init_struct.Pin = GPIO_PIN_2;
    gpio_init_struct.Mode = GPIO_MODE_INPUT;
    gpio_init_struct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOE, &gpio_init_struct);
}

uint8_t key_scan(void){

    if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0){
        delay_ms(10);

        while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0){
            return 1;
        }

    }

    delay_ms(10);
    return 0;
}

key_init()和之前的led_init()是类似的,对GPIOE串口进行初始化。

因为KEY2的pin脚为PE2所以设置为GPIO_PIN_2;这里由于是接受按键的输入,所以使用GPIO_MODE_INPUT;上面已经解释过了,使用上拉输入;输入模式不需要调整输出的速度,故不作设置。

对key_scan()函数就不做解释了,上面解释过了。注意这里的key_scan()的类型需要设置为uint8_t,它需要返回一个值来表示相应按键的按下。

之后我们再来编写主函数

main.c:

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"

int main(){
    HAL_init();
    sys_stm32_clock_init(RCC_PLL_MUL9);
    delay_init(72);
    key_init();
    led_init();

    while(1){
        if(key_scan() ){
            HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
        }
        else{
            delay_ms(10);
        }
    }
}

于是我们就能通过一个按键开启对led灯的控制了。文章来源地址https://www.toymoban.com/news/detail-473144.html

到了这里,关于STM32之通过按键控制LED灯亮灭的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计分享|单片机独立按键控制4个LED灯亮灭

    目录 具体实现功能 设计介绍 51单片机简介 设计思路 设计内容 仿真图(protues8.7) 程序(Keil5) 具体实现功能 单片机四个按键分别控制四个LED的亮灭! 设计介绍 51单片机简介 51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应

    2024年02月06日
    浏览(50)
  • 【STM32】按键控制LED亮灭实验——GPIO、LED、KEY、SYS

    无锁存时:当按下独立按钮时LED亮,松开LED灭。 锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。 硬件部分 软件部分 1、引入头文件 2、主函数 首先时钟、led、按键初始化 锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。常

    2024年02月08日
    浏览(100)
  • STM32G030C8T6:使用按键控制LED亮灭(外部中断)

    本专栏记录STM32开发各个功能的详细过程,方便自己后续查看,当然也供正在入门STM32单片机的兄弟们参考; 本小节的目标是,系统主频64 MHZ,采用高速外部晶振,通过KEY1 按键的PA0 引脚配置成中断输入引脚,PB9引脚配置成输出,每次按键,PA0 引脚就会进入一次外部中断,每进

    2024年02月05日
    浏览(43)
  • 串口通信(stm32F4)——通过串口助手发送led on或者led off控制LED灯的亮灭

    通过串口助手发送led on来点亮LED灯,发送led off来关闭LED灯(这里是LED1,其端口是GPIOF,引脚是PIN10,串口是USART1,其端口是GPIOA,引脚是PIN9、PIN10,一个用来收数据,一个用来发收据) 初始化LED; 初始化串口; 编写接收数据中断函数; 编写空闲中断函数。 2.1 初始化LED 2.2 初

    2024年02月16日
    浏览(56)
  • C51---串口发送指令,控制LED灯亮灭

    1.Code: #include \\\"reg52.h\\\" #include \\\"intrins.h\\\" sfr   AUXR = 0x8E; sbit  D5 = P3^7; void UartInit(void)        //9600bps@11.0592MHz {     //PCON = 0x7F;        //波特率不倍速     AUXR  = 0x01;         SCON  = 0x50;        //8位数据,可变波特率     //AUXR = 0xBF;        //定时器1时钟为Fosc/12,即12T

    2024年02月12日
    浏览(35)
  • STM32 按键控制的灯亮或灭

    目录 1.STM32CubeMX的配置 2.轮询模式下的控制(代码) 3.上电烧录摁下复位键,摁下按键1 ,亮红灯,摁下按键2,亮绿灯,摁下按键3,亮蓝灯 1.STM32CubeMX的配置 按原理图去设置引脚状态  GPIO输入模式读取按键状态,输出模式控制灯的状态  右键进行重命名按键分别为,KEY1,KEY

    2024年02月07日
    浏览(38)
  • HC-05蓝牙模块与STM32控制led灯亮详解

    HC-05模块是一种基于蓝牙协议的简单无线通信设备,共有6个引脚,其中两个引脚通过stm32的两个含TX和RX的接口与之进行通信,一般用于无线控制,智能家居等。 VCC:用于供电 GND:用于供电 TX(发送):与单片机某一RX口进行通信 RX(接收):与单片机某一TX口进行通信 一句话

    2024年02月08日
    浏览(78)
  • 毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计

    选题之前,同学们要弄明白一件事情,做毕业设计是干什么用的! 这里我告诉大家,毕业设计对于你来说,不是让你去搞研究,掌握运用所学知识的,也不是让你去比谁做的毕业设计多么牛逼,多么厉害。 说白点,它的作用就是一个,让你顺利毕业,能够拿到学位证,毕业

    2024年02月07日
    浏览(68)
  • 驱动控制STM32LED灯的两秒,亮灭

    2024年02月12日
    浏览(46)
  • 十、stm32-ESP8266(串口透传、MCU透传、控制LED亮灭)

    见博客:stm32f103c8t6新建固件库模板(可自取) 固件库模板 MDK5开发环境 stm32参考手册 UART串口协议 stm32中断概念 ESP8266模块资料 利用固件库模板点灯工程(下面第三行,手动狗头) CH340 USB→TTL模块 ESP8266模块 手机软件 实验程序已经发布到百度网盘,本文末有链接可以自取

    2023年04月19日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包