首頁 > 易卦

自學微控制器第十八篇:輸入訊號檢測程式

作者:由 小亮談電氣 發表于 易卦日期:2023-01-30

檢測按鍵是否按下用什麼語句

我們知道了輸入訊號的檢測的前提條件,那就是需要在讀取訊號前,將輸入訊號的IO埠進行置1,然後就可以讀取該埠上的狀態,由於我們的微控制器是帶上拉電阻的,所以當我們把埠置1後,埠上如果什麼也不接,就是處於懸空狀態,那麼我們讀到的就是1,也就是說,微控制器的常態是1,要想檢測到外界的訊號變化,就需要對埠置0,我們的外電路的輸入訊號應該是接地的才會有效。

我們先新建一個工程。

自學微控制器第十八篇:輸入訊號檢測程式

記得在新增新檔案時,注意設定中的output選項卡里,把生成hex檔案前方勾選,不然我們無法生成可執行檔案。

接著就是程式的書寫。

自學微控制器第十八篇:輸入訊號檢測程式

程式中,我定義了一個輸入變數,一個輸出變數,用於標誌出輸入和輸出的埠及其含義,當然如果不定義也是可以的,但後期如果養成習慣,那麼我們很容易混淆當前埠的實際用途,同時我們可以看出P1^0、P1^1之類的相似度很高,在書寫時也容易寫錯,寫錯了程式也不會報錯,它並不知道你到底需要用哪個埠,程式碼量小還好說,一句一句地查一遍,就可以找到問題,如果上百行,那估計一個程式碼一個程式碼的找,還不如再寫一次來得快。所以為了防止這些狗血的劇情發生,我們對埠操作時根據習慣,對埠進行定義,設定一個自己一眼就能看到的名字。

在定義時,我還定義了一個bit型變數a,bit型變數就是位變數,它只有一位,兩個狀態,分別是0和1,在某些位置,這就足夠了,可以節省空間。由於我們操作的也是一個位,所以就很方便。

主函式名不要忘記書寫,讀取前,對埠進行置1,然後我們使用了迴圈函式,這是因為,防止程式執行完之後出現錯誤,於是我們就讓程式在迴圈體中迴圈,做到可控。

主要使用者程式就是,把P1^0的狀態賦值給中間變數a,然後a再把值賦給P1^1,這樣我們就可以透過控制P1^0的狀態,來控制P1^1。

在程式寫完之後,先大致瀏覽一下,在必要的位置新增相應的註釋,註釋的新增很有必要,不養成習慣,到以後,程式碼量增加後,自己寫完回來檢查,自己都不會知道自己曾經寫的這些是什麼了。哈哈哈

這個程式寫完後,我們執行編譯一下,沒有錯誤,沒有警告,然後開始用模擬軟體來先測試一下程式的功能是否正常。這個按鍵的輸入檢測,在模擬中使用時完全沒有問題的。如果你的執行不正常,首先檢查程式是否有問題,然後再檢查模擬是否有問題。

自學微控制器第十八篇:輸入訊號檢測程式

新增hex檔案,然後更改頻率為11。0592M,當然此處晶振不影響我們本次的操作。

自學微控制器第十八篇:輸入訊號檢測程式

預設情況下所有io口輸出的都是高電位,P0口灰色的比較特殊,先不用瞭解。開關和LED均採用接地連線,注意實際使用時LED需要新增限流電阻,開關由於埠內部存在上拉,所以不用電阻,保證訊號的穩定即可。

自學微控制器第十八篇:輸入訊號檢測程式

我們的程式目標是當按下開關,系統檢測到開關訊號為0,那麼LED就為0,表現出就是LED熄滅。然後我們改變下賦值的關係,讓開關按下時,LED點亮。

自學微控制器第十八篇:輸入訊號檢測程式

只需將a的值在傳遞給LED時做一個取反處理即可。這樣當按鍵為0,那麼LED就是1,當按鍵為1,那麼LED就是0,做到了按下燈亮的功能。然後,編譯一下,每次修改都需要編譯,不然hex檔案還是修改之前的程式碼。

模擬中狀態已經變化,沒有按下時,LED處於熄滅狀態。

自學微控制器第十八篇:輸入訊號檢測程式

按下後LED點亮,這就屬於一種隨動的狀態指示,可以用與表達按鍵是否按下,在一些控制要求比較嚴格的場合,會對此類案件做出反饋指示燈,為什麼硬體連線就可以完成的,還需要佔用一個埠去反饋按鍵狀態?這是因為,硬體連線也可以做到按下燈亮或燈滅,但是無法檢測到這個訊號是否真正的傳入了晶片,被晶片所接收,如果使用反饋指示燈,那麼只要燈有變化,就可以判斷,開關訊號必然進入了系統。可以透過此來了解程式碼是否正常執行。

有沒有一種方法,可以按下開關後,LED點亮,鬆開不熄滅,再次按下,LED熄滅。當然是有的。

這就需要增加些語句,來阻斷賦值語句的實時傳遞。

自學微控制器第十八篇:輸入訊號檢測程式

如果我們不這麼做,就會出現io變化,變數就隨之變化,也就無法進行判斷語句內的操作了。

簡單介紹下我們的程式碼執行步驟,首先,我們將P10的值傳遞給變數a,然後判斷a是否等於0,也就是按鍵是否按下,如果不等於0,就會從新賦值,然後接著判斷是否按下。若是按鍵按下,那麼就把a的值傳遞給變數b,再判斷b是否等於0,這個0就是按鍵按下的狀態,此時的b就與當前按鍵的實時狀態無關了,就是說你鬆開按鍵也不影響b的值,就達到了對按鍵狀態的儲存。然後接著判斷i的值,這是用於計算按鍵按下次數的,如果按下了兩次,那i就等於1,LED就會熄滅,同時對I進行清零,對b進行置1,用於下一次按鍵的按下,如果不置1,就會出現,一直進入這個判斷語句,造成無法完成按鍵的響應。

最後我們模擬一下。

好了,就到這裡吧,有什麼疑問歡迎留言討論。