單片機按鍵消抖
在一些特殊場景十八屆智能車比賽中,不允許反復燒錄程序以更改代碼中的參數,故人機交互界面變得十分重要,在這里,我們通過按鍵輸入以更改參數,避免了反復編譯,燒錄程序這一繁瑣的過程。尤其是編譯賊慢,插線賊麻煩的單片機
按鍵消抖指的是xxxxx(自行百度)
常用的方法是判斷按鍵按下的時候進行一定的延時,代碼如下:
這種方法簡單易懂,但是在人機交互界面的時候會有些許延遲,特別是有些隊伍在智能車比賽過程中需要通過按鍵來修改閾值。一直點擊按鈕實現增減閾值,40ms的延時顯得既不優(yōu)雅又不順暢。由于代碼中有循環(huán)的部分,如果按鍵一直按下,其他程序就會收到影響,如果想做動態(tài)的界面,這種情況就會使得界面不那么絲滑。
數電中提到一種方法,運用基本SR鎖存器消除機械開關觸點抖動引起的脈沖輸出,如下圖


事實上,軟件上也可以使用這種“鎖存”的思想
這里假設高電平輸出有效,status是當前按鍵狀態(tài),last_status是上一次的按鍵狀態(tài)
當status=1同時last_status=0時,輸出有效值
具體代碼如下:
分析過程如下:

如圖所示,當按鍵沒按下時,last_status 和?status都是高電平,在①處按鍵按下時,由于按鍵抖動,status在高低電平狀態(tài)反復橫跳,last_status跟著跳變,此時無法滿足判斷條件status && !last_status,此時就算一直按住按鍵,也不會輸出有效值,并且代碼中沒有使用while循環(huán),不會影響原來的程序運行。在②處按鍵松開的時候滿足了條件status && !last_status,這個時候由于按鍵的抖動,可能會多次判斷到松開,所以需要延時10ms。相對于上面那種方法,延時只需要進行一次。只要按鍵不放開,輸出值就一直“鎖存”在次態(tài),即無效輸出的狀態(tài),只有改變了按鍵狀態(tài)(即松開按鍵),才改變輸出值。
代碼來自于網絡,這里筆者只是剛剛好學習到了數電相關知識,突然加深了對代碼的理解,如有侵權,聯系本人刪除。