- 實(shí)驗(yàn)?zāi)康?/font>
- 在流水燈實(shí)現(xiàn)中,我們通過(guò)對(duì)GPIO與LED燈相連的相應(yīng)引腳輸出高低電平來(lái)控制燈的亮滅。使用的是輸出模式。
- 今天的實(shí)驗(yàn)學(xué)習(xí)要使用GPIO口的輸入模式,通過(guò)對(duì)與按鍵相連的引腳數(shù)據(jù)的讀取來(lái)控制燈的亮滅。
- 了解什么是按鍵抖動(dòng)和軟件消抖的方法。
- 在圖中我們看到,KEY1鍵和KEY2、3、4鍵有些不同。KEY1鍵按下輸出為高電平,而其他三個(gè)鍵按下左接地輸出低電平。
- 同時(shí)可以看出KEY1接GPIOA的0號(hào)引腳,KEY2、3、4分別接GPIOE的1、2、3號(hào)引腳。

- 除了我們?cè)诹魉疅糁兄v到的時(shí)鐘使能函數(shù),幾個(gè)GPIO控制函數(shù)外,僅需要用到另外一個(gè)GPIO控制函數(shù),函數(shù)定義如下圖。(同樣是在上章提到的固件庫(kù)中)。
- 該函數(shù)是讀入引腳信號(hào)的,既可以用于讀按鍵信號(hào)
- 當(dāng)然,除了按位讀取,也可以多位讀取,相關(guān)的函數(shù)有興趣可自己查閱固件庫(kù)。
機(jī)械的按鍵結(jié)構(gòu)中必然有彈簧,由于彈簧的彈性,按鍵按下或松開(kāi)的短暫過(guò)程中不會(huì)立即改變電平狀態(tài),而是需要一定的接觸、不充分接觸、斷開(kāi)導(dǎo)致的電平變化過(guò)程,一定時(shí)間后才能穩(wěn)定電位,稱(chēng)之為抖動(dòng)。
- 抖動(dòng)會(huì)影響按鍵狀態(tài)的讀取,需要通過(guò)消除抖動(dòng)來(lái)達(dá)到確定按鍵狀態(tài),方法有硬件消抖和軟件消抖。本實(shí)驗(yàn)板不具備硬件消抖,既必須通過(guò)軟件進(jìn)行消抖。
- 軟件消抖有什么方法呢?
- 通過(guò)中斷,定時(shí)讀取引腳狀態(tài),確定時(shí)限內(nèi)連續(xù)幾次讀入狀態(tài)一致,則可確定其進(jìn)入抖動(dòng)后的穩(wěn)定狀態(tài),則可開(kāi)始下一步操作。但目前我們未學(xué)習(xí)使用STM32的中斷控制,所以不采用這種方法。
- 第二種方法是延時(shí)。在第一次讀到某種狀態(tài)后,通過(guò)延時(shí)函數(shù)使CPU合適的時(shí)間的無(wú)意義操作后,再次讀取狀態(tài),若兩次狀態(tài),則可以認(rèn)為進(jìn)入穩(wěn)定裝入,則可開(kāi)始下一步操作。
按鍵控制實(shí)現(xiàn)程序
六、HAL庫(kù)的按鍵實(shí)現(xiàn)
- 同樣是像流水燈中介紹的方式創(chuàng)建工程,設(shè)置時(shí)鐘,設(shè)置燈的引腳狀態(tài)。但多了對(duì)按鍵引腳的設(shè)置。找到PA0和PE1設(shè)置為輸出推挽不上不下拉低速模式。其他步驟流水燈工程創(chuàng)建一致。
接下來(lái)我們看具體的程序。
這兩個(gè)庫(kù)的程序在判斷按鍵狀態(tài)的時(shí)候是并行判斷,準(zhǔn)確來(lái)說(shuō)是一個(gè)先一個(gè)后的if判斷,并沒(méi)有討論同時(shí)按下兩個(gè)鍵如何判斷和操作原則。雖然這種if并行判斷可以處理一些同時(shí)按下的情況,但不能對(duì)應(yīng)到所有的情況。那么,可以思考下,如何實(shí)現(xiàn)雙鍵按下的判斷?