当前位置:   article > 正文

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

stm32按键控制led灯亮灭

之前我们已经实现了LED灯的亮灭,我们对LED灯的结构应该有一个大致的了解。接下来我们对按键控制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。

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

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

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

  1. uint8_t key_scan(void){
  2. if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0){
  3. delay_ms(10);
  4. while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0){
  5. return 1;
  6. }
  7. }
  8. delay_ms(10);
  9. return 0;
  10. }

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

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

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

key.h:

  1. #ifndef __KEY_H
  2. #define __KEY_H
  3. #include "./SYSTEM/sys/sys.h"
  4. void key_init(void);
  5. uint8_t key_scan(void);
  6. #endif

key.c:

  1. #include "./BSP/KEY/key.h"
  2. void key_init(void){
  3. GPIO_InitTypeDef gpio_init_struct;
  4. __HAL_RCC_GPIOE_CLK_ENALBE();
  5. gpio_init_struct.Pin = GPIO_PIN_2;
  6. gpio_init_struct.Mode = GPIO_MODE_INPUT;
  7. gpio_init_struct.Pull = GPIO_PULLUP;
  8. HAL_GPIO_Init(GPIOE, &gpio_init_struct);
  9. }
  10. uint8_t key_scan(void){
  11. if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0){
  12. delay_ms(10);
  13. while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == 0){
  14. return 1;
  15. }
  16. }
  17. delay_ms(10);
  18. return 0;
  19. }

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

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

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

之后我们再来编写主函数

main.c:

  1. #include "./SYSTEM/sys/sys.h"
  2. #include "./SYSTEM/usart/usart.h"
  3. #include "./BSP/delay/delay.h"
  4. #include "./BSP/LED/led.h"
  5. #include "./BSP/KEY/key.h"
  6. int main(){
  7. HAL_init();
  8. sys_stm32_clock_init(RCC_PLL_MUL9);
  9. delay_init(72);
  10. key_init();
  11. led_init();
  12. while(1){
  13. if(key_scan() ){
  14. HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
  15. }
  16. else{
  17. delay_ms(10);
  18. }
  19. }
  20. }

于是我们就能通过一个按键开启对led灯的控制了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/35304
推荐阅读
相关标签
  

闽ICP备14008679号