2012-04-11 42 views
1

我正在使用Arduino,並開始使用端口寄存器。我喜歡同時改變多個端口的速度和能力。但是,我不知道如何使用端口寄存器來監視單個引腳的改變。 (我認爲它可以與bitmath做,但我甚至不知道如何開始這一點。)你如何看待最不重要位的變化?

所以,當我檢查我的端口寄存器,我應該得到的東西是這樣的:

PINB = B000xxxxx 

在哪裏x是我的銷售價值。任何這些引腳可能已經改變。我想知道什麼時候最右邊的(最不重要的)位已經改變了。我如何使用bitmath來檢查最後一個從0切換到1

+3

'if(value&1){...} else {...}' – wildplasser 2012-04-11 20:47:08

+0

那很簡單吧? – 2012-04-11 20:48:46

+0

是的,直到你想要邊緣檢測。在這種情況下,你需要一個(或兩個)while循環。 – wildplasser 2012-04-11 20:50:11

回答

2

「Bitmath」的確是問題的答案。在你的情況下:x & 0x01將「掩蓋」除最低位以外的所有內容。結果可以根據您的意願與01進行比較。

常見的成語是:

x & 0x01 // get only the lowest bit 
x & ~0x01 // clear only the lowest bit 
x & 0xFE // same: clear only the lowest bit 
x | 0x01 // set the lowest bit (others keep their state) 
+0

整潔!感謝這些例子。 – 2012-04-15 02:40:53

+0

第一個「清晰」例子就是你想要堅持的例子。第二個例子(x&0xFE)是一個只有8位的例子 - 如果有更高的位會被清除。 – 2012-04-15 10:16:30

1

要了解位發生了變化,你需要以前的值,你屏蔽掉作爲其他人所說 -

int lastValue = PINB & 0x01; 

然後在你的代碼是

int currentValue = PINB & 0x01; 

獲得當前引腳值的LSB。

要確定是否有變化的比特,你想要「異或」(^)運算符 - 它是「真」,當且僅當兩位不同。

if (lastValue^currentValue) { 
    // Code to execute goes here 

    // Now save "last" as "current" so you can detect the next change 
    lastValue = currentValue; 
} 
相關問題