STM32——按键
STM32——按鍵
宗旨:技術的學習是有限的,分享的精神是無限的。
一、GPIO工作模式
1、當I/O端口配置為輸入時:
輸出緩沖器被禁止
施密特觸發輸入被激活
根據輸入配置(上拉,下拉或浮動)的不同,弱上拉和下拉電阻被連接
出現在I/O腳上的數據在每個APB2時鐘被采樣到輸入數據寄存器
對輸入數據寄存器的讀訪問可得到I/O狀態
2、當I/O端口被配置為輸出時:
輸出緩沖器被激活
? ─ 開漏模式:輸出寄存器上的’0’激活 N-MOS,而輸出寄存器上的’1’將端口置于高阻狀態(P-MOS 從不被激活)。
? ─ 推挽模式:輸出寄存器上的’0’激活 N-MOS,而輸出寄存器上的’1’將激活 P-MOS。
施密特觸發輸入被激活
弱上拉和下拉電阻被禁止
出現在I/O腳上的數據在每個APB2時鐘被采樣到輸入數據寄存器
在開漏模式時,對輸入數據寄存器的讀訪問可得到I/O狀態
在推挽式模式時,對輸出數據寄存器的讀訪問得到最后一次寫的值。
?
二、庫函數GPIO_ReadInputDataBit
typedef enum {Bit_RESET = 0,Bit_SET } BitAction;uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx, uint16_t GPIO_Pin) // 返回輸入引腳電平的狀態 {uint8_t bitstatus = 0x00;/*Check the parameters */assert_param(IS_GPIO_ALL_PERIPH(GPIOx));assert_param(IS_GET_GPIO_PIN(GPIO_Pin));if((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET){bitstatus = (uint8_t)Bit_SET; // 按鍵沒被按下返回1}else{bitstatus = (uint8_t)Bit_RESET; // 按鍵按下返回0}return bitstatus; }<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">?</span>三、按鍵【消抖】
#ifndef _KEY_H_ #define _KEY_H_#include "stm32f10x.h" /******* *按鍵按下標置 KEY_ON 0 KEY_OFF 1 ********/ #define KEY_ON 0 #define KEY_OFF 1void KeyGPIOConfig(void); uint8_t KeyScan(GPIO_TypeDef *GPIOx, u16 GPIO_Pin);#endif /* _KEY_H_ */ #include "key.h"void Delay(__IO u32 count) {while(count--); }void KeyGPIOConfig(void) {GPIO_InitTypeDef GPIO_InitStructure;/*開啟按鍵端口(PE5)的時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; // GPIO輸入模式時,不用配置速率GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOE, &GPIO_InitStructure); }uint8_t KeyScan(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) {/*檢測是否有按鍵按下 */if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON ){/*延時消抖*/Delay(10000);if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON ){/*等待按鍵釋放 */while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON);return KEY_ON;}else{return KEY_OFF;}}else{return KEY_OFF;} }1、利用 GPIO_ReadInputDataBit() 讀取輸入數據,若從相應引腳讀取得的數據等于 0 (KEY_ON),低電平,表明可能有按鍵按下,調用延時函數。否則返回 KEY_OFF,表示按鍵沒有被按下。
2、 延時之后再次利用 GPIO_ReadInputDataBit() 讀取輸入數據,若依然為低電平,表明確實有按鍵被按下了。否則返回 KEY_OFF,表示按鍵沒有被按下。
3、 循環調用 GPIO_ReadInputDataBit()一直檢測按鍵的電平,直至按鍵被釋放,被釋放后,返回表示按鍵被按下的標志 KEY_ON。
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: HardwareRenderer EGL
- 下一篇: DoModal