[其他ST产品] STM32学习笔记 - 按键操作

[复制链接]
408|3
 楼主| qn7a12 发表于 2023-7-27 23:38 | 显示全部楼层 |阅读模式
STM32学习笔记 - 按键操作1、创建板级支持包

延续上节的程序,在User目录下创建KEY文件夹,包含bsp_key.c及头文件bsp_key.h,之后在Keil中将bsp_key.c加入


4135164c28f5909eba.png


2、程序

bsp_key.h

  1. #ifndef __BSP_KEY_H__
  2. #define __BSP_KEY_H__

  3. #include "stm32f4xx.h"
  4. #include "stm32f4xx_rcc.h"

  5. #define KEY1_PIN    GPIO_Pin_0
  6. #define KEY1_PORT   GPIOA
  7. #define KEY1_CLK    RCC_AHB1Periph_GPIOA

  8. #define KEY2_PIN    GPIO_Pin_13
  9. #define KEY2_PORT   GPIOC
  10. #define KEY2_CLK    RCC_AHB1Periph_GPIOC

  11. #define KEY_ON  1
  12. #define KEY_OFF 0

  13. void Key_Config(void);
  14. uint8_t Key_Scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);

  15. #endif  /* __BSP_KEY_H__ */




 楼主| qn7a12 发表于 2023-7-27 23:38 | 显示全部楼层
bsp_key.c
  1. #include ".\KEY\bsp_key.h"

  2. void Key_Config(void)
  3. {
  4.     //创建GPIO_InitTypeDef结构体变量
  5.     GPIO_InitTypeDef KEY_InitStructure;
  6.    
  7.     //使能按键所在端口时钟
  8.     RCC_AHB1PeriphClockCmd(KEY1_CLK|KEY2_CLK,ENABLE);

  9.     //设置端口模式为输入
  10.     KEY_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  11.    
  12.     //设置端口上下拉模式为浮空模式
  13.     KEY_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  14.    
  15.     //配置为输入模式,OType、PuPd、Speed寄存器无需配置
  16.    
  17.     //选择按键引脚key1
  18.     KEY_InitStructure.GPIO_Pin = KEY1_PIN;
  19.     //初始化引脚
  20.     GPIO_Init(KEY1_PORT,&KEY_InitStructure);
  21.    
  22.     //选择按键引脚key2
  23.     KEY_InitStructure.GPIO_Pin = KEY2_PIN;
  24.     //初始化引脚
  25.     GPIO_Init(KEY2_PORT,&KEY_InitStructure);
  26.    
  27. }

  28. uint8_t Key_Scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)
  29. {
  30.     //判断按键是否按下
  31.     if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)
  32.     {
  33.         //消抖,等待按键释放
  34.         while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);        //调用库函数读取按键输入
  35.         return KEY_ON;
  36.     }
  37.     else
  38.         return KEY_OFF;
  39. }
 楼主| qn7a12 发表于 2023-7-27 23:41 | 显示全部楼层
main.c

  1. #include "stm32f4xx.h"
  2. #include ".\LED\bsp_led.h"
  3. #include ".\KEY\bsp_key.h"

  4. int main(void)
  5. {
  6.         Led_Config();
  7.         Key_Config();
  8.     while(1)
  9.     {
  10.         if(Key_Scan(KEY1_PORT,KEY1_PIN) == KEY_ON)
  11.             LED_R_TOGGLE;
  12.         if(Key_Scan(KEY2_PORT,KEY2_PIN) == KEY_ON)
  13.             LED_G_TOGGLE;
  14.     }
  15. }
 楼主| qn7a12 发表于 2023-7-27 23:41 | 显示全部楼层
下载测试!
注:
1、这节因为跟上节是上节写完后测试的(上班摸鱼没带板子,只能下班回家后再测),所以也有标准库中LED端口时钟使能宏复制错的问题;
2344464c2902c03233.png
2、bsp_key板级支持包写完后,在main函数中没有调用Led和Key的配置函数,结果也是调试结果与预期不同。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

542

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部