stm32使用固件库实现按键输入检测

1. 使用固件库操作实现按键输入检测功能,同时使用LED灯指示按键状态。

2. 代码:

  main.c主函数

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_key.h"
 
/*主函数*/
int main(void)
{      
    LED_GPIO_Config();      /*LED灯端口初始化*/
    KEY_GPIO_Config();      /*按键端口初始化*/
    GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);  /*设置LED灯初始化状态为灭*/
    while(1)            /*循环检测按键端口状态*/
    {
        if (KeyScan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON)        /*如果扫描按键端口电平为高,则打开LED灯*/
        {
                GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); /*开灯*/
        }
    }
 
}

  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"
/*按键初始化函数,跟LED初始化函数类似*/
void KEY_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;       /*使用 GPIO_InitTypeDef 定义 GPIO 初始化结构体变量*/
     
    RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE);   /*开时钟*/
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;              /*设置GPIO pin口*/
    GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IN_FLOATING;   /*设置输入模式为浮空输入*/
    GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;   /*设置速率*/
    GPIO_Init(GPIOA, &GPIO_InitStruct); /*调用 GPIO_Init 函数向寄存器写入参数,完成 GPIO 的初始化*/
}
 
/*按键扫描函数*/
uint8_t KeyScan(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;  /*返回按键状态1*/
    }
    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"
/*按键GPIO口宏定义*/
#define KEY1_GPIO_PIN                   GPIO_Pin_0             
#define KEY1_GPIO_PORT              GPIOA
#define KEY1_GPIO_CLK                   RCC_APB2Periph_GPIOA
 
#define KEY_ON      1
#define KEY_OFF     0
 
 
     
void KEY_GPIO_Config(viod);
#endif /*__bsp_key_h*/

  bsp_led.c

  

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

  bsp_led.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"
/*按键GPIO口宏定义*/
#define KEY1_GPIO_PIN                   GPIO_Pin_0             
#define KEY1_GPIO_PORT              GPIOA
#define KEY1_GPIO_CLK                   RCC_APB2Periph_GPIOA
 
#define KEY_ON      1
#define KEY_OFF     0
 
 
     
void KEY_GPIO_Config(viod);
#endif /*__bsp_key_h*/

  

 3. 参考资料

  野火原理图

  

 

 

 

   

 

 

 

4. 总结:

  (1)  每个程序编写没有明确的前后顺序,都需要交叉编写。但bsp_led.c和bsp_led.h优先比bsp_key.c和bsp_key.h编写。

  (2)  功能框图

    

 

 

  (3)  目前只实现了按键按下灯亮操作,没有实现灯亮灭切换。后续补充ing

 

posted @   JRS077  阅读(380)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示