你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32 GPIO之按键

[复制链接]
STMCU小助手 发布时间:2022-4-2 15:00
01. 功能描述
STM32F4 的 IO口做输入使用的时候,是通过调用函数 GPIO_ReadInputDataBit()来读取 IO 口的状态的。

探索者 STM32F4 开发板上载有的 4 个按钮(KEY_UP、KEY0、KEY1 和 KEY2),来控制板上的 2 个 LED(DS0 和 DS1)和蜂鸣器,其中 KEY_UP 控制蜂鸣器,按一次叫,再按一次停;KEY0 控制 DS0,按一次亮,再按一次灭;KEY1 控制 DS1,
效果同 KEY2;KEY2 则同时控制 DS0 和 DS1,按一次,它们的状态就翻转一次。

02. 控制原理
探索者 STM32F4开发板上的按键 KEY0 连接在 PE4 上、KEY1 连接在 PE3 上、KEY2 连接在 PE2 上、KEY_UP连接在 PA0 上。

{NU5BGQ%_NO$C][26Z[5EHG.png

这里需要注意的是:KEY0、KEY1 和 KEY2 是低电平有效的,而 KEY_UP 是高电平有效的,并且外部都没有上下拉电阻,所以,需要在STM32F4 内部设置上下拉。

03. 程序示例一
Key0控制LED1 Key1控制LED2

key.h文件内容

  1. #ifndef __KEY_H__
  2. #define __KEY_H__

  3. #include "sys.h"


  4. #define KEY0 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4)
  5. #define KEY1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3)
  6. #define KEY2 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2)
  7. #define WK_UP GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)

  8. #define KEY0_PRESS 1
  9. #define KEY1_PRESS 2
  10. #define KEY2_PRESS 3
  11. #define WK_UP_PRESS 4

  12. //GPIO初始化
  13. void KEY_Init(void);

  14. //按键扫描
  15. u8 Key_Scan(void);


  16. #endif/*__KEY_H__*/
复制代码

key.c文件内容

  1. #include "key.h"
  2. #include "delay.h"

  3. //GPIO初始化
  4. void KEY_Init(void)
  5. {
  6.         GPIO_InitTypeDef GPIO_InitStruct;
  7.         
  8.         //时钟使能
  9.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE);
  10.         
  11.         //GPIO初始化
  12.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
  13.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  14.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
  15.         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  16.         
  17.         GPIO_Init(GPIOE, &GPIO_InitStruct);
  18.         
  19.         //GPIO初始化
  20.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
  21.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  22.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
  23.         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
  24.         GPIO_Init(GPIOA, &GPIO_InitStruct);
  25.         
  26. }

  27. //按键扫描
  28. u8 Key_Scan(void)
  29. {
  30.         //表示按键处于松开状态
  31.         static u8 key_up = 1;
  32.         
  33.         if (key_up && (0 == KEY0 || 0 == KEY1 || 0 == KEY2 || 1 == WK_UP))
  34.         {
  35.                 //防抖
  36.                 delay_ms(10);
  37.                
  38.                 //表示按键已经按下
  39.                 key_up = 0;
  40.                
  41.                 if (0 == KEY0)
  42.                 {
  43.                         return KEY0_PRESS;
  44.                 }
  45.                 else if (0 == KEY1)
  46.                 {
  47.                         return KEY1_PRESS;
  48.                 }
  49.                 else if (0 == KEY2)
  50.                 {
  51.                         return KEY2_PRESS;
  52.                 }
  53.                 else if (1 == WK_UP)
  54.                 {
  55.                         return WK_UP_PRESS;
  56.                 }
  57.         }
  58.         else if ((1 == KEY0) && (1 == KEY1) && (1 == KEY2) && (0 == WK_UP))
  59.         {
  60.                 //表示按键已经松开
  61.                 key_up = 1;
  62.         }

  63.         
  64.         return 0;
  65. }
复制代码

main.c文件

  1. #include "stm32f4xx.h"

  2. #include "delay.h"
  3. #include "led.h"
  4. #include "beep.h"
  5. #include "key.h"

  6. //Key0 控制LED1 Key1控制LED2
  7. int main(void)
  8. {
  9.         u8 key = 0;
  10.         
  11.         //初始化
  12.         delay_init(168);
  13.         LED_Init();
  14.         BEEP_Init();
  15.         KEY_Init();
  16.         
  17.         LED1 = 0;
  18.         LED2 = 0;
  19.         BEEP = 0;
  20.         
  21.         while(1)
  22.         {
  23.                 key = Key_Scan();
  24.                
  25.                 if (0 != key)
  26.                 {
  27.                         switch(key)
  28.                         {
  29.                                 case KEY0_PRESS:
  30.                                         LED1 = !LED1;
  31.                                         break;
  32.                                 case KEY1_PRESS:
  33.                                         LED2 = !LED2;
  34.                                         break;
  35.                         }
  36.                
  37.                 }
  38.                 else
  39.                 {
  40.                         delay_ms(10);
  41.                 }
  42.         }
  43.         
  44. }
复制代码


04. 程序示例二
WK_UP控制蜂鸣器

main.c

  1. #include "stm32f4xx.h"

  2. #include "delay.h"
  3. #include "led.h"
  4. #include "beep.h"
  5. #include "key.h"

  6. //Key0 控制LED1 Key1控制LED2
  7. int main(void)
  8. {
  9.         u8 key = 0;
  10.         
  11.         //初始化
  12.         delay_init(168);
  13.         LED_Init();
  14.         BEEP_Init();
  15.         KEY_Init();
  16.         
  17.         LED1 = 0;
  18.         LED2 = 0;
  19.         BEEP = 0;
  20.         
  21.         while(1)
  22.         {
  23.                 key = Key_Scan();
  24.                
  25.                 if (0 != key)
  26.                 {
  27.                         switch(key)
  28.                         {
  29.                                 case KEY0_PRESS:
  30.                                         LED1 = !LED1;
  31.                                         break;
  32.                                 case KEY1_PRESS:
  33.                                         LED2 = !LED2;
  34.                                 case WK_UP_PRESS:
  35.                                         BEEP = !BEEP;
  36.                                         break;
  37.                         }
  38.                
  39.                 }
  40.                 else
  41.                 {
  42.                         delay_ms(10);
  43.                 }
  44.         }
  45.         
  46. }
复制代码

05. 程序实例三
综合实例

KEY_UP 控制蜂鸣器,按一次叫,再按一次停;KEY0 控制 DS0,按一次亮,再按一次灭;KEY1 控制 DS1,效果同 KEY2;KEY2 则同时控制 DS0 和 DS1,按一次,它们的状态就翻转一次。

main.c文件

  1. #include "stm32f4xx.h"

  2. #include "delay.h"
  3. #include "led.h"
  4. #include "beep.h"
  5. #include "key.h"

  6. //Key0 控制LED1 Key1控制LED2
  7. int main(void)
  8. {
  9.         u8 key = 0;
  10.         
  11.         //初始化
  12.         delay_init(168);
  13.         LED_Init();
  14.         BEEP_Init();
  15.         KEY_Init();
  16.         
  17.         LED1 = 0;
  18.         LED2 = 0;
  19.         BEEP = 0;
  20.         
  21.         while(1)
  22.         {
  23.                 key = Key_Scan();
  24.                
  25.                 if (0 != key)
  26.                 {
  27.                         switch(key)
  28.                         {
  29.                                 case KEY0_PRESS:
  30.                                         LED1 = !LED1;
  31.                                         break;
  32.                                 case KEY1_PRESS:
  33.                                         LED2 = !LED2;
  34.                                         break;
  35.                                 case KEY2_PRESS:
  36.                                         LED1 = !LED1;
  37.                                         LED2 = !LED2;
  38.                                         break;        
  39.                                 case WK_UP_PRESS:
  40.                                         BEEP = !BEEP;
  41.                                         break;
  42.                         }
  43.                
  44.                 }
  45.                 else
  46.                 {
  47.                         delay_ms(10);
  48.                 }
  49.         }
  50.         
  51. }
复制代码

收藏 评论0 发布时间:2022-4-2 15:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版