關(guān)于藍(lán)橋杯單片機(jī)官方例程矩陣按鍵消抖原理解釋
項(xiàng)目場景:
芯片:IAP15F2K60S
藍(lán)橋杯原書41頁官方例程
問題描述
最開始我以為這款開發(fā)板有硬件消抖,對于下面這部分代碼一直當(dāng)作固定格式寫,最近回看,發(fā)現(xiàn)其中另有“玄機(jī)”。
......
ucKey_Val = Key_Read();
ucKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val);
ucKey_Old = ucKey_Val;
......
原因分析:
這里默認(rèn)大家看過并且會了 = = 之前的按鍵掃描例程了
眾所周知,“ ^ ” 符號在C語言中是按位取 “ 異或 ” 的意思,并且,“ & ” 符號是按位取 “ 與 ”的意思。
這段代碼的含義是獲取掃描后的案件值然后進(jìn)行消抖處理,我所截取的這一段代碼是只保留了單邊沿的。
詳解:
首先,對于后面的異或,其作用到了ucKey_Old和ucKey_Val,其中ucKey_Old是上一次掃描按鍵獲取的數(shù)值,包括獲取到0,而ucKey_Val是這一次掃描按鍵獲取的數(shù)值。如果二者不同,則會產(chǎn)生 “ 非零 ” 的結(jié)果,將代碼改成如下。
......
ucKey_Val = Key_Read();
ucKey_Down = (ucKey_Old ^ ucKey_Val);
ucKey_Old = ucKey_Val;
if(ucKey_Down)
{
......
}
......
只要本次接收與上一次接收的按鍵值不同,ucKey_Down就會存儲下“非零”的數(shù)值?;叵胍幌?,我們按鍵其實(shí)是有兩個沿的,一次下降沿,一次上升沿。
更具體地針對官方例程來說,如果我按下4按鍵,那么他檢測到的數(shù)值會出現(xiàn)兩段變化,一次是ucKey_Val 從0到4的變化,另一次是其從4到0 的變化。
這樣就會導(dǎo)致我的ucKey_Down在這兩次變化過后都會有一次 “ 非零 ” 數(shù)值的出現(xiàn),所以反應(yīng)在我的輸出上,就會將后面緊隨的 if 代碼段執(zhí)行兩次,這說明我們的 " ^ " 取異或只實(shí)現(xiàn)了部分的消抖功能,還需要保留單邊沿,而非雙邊。
沒錯,我們的 “ & ” 取與符號就是實(shí)現(xiàn)的這個功能。我們分段討論下0–4–0這個連續(xù)變化。
首先是 0–4,這段變化中,
我的 ucKey_Old = 0x00, 我的 ucKey_Val = 0x04;
因?yàn)檫@是從0到4的不同數(shù)值的變化,所以后面的取異或符號運(yùn)算結(jié)束后一定是一個 “ 非零 ” 的量,并且結(jié)果一定是與 ucKey_Val 的數(shù)值相等!又加之與一個非零的 ucKey_Val 取與,那不就是 ucKey_Val 本身求與嘛?。?!這就使得 ucKey_Down 最后的結(jié)果為 “ 非零 ” 的 ucKey_Val本身!!!這樣解釋了為什么后面會有
switch(ucKey_Down)
{
......
}
的出現(xiàn),原來我們僅憑借ucKey_Down的數(shù)值就可以判斷我按下的是什么鍵。
-------------分隔符--------------
接下來是4–0這一段的變化,
我的 ucKey_Old = 0x40, 我的 ucKey_Val = 0x00;
之前說到如果是不同數(shù)值之間的變化必然會導(dǎo)致異或的結(jié)果為 “ 非零 ” 數(shù)值,所以這一段就很好明白了,我加上取與符號后,實(shí)現(xiàn)了ucKey_Val & “ 非零 ”,其中ucKey_Val為0,會將我的ucKey_Down,結(jié)果變成 0,這就實(shí)現(xiàn)了我取單邊沿的效果。文章來源:http://www.zghlxwxcb.cn/news/detail-401598.html
總結(jié)
異或 “ ^ ” 是用來消抖的,只有掃描到不同的數(shù)值之后我才會發(fā)生變化。
取余 “ & ”是用來保留單邊沿的,因?yàn)閱螁问褂?^" 時(shí),笨蛋機(jī)器不能判斷是哪兩個數(shù)值之間的變化,究竟是0–4還是4–0呢?當(dāng)我加上 “ & ” 之后就可以消除一個沿。
PS:文中我們是以下降沿為例說明的,其實(shí)保留上升沿的話取個 “ ~ ” 就可以了,具體為啥,大家想想吧。文章來源地址http://www.zghlxwxcb.cn/news/detail-401598.html
到了這里,關(guān)于關(guān)于藍(lán)橋杯單片機(jī) 官方例程 矩陣按鍵 消抖原理 ‘s 解釋的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!