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 上。
这里需要注意的是:KEY0、KEY1 和 KEY2 是低电平有效的,而 KEY_UP 是高电平有效的,并且外部都没有上下拉电阻,所以,需要在STM32F4 内部设置上下拉。
03. 程序示例一
Key0控制LED1 Key1控制LED2
key.h文件内容
- #ifndef __KEY_H__
- #define __KEY_H__
- #include "sys.h"
- #define KEY0 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4)
- #define KEY1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3)
- #define KEY2 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2)
- #define WK_UP GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
- #define KEY0_PRESS 1
- #define KEY1_PRESS 2
- #define KEY2_PRESS 3
- #define WK_UP_PRESS 4
- //GPIO初始化
- void KEY_Init(void);
- //按键扫描
- u8 Key_Scan(void);
- #endif/*__KEY_H__*/
复制代码
key.c文件内容
- #include "key.h"
- #include "delay.h"
- //GPIO初始化
- void KEY_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
-
- //时钟使能
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE);
-
- //GPIO初始化
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
-
- GPIO_Init(GPIOE, &GPIO_InitStruct);
-
- //GPIO初始化
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
-
- }
- //按键扫描
- u8 Key_Scan(void)
- {
- //表示按键处于松开状态
- static u8 key_up = 1;
-
- if (key_up && (0 == KEY0 || 0 == KEY1 || 0 == KEY2 || 1 == WK_UP))
- {
- //防抖
- delay_ms(10);
-
- //表示按键已经按下
- key_up = 0;
-
- if (0 == KEY0)
- {
- return KEY0_PRESS;
- }
- else if (0 == KEY1)
- {
- return KEY1_PRESS;
- }
- else if (0 == KEY2)
- {
- return KEY2_PRESS;
- }
- else if (1 == WK_UP)
- {
- return WK_UP_PRESS;
- }
- }
- else if ((1 == KEY0) && (1 == KEY1) && (1 == KEY2) && (0 == WK_UP))
- {
- //表示按键已经松开
- key_up = 1;
- }
-
- return 0;
- }
复制代码
main.c文件
- #include "stm32f4xx.h"
- #include "delay.h"
- #include "led.h"
- #include "beep.h"
- #include "key.h"
- //Key0 控制LED1 Key1控制LED2
- int main(void)
- {
- u8 key = 0;
-
- //初始化
- delay_init(168);
- LED_Init();
- BEEP_Init();
- KEY_Init();
-
- LED1 = 0;
- LED2 = 0;
- BEEP = 0;
-
- while(1)
- {
- key = Key_Scan();
-
- if (0 != key)
- {
- switch(key)
- {
- case KEY0_PRESS:
- LED1 = !LED1;
- break;
- case KEY1_PRESS:
- LED2 = !LED2;
- break;
- }
-
- }
- else
- {
- delay_ms(10);
- }
- }
-
- }
复制代码
04. 程序示例二
WK_UP控制蜂鸣器
main.c
- #include "stm32f4xx.h"
- #include "delay.h"
- #include "led.h"
- #include "beep.h"
- #include "key.h"
- //Key0 控制LED1 Key1控制LED2
- int main(void)
- {
- u8 key = 0;
-
- //初始化
- delay_init(168);
- LED_Init();
- BEEP_Init();
- KEY_Init();
-
- LED1 = 0;
- LED2 = 0;
- BEEP = 0;
-
- while(1)
- {
- key = Key_Scan();
-
- if (0 != key)
- {
- switch(key)
- {
- case KEY0_PRESS:
- LED1 = !LED1;
- break;
- case KEY1_PRESS:
- LED2 = !LED2;
- case WK_UP_PRESS:
- BEEP = !BEEP;
- break;
- }
-
- }
- else
- {
- delay_ms(10);
- }
- }
-
- }
复制代码
05. 程序实例三
综合实例
KEY_UP 控制蜂鸣器,按一次叫,再按一次停;KEY0 控制 DS0,按一次亮,再按一次灭;KEY1 控制 DS1,效果同 KEY2;KEY2 则同时控制 DS0 和 DS1,按一次,它们的状态就翻转一次。
main.c文件
- #include "stm32f4xx.h"
- #include "delay.h"
- #include "led.h"
- #include "beep.h"
- #include "key.h"
- //Key0 控制LED1 Key1控制LED2
- int main(void)
- {
- u8 key = 0;
-
- //初始化
- delay_init(168);
- LED_Init();
- BEEP_Init();
- KEY_Init();
-
- LED1 = 0;
- LED2 = 0;
- BEEP = 0;
-
- while(1)
- {
- key = Key_Scan();
-
- if (0 != key)
- {
- switch(key)
- {
- case KEY0_PRESS:
- LED1 = !LED1;
- break;
- case KEY1_PRESS:
- LED2 = !LED2;
- break;
- case KEY2_PRESS:
- LED1 = !LED1;
- LED2 = !LED2;
- break;
- case WK_UP_PRESS:
- BEEP = !BEEP;
- break;
- }
-
- }
- else
- {
- delay_ms(10);
- }
- }
-
- }
复制代码
|