我想在名为TCCR0B的寄存器中设置或清除位号3,具体取决于名为'mode'的变量中位号2的值。如果第2位为高电平模式,则必须在不干扰其他位的情况下设置TCCR0B中的第3位。如果模式中的位2为低电平,我想清除TCCR0B中的第3位。基本上我想将一位复制到其他位。我认为这很简单,但现在我觉得我们需要有条件的声明才能做到这一点。我不确定我是否使这段代码变得复杂。有没有简单的方法来实现这一目标?我写了下面的代码来测试这个。
#define WGM02 3
#define WGM02_IN_MODE 2
int main (void)
{
unsigned int TCCR0B;
unsigned int mode;
while(1)
{
printf("enter the TCCRB\n");
fflush(stdin);
scanf("%X",&TCCR0B);
printf("TCCRB = %x\n",TCCR0B);
fflush(stdin);
printf("enter the mode\n");
scanf("%X",&mode);
mode=((mode>>WGM02_IN_MODE)&0x01);
if(mode)
{
TCCR0B = (TCCR0B & ~(1<<WGM02)) | (mode<<WGM02);
}
else
{
TCCR0B = (TCCR0B & ~(1<<WGM02)) & ~(mode<<WGM02);
}
printf("TCCRB = %x\n",TCCR0B);
}
}
编辑:我查看了How do you set, clear, and toggle a single bit?中的帖子。但它与设置单个位的清除等有关,而不是从一个位复制到另一个。
答案 0 :(得分:0)
假设:
#define TCCR0B_WGM02_MASK (1 << 3)
#define MODE_WGM02_MASK (1 << 2)
然后:
TCCR0B = (mode & MODE_WGM02_MASK)) == 0 ? // If mode WGM02 bit is zero...
TCCR0B & ~MODE_WGM02_MASK : // clear WGM02 in TCCR0B,
TCCR0B | MODE_WGM02_MASK ; // otherwise set WGM02 in TCCR0B.