按键检测GPIO输入

1. 项目

  通过按键控制开关LED灯,按下按键灯亮,再按一下灯灭。

2. 代码

  mian.c

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stm32f10x.h"          //相当于51单片机中的    #include <reg51.h>
#include "bsp_key.h"
#include "bsp_led.h"
 
void Delay(uint32_t count)
{
    for(; count!=0; count--);
}
 
int main(void)
{
    //来到这里是,系统的时钟已经被配置到72MHz了
    LED_GPIO_Config();
    KEY_GPIO_Config();  //初始化KEY函数
    while(1)
    {      
            if(Key_Scan(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == KEY_ON)
            {
                LED_R_TOGGLE;
            }
    }
 
}

  bsp_key.c

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "bsp_key.h"
void KEY_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
 
    RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);
    GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 
    GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStruct);
     
}
 
 
uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
    if (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON )
    {
        //松手检测
        while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON);
        return KEY_ON;
    }
    else return KEY_OFF;
}

  bsp_key.h

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef __bsp_key_h
#define __bsp_key_h
 
#include "stm32f10x.h"
 
#define KEY_ON              1
#define KEY_OFF             0
 
#define KEY2_GPIO_PIN                       GPIO_Pin_13
#define KEY2_GPIO_PORT                  GPIOC
#define KEY2_GPIO_CLK                       RCC_APB2Periph_GPIOC
 
void KEY_GPIO_Config(void);
uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
#endif/*__bsp_key_h*/

  bsp_led.c

  

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "bsp_led.h"
 
void LED_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
     
     
    RCC_APB2PeriphClockCmd(LED_R_GPIO_CLK, ENABLE);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Pin = LED_R_GPIO_PIN; 
    GPIO_Init(LED_R_GPIO_PORT, &GPIO_InitStruct);
}

  bsp_led.h

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//头文件
#ifndef __bsp_led_h
#define __bsp_led_h
 
#include "stm32f10x.h"
#define LED_R_GPIO_PIN                      GPIO_Pin_5
#define LED_R_GPIO_PORT                     GPIOB
#define LED_R_GPIO_CLK                      RCC_APB2Periph_GPIOB
 
 
#define ON      1
#define OFF     0
 
//  \C语言续行符,后面不能有任何东西
                                         
#define LED_R(a);       if (a)  \
                                                        GPIO_SetBits(LED_R_GPIO_PORT,LED_R_GPIO_PIN);\
                                        else        GPIO_ResetBits(LED_R_GPIO_PORT,LED_R_GPIO_PIN);
                                         
//C语言中的二进制运算符
//与1异或改变,与0异或不变
#define LED_R_TOGGLE                {LED_R_GPIO_PORT->ODR ^= LED_R_GPIO_PIN;}
void LED_GPIO_Config(void);
#endif /*__bsp_led._h*/

3. 参考资料

  •   原理图
  • 编程要点

    a. 使能 GPIO 端口时钟;

    b. 初始化 GPIO 目标引脚为输入模式 (浮空输入)
    c. 编写简单测试程序,检测按键的状态,实现按键控制 LED 灯。

  • 函数执行流程
    • (1) 使用 GPIO_InitTypeDef 定义 GPIO 初始化结构体变量,以便下面用于存储 GPIO 配置。
    • (2) 调用库函数 RCC_APB2PeriphClockCmd 来使能按键的 GPIO 端口时钟,调用时我们使用“|操作同时配置两个按键的时钟。
    • (3) GPIO 初始化结构体赋值,把引脚初始化成浮空输入模式,其中的 GPIO_Pin 使用宏KEYx_GPIO_PIN”来赋值,使函数的实现方便移植。由于引脚的默认电平受按键电路影响,所以设置成浮空输入。
    • (4) 使用以上初始化结构体的配置,调用 GPIO_Init 函数向寄存器写入参数,完成 GPIO 的初始化,这里的 GPIO 端口使用“KEYx_GPIO_PORT”宏来赋值,也是为了程序移植方便。
    • (5) 使用同样的初始化结构体,只修改控制的引脚和端口,初始化其它按键检测时使用的 GPIO引脚。
posted @   JRS077  阅读(314)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2020-10-19 爬虫入门实例
点击右上角即可分享
微信分享提示