-5

有没有办法解压单个寄存器的内容?

例如,假设您有一个 16 位寄存器 A。我需要想办法说:

  • 位 0 - 5 需要进入寄存器 B。
  • 位 6 - 10 需要进入寄存器 C。

如果有一种更简单的方法可以使用仅映射到内存位置并仅指向所需位的位数组,或者在汇编代码中是否有一些算法可以工作?

我正在使用 Atmel 微控制器。

我想开始开发共享单一数据总线的东西以简化设计。如果我弄清楚如何对数据寄存器进行分区,这可以允许设备发送带有所需数据的消息。

例如,假设我连接并指定设备在最后 8 位发送其 ID,并在前 8 位发送相关数据,微控制器根据该数据做出决定。

4

1 回答 1

3

这可能是您正在寻找的:

Register_B = Register_A & 0x003F; // Take the 6 LSB  (bits 0-5)
Register_C = Register_A & 0x07C0; // Take the bits 6-10
Register_C = (Register_A & 0x07C0) >> 6; // Or maybe you want to place these bits elsewhere using bit shift?

这是关于在 C 中使用位的更多说明。主要用于微控制器,但在 Windows 中也可以使用完全相同的内容,除非您不直接在 Windows 中使用寄存器。

十进制 5 = 二进制 0000 0101 = 十六进制 0x05 十进制 16 = 十六进制 0x10

现在,这是一个二进制示例:

x = (5 << 1);
5       = 0000 0101
5 << 1  = 0000 1010  (Same sa 5, but bits are shifted left by 1)
5 << 2  = 0001 0100  (5 shifted by 2 bits to the left.)

最后,您还可以比较“MASK”位的位:此代码显示如何比较位。

x = 5;
if( x & 0x01)
{  .. code here is executed because at least 1 bit from "0x01" is present in "decimal 5"
}
  • (variable & var2) 表示两个变量中至少有一位为“1”
  • (Var1 | Var2) 表示两个变量中的任何一个都为真。
  • (Var1 ^ Var2) 表示在一个变量中至少一位为“1”,在另一变量中为“0”。基本上,如果 Var1 与 Var2 不同,这将是正确的。

您还可以屏蔽位:

Var1 = 254;  // All 8 bits are "1" except the least significant bit which is 0.
Var2 = Var1 & 0x0F;  // 0x0F = only last 4 bits "1".

在这种情况下, Var2 会以0000 1110because结束1111 1110 & 0000 1111。对于 Var2,两个值中为“1”的所有位都将变为“1”,但所有其他位将为 0。这是按位运算,其中结果的每一位仅取决于输入的相应位。

我知道你在 Windows 中并不需要这个,但是编程微芯片意味着直接玩很多位。

再次关于寄存器......只需将它们视为普通变量,但微控制器一直在读取和写入它们,因此在那里写入值可能会产生影响,例如闪烁 LED 或在 USART/ COM 端口上发送字节. 阅读数据表甚至会告诉你一些寄存器是只读的还是只写的,通常会详细解释寄存器的作用。如果您对PICAVR等 MCU 进行编程,则需要了解数据表。它们是您最有价值的工具。

于 2018-05-25T01:37:56.037 回答