1

以下代码使用 winAVR。

我在这里得到了一个 8 位 PIN,我需要将它与 00000010 或 0x02 进行 OR 以设置第 7 位。

现在我要做的是:

  • 设置端口 B 位 7
  • 等待 1ms
  • 清除端口 B 位 7
  • 等待 19 毫秒

但是,我不应该更改这些步骤中的其他位。

所以我必须要 :

  • 读取端口 B
  • 需要设置位
  • 将修改后的值写回端口
  • 清除位
  • 写回端口 B

所以我的测试代码是:

B=PINB|0x02
Loop delay for 1ms
BP=PINB&0x00
Loop for 19ms

但我认为在这个过程中其他位将被改变,我的问题是,我应该如何在不改变其他位的情况下操作 8 位端口的一位?

非常感谢 !!

4

3 回答 3

4

您需要BP=PINB & ~0x02 ~ 运算符是逻辑非。and 运算符只保留 2 以外的

于 2010-11-01T00:18:44.537 回答
1

您使用设置掩码的按位否定,并且:

B = PINB & ~0x02

对于选定的位,按位取反将该位设置为零;其他都是一。那些在 ANDed 时不会改变 PINB 中的值。

于 2010-11-01T00:19:48.717 回答
0

这个页面很好地总结了按位运算符的几个技巧。http://www.catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know

于 2010-11-01T00:44:13.203 回答