2012-04-11 34 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; 
}