假设我们有一个寄存器 - 一些固定大小的0bXXXXXXXX
二进制字。
接下来假设我们仅使用此注册表0bUUXXUUXX
的某些部分(U
表示“使用”,X
表示“不注意”。)
例如,我在ATMega328上使用两个寄存器DDRD
和DDRB
来控制seven-segment display。只要这些寄存器是8位寄存器并且显示器只有7个(我不使用点)引脚来控制这些寄存器的某些位是不可能的,我不想在控制显示时更改它们。所以我必须只操纵我需要的那些位并保持那些我不需要的那些位。到目前为止,我已达到以下解决方案。
这是C
代码(虽然没有那么多代码),但我认为这个想法与语言无关。
首先,我定义了一个部分掩码,强调将使用寄存器的哪些位。在我的情况下,寄存器是8位长度,我使用位[4:7]
。
#define USE_MSK 0b11110000 //bits out of use are set to 0's here
然后,当我需要将我使用的位(即位[4:7]
)设置为1001
时,我会
#define CHANGE_TO 0b10011111 //bits out of use are set to 1's here
然后
register |= USE_MSK;
register &= CHANGE_TO;
实际上我使用临时变量来更改一个赋值中的寄存器。
问题是这里可以改进什么?或者它应该是一种不同的方式。欢迎任何评论家和/或建议。