等待按鍵釋放,你的程式碼如何寫?

  • 2020 年 3 月 17 日
  • 筆記

今天,還是一個問題,在QQ群(300384358)里有小夥伴一直在問一個問題,如上圖。一個按鍵控制電機的轉動,按鍵按下後,電機轉動,按鍵釋放,電機停止,再加一個按鍵按下時長的檢測,當按下超過5秒後,電機也得停止。也就說每次按下按鍵後電機轉動的時間不得超過5秒,就算按鍵按下時時長超過5秒。

問題其實很簡單,才開始的小夥伴就是沒想法,其他小夥伴出謀劃策後還是沒解決問題,今天我們就來慢慢叨叨。

這個問題的難點一是在按鍵按下5秒的識別,小夥伴說了不要求精確的5秒,大概是5秒就可以了。難點二是按鍵釋放的檢測,好多小夥伴想不到辦法,還是用檢測按鍵按下的if語句,效果不佳,小代在這呢推薦大家用while循環的方式去實現,具體怎麼實現呢?

往下看

直接上程式碼

按鍵識別還是採用大家最能接受的二次檢測加延時的方式,便於好理解。小代說的while循環檢測按鍵釋放,其實 就是第23行,循環結束標誌是按鍵的狀態(0或1)再做「非」運算。解釋一下,從上面我們的二次檢測加延時的方式能看出,按鍵按下去後,狀態值是0,那我們再做一個「非」運算後就變成了1,相反,按鍵沒按下的時候,「非」運算後是0,當while語句的條件變為0了,自然循環就結束了,這裡說的按鍵沒按下,其實也可以說是按鍵從按下到釋放的這個過程。

我們來捋一捋這段程式碼的運行,首先到了while(!KEY){}這個循環,就說明按鍵已經按下了,此時有兩種情況,一種是最簡單的,按下時間沒到5秒鐘,那按鍵釋放後直接停止電機轉動就好,第二種情況是按鍵按下時長大於等於5秒鐘,這時需要在按下時長到5秒的時候,關閉電機。上面我們分析過了,按鍵按下以後,while(!KEY){}循環繼續執行,只要按鍵釋放,自動跳出此循環,這樣一來,我就只需要在這個while循環里去檢測時間有沒有到達5秒鐘,時間精確度又不要求太高,那我們完全可以採用簡單的記錄次數來實現時間的計算,在以上程式碼中,我假設while循環2000次的時間是5秒鐘,while循環一次,對計次變數加1,完了再去檢測有沒有大於等於2000了,當大於等於2000了,就說明按下時間大於等於5秒鐘了,此時我們需要關閉電機。當出現第一種情況,就是按下時長小於5秒鐘時間,這時直接退出while循環,在循環後面緊跟著關閉電機,再把按下計次變數清零,準備下一次的按鍵記錄。

這樣一來就實現對時間的記錄,分情況控制。分析問題時我們做了2種情況的分析,寫程式碼時,其實我們只是對按鍵釋放做了識別,又在按鍵釋放之前,做了計次的處理。這樣的按鍵釋放檢測方式可以用在其他的地方比如我們的按鍵調整時鐘時間,計算器等等。

這樣的檢測方式也是有弊端的,第一,我們在做按鍵釋放時候,只做了按鍵的檢測,如果有其他實時性要求高的程式碼段,需要放到這裡的while循環中去,比如數碼管顯示的動態掃描。第二,循環計次的變數,這裡我定義成了uint型,最大範圍是65535,當記錄次數大於這個值的時候,程式碼就有問題了,當我們長時間的按著按鍵不釋放,比如按著1分鐘。要解決這個問題,需要我們此時好一個最長按鍵時間,比如10秒,只要大於我們要求的時間就好,當到記錄次數大於這個值後將不再加1運算。

好了,今天的問題就叨叨到這裡,希望我們都有所收穫。

·END·