在不更改其他位的情况下,在8位PIN中设置一位

时间:2010-11-01 00:13:42

标签: c assembly bit-manipulation winavr motordriver

使用winAVR获取以下代码。

我在这里得到一个8位PIN,我需要用00000010或0x02来设置第7位。

现在我要做的是以下内容:

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

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

所以我必须:

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

所以我的测试代码是:

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

但我认为在这个过程中其他位会被改变,我的问题是,我如何操作8位端口的一位而不改变其他位?

非常感谢!!

3 个答案:

答案 0 :(得分:4)

你需要BP=PINB & ~0x02〜运算符是逻辑NOT。和运算符只保留其他位而不是2。

答案 1 :(得分:1)

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

B = PINB & ~0x02

对于所选位,按位否定将该位设置为零;所有其他人都是一个。 当ANDed时,那些不会改变PINB中的值。

答案 2 :(得分:0)

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