C 在8位引脚中设置一位,而不更改其他位
将winAVR用于以下代码 我这里有一个8位PIN,我需要使用00000010或0x02设置第7位 现在我要做的是:C 在8位引脚中设置一位,而不更改其他位,c,assembly,bit-manipulation,winavr,motordriver,C,Assembly,Bit Manipulation,Winavr,Motordriver,将winAVR用于以下代码 我这里有一个8位PIN,我需要使用00000010或0x02设置第7位 现在我要做的是: 设置端口B的第7位 等待1ms 清除端口B第7位 等19毫秒 但是,我不应该在这些步骤中更改其他部分 因此,我必须: 读取端口B 需要设置位 将修改后的值写回端口 清除位 回写到端口B 所以我的测试代码是: B=PINB|0x02 Loop delay for 1ms BP=PINB&0x00 Loop for 19ms 但是我认为在这个过程中其他的位会被改变,
- 设置端口B的第7位
- 等待1ms
- 清除端口B第7位
- 等19毫秒
- 读取端口B
- 需要设置位
- 将修改后的值写回端口
- 清除位
- 回写到端口B
B=PINB|0x02
Loop delay for 1ms
BP=PINB&0x00
Loop for 19ms
但是我认为在这个过程中其他的位会被改变,我的问题是,我应该如何在不改变其他位的情况下操作8位端口的一位呢
非常感谢 您需要~code>BP=PINB&~0x02运算符不符合逻辑。and运算符只保留除2以外的位。您需要的
BP=PINB&~0x02
运算符是非逻辑的。and运算符只保留除2以外的位。使用设置掩码的逐位求反,并且:
B = PINB & ~0x02
对于所选位,按位求反将该位设置为零;其他的都是一个。
这些值在and时不会改变PINB中的值。使用设置掩码的位求反,并且:
B = PINB & ~0x02
对于所选位,按位求反将该位设置为零;其他的都是一个。
这些运算符在AND时不会改变PINB中的值。本页很好地总结了使用位运算符的几种技巧 本页很好地总结了使用位运算符的几种技巧 谢谢你们的回答,你们两人都解释得很好,但本先回答了。谢谢你们的回答,你们两人都解释得很好,但本先回答了。