本篇文章主要是學習以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...