【STM32】GPIO之按键
00. 目錄
文章目錄
- 00. 目錄
- 01. 功能描述
- 02. 控制原理
- 03. 程序示例一
- 04. 程序示例二
- 05. 程序實例三
- 06. 附錄
- 07. 聲明
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);}}}06. 附錄
6.1 【STM32】STM32系列教程匯總
網址:【STM32】STM32系列教程匯總
07. 聲明
該教程參考了正點原子的《STM32 F4 開發指南》
總結
以上是生活随笔為你收集整理的【STM32】GPIO之按键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【STM32】GPIO之蜂鸣器
- 下一篇: 【STM32】GPIO功能复用