2010-11-01 49 views
1

将winAVR用于以下代码。在8位密码中设置一位而不更改其他位

我得到了一个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位端口的一个位而不改变其他位?

非常感谢!

回答

4

您需要BP=PINB & ~0x02〜运算符是逻辑NOT。在和运营商只保留位其他大于2

+0

感谢您的回答! :) – NLed 2010-11-01 00:31:39

1

您使用的设置屏蔽的按位取反,并和:

B = PINB & ~0x02 

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

+0

谢谢你的回答,你们都解释得很好,但本先回应。 – NLed 2010-11-01 00:31:12