【STM32】GPIO输入—按键检测
Author:AXYZdong
自動化專業 工科男
有一點思考,有一點想法,有一點理性
文章目錄
- 2.1硬件設計
- 2.2軟件設計
- 2.2.1編程要點
- 2.2.2代碼分析
- 1.按鍵引腳宏定義
- 2.按鍵 GPIO初始化函數
- 3.主函數
- 參考文獻
點此下載完整工程文件
2.1硬件設計
彈性按鍵機械觸點斷開、閉合時,由于觸點的彈性作用,按鍵開關不會馬上穩定接通或一 下子斷開,使用按鍵時會產生如圖帶波紋信號,需要用軟件消抖處理濾波,不方便輸入檢測。當然有專用的去抖電路,也有專用的去抖芯片,但通常我們用軟件延時的方法就能解決抖動問題,沒有必要添加多余的硬件電路。
2.2軟件設計
同 LED 的工程,為了使工程更加有條理,我們把按鍵相關的代碼獨立分開存儲,方便 以后移植。在“工程模板”之上新建“bsp_key.c”及“bsp_key.h”文件,這些文件也可根 據您的喜好命名,這些文件不屬于 STM32標準庫的內容,是由我們自己根據應用需要編寫 的。
2.2.1編程要點
2.2.2代碼分析
1.按鍵引腳宏定義
同樣,在編寫按鍵驅動時,也要考慮更改硬件環境的情況。我們把按鍵檢測引腳相關 的宏定義到 “bsp_key.h”文件中
#ifndef _BSP_KEY_H #define _BSP_KEY_H #include "sys.h" #include "stm32f4xx.h"/*下面的方式是通過直接操作庫函數方式讀取IO*/ #define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //PE4 #define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) //PE3 //#define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) //PE2 #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) //PA0/*下面方式是通過位帶操作方式讀取IO*/ /* #define KEY0 PEin(4) //PE4 #define KEY1 PEin(3) //PE3 #define KEY2 PEin(2) //P32 #define WK_UP PAin(0) //PA0 */#define KEY0_PRES 1 #define KEY1_PRES 2 #define WKUP_PRES 3 //#define KEY2_PRES 4void KEY_Init(void); //IO初始化 u8 KEY_Scan(u8); //按鍵掃描函數#endif2.按鍵 GPIO初始化函數
#include "bsp_key.h" #include "delay.h"void KEY_Init() {GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4; //KEY2 KEY3對應引腳GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //普通輸入模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE2,3,4GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //WK_UP對應引腳PA0GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ; //下拉GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA0 } //按鍵處理函數 //返回按鍵值 //mode:0,不支持連續按;1,支持連續按; //0,沒有任何按鍵按下 //1,KEY0按下 //2,KEY1按下 //3,KEY2按下 //4,WKUP按下 WK_UP //注意此函數有響應優先級,KEY0>KEY1>KEY2>WK_UP!! u8 KEY_Scan(u8 mode) { static u8 key_up=1;//按鍵按松開標志if(mode)key_up=1; //支持連按 if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)){delay_ms(10);//去抖動 key_up=0;if(KEY0==0)return 1;else if(KEY1==0)return 2;else if(WK_UP==1)return 3; // else if(KEY2==0)return 4;}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; return 0;// 無按鍵按下 }3.主函數
#include "stm32f4xx.h" #include "bsp_led.h" #include "bsp_key.h" #include "sys.h" #include "delay.h"main() { u8 key; //保存鍵值delay_init(168); //初始化延時函數LED_GPIO_Config(); //初始化LED端口 KEY_Init(); //初始化與按鍵連接的硬件接口while(1){key=KEY_Scan(0); //得到鍵值if(key){ switch(key){ case 1: LED0=!LED0;break; //控制LED0翻轉case 2: LED1=!LED1;break; //控制LED1翻轉 case 3: LED0=!LED0;LED1=!LED1;break;//同時控制LED0,LED1翻轉 }}else delay_ms(10); } }代碼中初始化 LED 燈及按鍵后,在 while 函數里不斷調用 KEY_Scan函數,并判斷其返回值,若返回值表示按鍵按下,則反轉 LED 燈的狀態。
碼字不易,大家的支持就是我堅持下去的動力。點贊后不要忘了關注我哦!
參考文獻
【1】:《零死角玩轉 STM32—基于野火 F407[霸天虎]開發板 》
【2】:郭天祥.新概念51單片機C語言教程:如門、提高、開發、拓展全攻略[M].北京:電子工業出版社,2018.1:66
「你可能還想看」系列文章:
【STM32】點亮LED
【STM32】0.96寸OLED顯示屏(7針SPI協議)軟件模擬SPI
【STM32】1.44寸TFT液晶屏顯示字符、漢字和圖片
【STM32】stm32f407 + DS18B20 碰出不一樣的火花
【STM32】5分鐘了解STM32的串口通信
【STM32】串口通信—用代碼與芯片對話
【STM32】串口通信出現亂碼(使用官方標準庫)
【STM32】EXTI—外部中斷/事件控制器
【STM32】TIM—基本定時器
【STM32】PWM 輸出 (標準庫)
【STM32】CubeMX+HAL 點亮LED
【STM32】CubeMX+HAL 輸出PWM
【STM32】ST-LINK下載器下載后需復位,程序才運行的問題
其他相關文章:
【信號與系統】筆記合集,你確定不收藏嗎?我已經收藏了
我用50行代碼居然「讓天貓精靈把客廳燈開了」
流程圖在線繪制,快速、便捷、高效!
總結
以上是生活随笔為你收集整理的【STM32】GPIO输入—按键检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 速达软件二次开发-百威直配单和速达销售开
- 下一篇: html5 百度收录,百度网站收录教程(