Micropython加速物聯網開發3 - 按鍵中斷和回調

TPYBoard開發板上的USR爲用戶按鍵,可以自定義按鍵觸發的事件。想要使用USR按鍵,首先需要定義對象。

>>> import pyb
>>> usr_key = pyb.Switch()

通過usr_key對象可以獲得USR按鍵的狀態:

>>> usr_key()
False
>>>

當USR鍵被按下,狀態爲True,否則爲False。它將產生一箇中斷,此時MCU將跳轉執行中斷函數,Micropython爲其提供了回調函數用於定義將被中斷觸發的事件。

>>> usr_key.callback(lambda:print('USR KEY is pressed!'))
>>>

以上代碼通過回調函數定義了USR按鍵中斷觸發的事件,即:打印USR KEY is pressed!信息。

此時嘗試按下USR鍵,不出意外Micropython交互式解釋器中將顯示如下信息:

>>> usr_key.callback(lambda:print('USR KEY is pressed!'))
>>> USR KEY is pressed!
USR KEY is pressed!
除了在交互式解釋器中體驗按鍵中斷外,我們通過如下代碼修改main.py測試一下。

import pyb  
usr_key = pyb.Switch()
def usr_callback_func():
 pyb.LED(4).toggle()
 pyb.delay(2000)

usr_key.callback(usr_callback_func)

def led3_disco_func():
 leds = [pyb.LED(i) for i in range(1,4)] 
 n = 0
 while True:
  n = (n + 1) % 3
  leds[n].toggle()
  pyb.delay(50)
  
led3_disco_func()

以上代碼定義了USR按鍵回調函數功能爲第四個LED燈狀態翻轉並且延時2秒,同時定義了前三個LED燈跑馬燈的函數。執行程序並嘗試多次按下USR鍵,每次按下間隔超過2秒,會發現三個LED停止跑馬燈,第四個LED狀態翻轉且2秒後三個LED跑馬燈繼續。這是因此每當USR鍵按下MCU將產生中斷,它會停止並記錄當前程序執行的地點跳轉到中斷(回調)函數中,當中斷函數執行完成時MCU再回到進入中斷之前的程序地點繼續執行。

同時我們發現,以上代碼沒有使用lambda表達式,而是定義了一個函數作爲回調函數的參數,這樣做的好處是中斷觸發事件可以更加豐富,代碼邏輯更加清晰。另外需要注意的是回調函數中不能有任何分配內存的定義。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章