目錄
一、按鈕簡單操作回憶
二、按鈕新操作實現
(1)按鈕的點擊實現燈亮/滅
①連接電路
②初始化板載LED和按鈕
③按鈕程序的基本原理(核心仍為0亮/1滅)
④按鈕消抖的原理
三、按鈕封裝的操作-點擊,雙擊,多擊,長按
(1)實驗結果
使用串口調試助手實現,按鈕的多種操作實現串口助手的數字變化。(單機-數字+1,雙擊數字清零,長按數字持續++)?
(2)搭建電路
(3)串口的初始化
(4)按鈕初始化
(5)進程函數(必須要有的)
一、按鈕簡單操作回憶
首先,回憶一下之前學過的GPIO的按鈕實驗,即做到了持續按下按鈕,燈持續亮,松開按鈕,則燈滅。
代碼的簡單邏輯是:
二、按鈕新操作實現
(1)按鈕的點擊實現燈亮/滅
最終實現:當點擊按鈕并松開的時候,實現燈亮,再點擊然后松開的時候,實現燈滅,即不斷的點擊切換燈的狀態。(這就不是之前的長按了)
①連接電路
?
②初始化板載LED和按鈕
初始化按鈕,其實就是初始化單片機的隨便一個正常的GPIO的引腳,初始化為輸入上拉模式;
初始化板子上的LED,其實就是將指定的GPIO的13引腳初始化為輸出開漏模式;
③按鈕程序的基本原理(核心仍為0亮/1滅)
這里主要的難點是當按鈕被點擊后,你松開按鈕的一瞬間讓燈實現狀態的轉換。
所以需要獲取松開按鈕的指令,核心為0亮/1滅,所以使用兩變量存儲狀態的變化,當變化發送,并且是信號從0變為1,表示松開按鈕了,那就向板載燈發送對應的信號。
這里邏輯很簡單,就是默認是按鈕松開的,所以默認是1的信號,然后不斷的讀當前的輸入寄存器的信號,當發生變化了,就:
首先判斷當前的變化是松開還是按下,我們這里實現的是按鈕松開去實現燈的變化,所以選擇第一個去實現。
之后在當前的if條件里面去切換亮滅狀態。(這里有個小難點,你不知道當前的燈的狀態是啥,所以你不好控制讓他亮還是滅,所以這里使用GPIO自帶的讀取輸出寄存器的值(讀取最近一次發送的值)接口去讀取他之前是的狀態是啥,如果之前的輸出寄存器是1(滅),那么就寫0讓他亮,相反同理。)
④按鈕消抖的原理
通過前面的實驗會進行基本的實現,但是會出現一個問題,就是按鈕有時候按下去失靈,這就是抖動出現的毛刺現象。
比如當按下的時候,會出現不穩定的波動毛刺,既而導致剛按下或者松開的一會,會有高低電壓的抖動,而失靈也正是因為此時你剛按下的時候,他一開始抖動造成的0-1-0-1-0這種,那因為一開始這種抖動變化的很快,導致人眼只能看見一開始的0和最后抖完的0,所以就相當于沒有變化,即失靈現象。
要解決這種,直接加個延遲就行。?
?
三、按鈕封裝的操作-點擊,雙擊,多擊,長按
(1)實驗結果
使用串口調試助手實現,按鈕的多種操作實現串口助手的數字變化。(單機-數字+1,雙擊數字清零,長按數字持續++)?
(2)搭建電路
(3)串口的初始化
串口初始化,就兩步
(1)IO引腳的初始化
(2)自身模塊的初始化
(4)按鈕初始化
封裝函數里面有這個button的封裝,直接用就行,其中有按鈕的Init,具體的功能為:
實現了按鈕的初始化,同樣是兩個參數:
一個是名稱(需要自己定義一個變量去傳地址進去)
一個是結構體(內部的那幾個可以都默認為0)
注意:這里按鈕的初始化里面沒有初始化引腳為IPU即輸入上拉模式,是因為在這個初始化參數里面默認實現了,所以這里的結構體只需提供GPIO名稱和引腳編號
(5)進程函數(必須要有的)
該函數需要放到main的while里面生效。
原因就是這個函數內部就是前面實現的那個按鈕點擊實現燈亮/滅的操作,這里去掉了燈的亮滅指令保留按鈕的按或者釋放的檢測功能。
當按鈕按下/釋放的時候,會自動執行(按鈕按下/或者按鈕釋放的回調函數)以及一個按鈕輪詢的一個函數,這個函數里面就根據檢測到按鈕的實現情況去動態的調用你自己實現的按鈕點擊和按鈕長按的回調函數