5 STM32按鍵輸入實驗 GPIO做輸入

2021-09-25 21:43:58 字數 2520 閱讀 7409

stm32按鍵輸入實驗會把之前的led燈和蜂鳴器的控制加入進來,通過按鍵來進行控制,是乙個綜合性比較高的實驗。最後要實現的目的是:key_up 控制蜂鳴器,按一次叫,再按一次停; key1 控制 ds1,按一次亮,再按一次滅; key0 則同時控制 ds0 和 ds1,按一次,他們的狀態就翻轉一次。除此之外還要弄清楚兩種按鍵邏輯,一種是按了之後只觸發一次,另一種是按下之後連續觸發,在下面我會著重寫一下這方面的內容。

我用的是正點原子的精英版,硬體設計如上圖所示,如圖可以看到wk_up預設是低電平,按鈕按下才是高電平。所以應該是下拉輸入,反之key0和key1就應該是高電平,使用上拉輸入。而key0,key1接入是pe3和pe4,wk_up是pa0,等會也要對這幾個埠時鐘進行使能和初始化io口,步驟同於之前的點亮led燈。

和電視機遙控板按鈕一樣,按下按鈕之後它只一直響應(比如一直換台),直到你鬆開按鈕之後它才停止響應,對於這種模式的程式,可以通過如下程式進行設計

u8 key_scan(void)  //定義乙個掃瞄函式,檢測按鈕是否按下,只需每隔一段時間呼叫這個函式即可檢測按鈕狀態

return 0;// 無按鍵按下,返回乙個無效值,即不進行操作

像電源這類按鈕,一直按下之後他只會響應一次開或者關,而不會一直跳變開關,就是持續按下只響應一次的按鈕,我們在設計時就要檢測其前乙個狀態是否按下,如果前乙個狀態沒有按下而後乙個狀態按下了,即有效。若前乙個狀態已經按下了而後乙個狀態沒有按下則無效。具體程式設計思路如下所示。

u8 key_scan(void)

else if(按鈕沒有按下)key_up=1;

return 0;// 無按鍵按下

}

#include "stm32f10x.h"

#include "key.h"

#include "sys.h"

#include "delay.h"

void key_init(void) //io初始化

u8 key_scan(u8 mode)

else if(key0==1&&key1==1&&wk_up==0)key_up=1; //都沒有按下按鈕

return 0;// 無按鍵按下

}

以上兩個**都是key.c檔案中的,連起來則為key.c的源**。

#ifndef __key_h

#define __key_h

#include "sys.h"

//#define key0 pein(4) //pe4

//#define key1 pein(3) //pe3

//#define wk_up pain(0) //pa0 wk_up //通過位帶操作進行讀取gpio口的電平

#define key0 gpio_readinputdatabit(gpioe,gpio_pin_4)//通過庫函式讀取按鍵0的電平

#define key1 gpio_readinputdatabit(gpioe,gpio_pin_3)//讀取按鍵1

#define wk_up gpio_readinputdatabit(gpioa,gpio_pin_0)//讀取按鍵3(wk_up)

#define key0_pres 1 //key0按下

#define key1_pres 2 //key1按下

#define wkup_pres 3 //key_up按下(即wk_up/key_up)

void key_init(void);//io初始化

u8 key_scan(u8); //按鍵掃瞄函式

#endif

最後就是呼叫函式和實現功能的main函式,具體的邏輯和前面的部落格差不多,這裡就不多說了,唯一的區別就是通過了乙個按鍵掃瞄函式的返回值來分別控制led燈和蜂鳴器等元件

#include "led.h"

#include "delay.h"

#include "key.h"

#include "sys.h"

#include "beep.h"

int main(void)

}else delay_ms(10);

} }

蜂鳴器的原始碼和[4]stm32蜂鳴器實驗-io口的應用這篇鏈結裡面一模一樣,led燈的原始碼也基本和[1]用stm32點亮第乙個led燈-用庫函式實現相同,唯一不同的地方就是在led.h裡面新增了兩個巨集定義的位帶操作,如下,只需將這段**粘進去即可。

#define led0 pbout(5)// pb5

#define led1 peout(5)// pe5

學習記錄 STM32按鍵輸入實驗

使用藍橋杯ct117e板子 使用stm32標準庫檔案 從圖中可以看出在按鍵未按下時,引腳為高電平。當按鍵按下時引腳為低電平。所以在gpio初始化時使用上拉輸入模式。1.初始化相應引腳 gpio inittypedef gpioa init key gpio inittypedef gpiob ini...

stm32按鍵輸入

對於上乙個實驗流水燈來說,這一次的實驗是獲取輸入的乙個小demo。在課堂上,看老師除錯的時候,只要有輸入則輸入暫存器idr的值就會改變,所以想要獲得輸入只需要迴圈去獲取idr的值即可。在stm32的庫中有乙個讀取輸入資訊的函式 uint8 t gpio readinputdatabit gpio t...

STM32按鍵輸入

這一節通過按鍵輸入的實驗,完成對io口配置輸入的學習,同時學習如何通過軟體去抖動。這一節最終可以實現利用wk up按鍵控制led亮滅的效果。與上一節點亮led相類似,這一節也需要在hardware資料夾內新建檔案key.h和key.c。同時將相應的檔案加入到工程中。檢視原理圖,獲取wk up按鍵的相...