日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【STM32】GPIO之按键

發布時間:2024/4/24 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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之按键的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。