是否可以将char中的位映射到短的任意位?

时间:2012-09-13 13:45:56

标签: c mapping microcontroller

我想知道是否有任何方法可以将较小变量的位任意映射到较大变量中的位。我认为通过一个例子我的问题会更容易理解。

如果我有一个16位寄存器“PORTA”,然后我有一个8位变量OPT1,我希望能够写

PORTA = 0x0000
OPT1 = 0xAB

并最终得到包含0x0A0B的PORTA。

这些位将自动映射,只需写入变量OPT1

即可
OPT1_bit0 => PORTA_bit0
OPT1_bit1 => PORTA_bit1
OPT1_bit2 => PORTA_bit2
OPT1_bit3 => PORTA_bit3

OPT1_bit4 => PORTA_bit8
OPT1_bit5 => PORTA_bit9
OPT1_bit6 => PORTA_bit10
OPT1_bit7 => PORTA_bit11

1 个答案:

答案 0 :(得分:2)

我认为你不能直接映射作业,意思是:

OPT1 = 0xAB => PORTA = 0x0A0B

但是,您可以通过宏自动执行作业。例如:

static int PORTA = 0x0000;
#define OPT1(val) (PORTA = (val&0x0F)|((val&0xF0)<<4))

所以现在当你对OPT1进行“任务”时,每次都会为你自己正确地进入PORTA:

int main(int argc, char *argv[]) 
{
  OPT1(0xAB);
  printf("PORTA's value: %#x\n", PORTA);
  return 0;
}

mike@linux-4puc:~> ./a.out 
PORTA's value: 0xa0b