STM32的按鍵的暫存器配置學習2

2021-10-03 23:19:47 字數 2402 閱讀 7657

本篇文章主要是學習以m3核心的stm32的按鍵的

按鍵的機械觸點斷開、閉合時,由於觸點的彈性作用,按鍵開關不會馬上穩點接通或斷開,會在按下後產生帶波紋訊號分別為

前抖動和後抖動

,需要使用軟體消抖處理濾波(當然硬體也可實現消抖功能,與按鍵併聯乙個0.1uf的電容,硬體的消抖功能便是通過電容的充放電實現延時從而消除了波紋,從而簡化的軟體的處理)。下面的程式是採用軟體程式設計去抖動的。

首先進行按鍵的初始化,程式為:

gpioa->crl&=0xfffffff0;//清掉pa0位原來的設定,同時也不影響其他位的設定

gpioa->crl|=0x00000008;//pa0 設定成輸入,預設下拉

gpioe->crl&=0xfff000ff;//清掉pe2~4位原來的設定,同時也不影響其他位的設定

gpioe->crl|=0x00088800;//清掉完原來的設定,此時就可以設定pe2~4為上拉輸入

gpioe->odr|=7<<2; //pe2~4 上拉操作,從第二位往高位數3位,即為111,為7

按鍵的處理函式:用軟體去抖動:(程式裡有具體的解釋)

static u8 key_up=1;//按鍵按鬆開標誌

if(mode)key_up=1; //支援連按,即需要長按

if(key_up&&(key0==0||key1==0||key2==0||wk_up==1))//&&是並且的意思,||或者

else if(key0==1&&key1==1&&key2==1&&wk_up==0)key_up=1;

return 0;// 無按鍵按下

//mode:0,不支援連續按;1,支援連續按;當 mode 為 0 的時候,key_scan 函式將不支援連續按,掃瞄某個按鍵按下之後必須要鬆開,才能第二次觸發,否則不會再響應這個按鍵,這樣的好處就是可以防止按一次多次觸發,而壞處就是在需要長按的時候比較不合適

//1,key0 按下//2,key1 按下//3,key2 按下//4,key3 按下 wk_up,在下面的key.h中的巨集定義中會有定義

//注意此函式有響應優先順序,key0>key1>key2>key3!!

程式如下: (key.c)

#include "key.h"

#include "delay.h"

//按鍵初始化函式

void key_init(void)

//按鍵處理函式

//返回按鍵值

u8 key_scan(u8 mode)

else if(key0==1&&key1==1&&key2==1&&wk_up==0)key_up=1;

return 0;// 無按鍵按下

}

程式如下: (key.h)

#ifndef __key_h

#define __key_h

#include "sys.h"

#define key0 (1<<4) //key0 pe4

#define key1 (1<<3) //key1 pe3

#define key2 (1<<2) //key2 pe2

#define wk_up (1<<0) //key_up pa0

#define key0_get() ((gpioe->idr&(key0))?1:0) //讀取按鍵 key0

#define key1_get() ((gpioe->idr&(key1))?1:0) //讀取按鍵 key1

#define key2_get() ((gpioe->idr&(key2))?1:0) //讀取按鍵 key2

#define wk_up _get() ((gpioa->idr&( wk_up))?1:0) //讀取按鍵 key_up

#define key0_pres 1 //key0 按下

#define key1_pres 2 //key1 按下

#define key2_pres 3 //key2 按下

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

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

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

#endif

程式如下: (main.c)

#include "sys.h"

#include "delay.h"

#include "led.h"

#include "beep.h"

#include "key.h"

int main(void)

}else delay_ms(10);

}}

以上的程式可以從戰艦開發板上找到,想更全面的學習,可以去學習開發板的資料。

STM32蜂鳴器 暫存器

這次實驗犯了個笑話,竟然在巨集定義後面加分號.就像這樣 define 大家千萬不要學我,結果報錯expected expression,還苦惱半天,想為啥操作不了暫存器了?我真愚蠢!剛開始我也不會寫這些東西,其實摸清套路就好,rcc時鐘使能 gpio初始化 相關暫存器初始化 延時函式 串列埠等初始化...

STM32暫存器對映

1.對映即將記憶體的某段位址與某一暫存器對應,微控制器對函式的操作底層是操作暫存器,而暫存器最終是操作記憶體上對應的單元,2.各個暫存器對應的位址都是在st定義的起始位址上層層偏移得到 3.想要實現某功能可直接對此段記憶體寫進相應的值,即可賦予某一功能 4.stm32底層實際是先定義出外設基位址,然...

野火STM32暫存器配置GPIO

1 讀庫函式的一些巨集定義和結構體 define io voiatile typedef unsigned int uint32 t typedef unsigned shrot uint16 t 以結構體的形式定義好了外設暫存器後,使用結構體前還需要給結構體的首位址賦值,才能訪問到需要的暫存器 e...