一個操作51單片機某幾個IO口的方法

一個操作51單片機某幾個IO口的方法

今天有同學學習《手把手教你學51單片機》過程中遇到一個關於51單片機IO口操作的問題,可能有其他同學有類似疑問,或者是其他同學根本沒有考慮過這個疑問問題,我簡單提一下,今後有類似問題也歡迎大家留言,我會給大家解釋。

問題很簡單,但是對於初學者常犯。

對於51單片機的P口來說,我們習慣上的賦值是P1 = 0xXX。但是這樣操作是一次性操作了8個IO口。而有些情況下,我們只需要操作其中的幾個而不是全部的時候,我們如何操作呢?如下圖註釋上邊的部分,是我寫的程序代碼。

一個操作51單片機某幾個IO口的方法

這個是操作51單片機P1口的低4位對步進電機進行操作的程序,在這個操作過程中,我們只使用到了P1口的低4位,因此我們希望高4位保持不變,只改變P1的低4位。首先把P1進行一個備份到變量tmp中去,然後把變量tmp的經過兩條語句,得到最終要賦值給P1的值以後,再一次性賦值給P0,這個方法大家都可以學習一下。

而註釋下邊的這段程序,是一位同學寫的,這位同學的理由是下邊這種寫法,也沒有改變P1的高4位。表面看也沒什麼問題,但是實際上如果不利用tmp這個變量,P1就會產生一個錯誤的中間值。

P1= P1&0xF0;這條語句執行完畢以後,P1 = 0xX0;其中X是未知的,保持了之前P1的高4位的原值,而低4位是0;

再然後P1= P1|BeatCode[index];這樣操作後,P1得到了最終的值。

但是這中間,P1 = 0xX0;這個值是我們根本不需要的一個錯誤值。不要怕有問題,但是我也不希望沒有經過思考的問題。而這個問題,就是同學經過思考的問題,我認為很好,寫出來提供給同學們共同學習。


分享到:


相關文章: