STM32-笔记4-按键点亮led

 

 

 1、复制03项目流水灯,重命名改成05项目,05-按键控制翻转灯的状态

在BSP文件夹里新建key文件夹,在该文件夹里面,新建两个key.c和key.h文件

 

 2、打开工程文件-加载文件

        在品和魔术棒里面把刚才新建的key文件夹里面的.c 和.h文件加载到工程文件中(不会加载请看前面的笔记)

3、在key.c和key.h文件中写入代码

在key.c文件中写入这两个头文件,点击编译,编译通过,在侧边栏中可以在key.c文件的下面看到key.h文件

4、按键使用的是GPIO口的输入功能

代码解析都在代码的注释里

代码:key.c

#include "key.h"
#include "sys.h"//关于时钟的头文件
#include "delay.h"


//初始化GPIO口
void key_init(void)//每一个外设都有它自己的初始化函数
{
     GPIO_InitTypeDef gpio_initstruct;//定义一个结构体gpio_initstruct
    //打开时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();
    
    //调用GPIO初始化函数
    gpio_initstruct.Mode = GPIO_MODE_INPUT;//浮动输入模式//结构体函数的四种类型,引脚模式、引脚、引脚上拉下拉、引脚速度
    gpio_initstruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;//LED1对应的引脚
    gpio_initstruct.Pull = GPIO_PULLUP;//默认给一个上拉电平
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速
    
    HAL_GPIO_Init(GPIOA,&gpio_initstruct);
}

//检测摁键是否被按下
//不停的检测摁键是否是低电平(摁键扫描函数)
uint8_t key_scan(void)//需要返回一个值,来代表按键是否被按下
{
    //1、检测按键是否按下
    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)
    {
        //2、如果按键按下,消抖(5-10ms)
        delay_ms(10);
        //3、再检测按键是否按下
        if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)
            {
            //4、如果确实是被按下的状态,等待按键松开
            while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET);//在这里用while语句来等待按键状态变化
                                                       //如果按键状态一直是RESET那么就是一直按下没变,否则退出循环(松开了)
            //5、返回按键的值
                return 1;
            }
      }
    //1、检测按键是否按下
      if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == GPIO_PIN_RESET)
    {
        //2、如果按键按下,消抖(5-10ms)
        delay_ms(10);
        //3、再检测按键是否按下
        if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == GPIO_PIN_RESET)
            {
            //4、如果确实是被按下的状态,等待按键松开
            while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == GPIO_PIN_RESET);
            //5、返回按键的值
                return 2;
            }
      }
    //6、如果前面的状态都不是,就返回默认的值
      return 0;
}

key.h

#ifndef __KEY_H__
#define __KEY_H__
#include "sys.h"//也可以用#include "stdint.h"头文件,这里的sys.h包含了stdint.h头文件,使用一个就行

void key_init(void);
uint8_t key_scan(void);
    
#endif

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    led_init();//初始化led灯
    key_init(); //初始化key按键
    uint8_t key_com = 0;//定义一个uint8类型的key_com变量
    while(1)
    { 
        key_com = key_scan();//用key_com变量承接key_scan()函数的值
                             //在这里,如果不用变量承接key_scan()函数的值,也可以达到相同的结果,就是不规范
        if(key_com == 1)//判断变量的值,来决定是哪个led进行状态翻转
            led1_Toggle();
        if(key_com == 2)
            led2_Toggle();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值