我不知道在哪里提出这个问题,所以如果有人动了这个我明白了。
我们走了。
他们是否可以解压缩单个寄存器的内容?
示例:
比如说你有一个16位的寄存器A,我需要想办法说出
第0 - 5位需要进入注册B.
第6-10位需要进入注册C.
如果它们是一种更简单的方法,可以使用刚刚映射到内存位置的Bit数组,只是指向所需的位,或者是汇编代码中的某些算法可以使用。
如果它对任何人都有帮助,我正在使用Atmel微控制器。
我要求的原因是我想开始开发共享单个数据总线的东西来简化设计。如果我弄清楚如何对数据寄存器进行分区,这可以允许设备发送带有所需数据的消息。
示例:
假设我连接并指定设备在最后8位发送其ID以及微控制器根据该数据做出决定所需的前8位的相关数据。
答案 0 :(得分:2)
这会是你想要的吗?
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"
}
您也可以使用MASK位:
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 1110
结尾,因为1111 1110 & 0000 1111
会给出结果。两个值中“1”的所有位对于Var2将变为“1”,但所有其他位将为0.这是一个按位AND运算,其中结果的每个位仅取决于输入的相应位。 / p>
我不是老师,但这应该足以让你开始。我知道你在Windows中并不需要这么多,但是编程微芯片意味着直接在位上玩很多东西。
再次关于寄存器...只需将它们视为正常变量,但微控制器始终对它们进行读写操作,因此在那里写入值会产生影响,例如闪烁LED或在USART上发送字节/ COM端口。阅读数据表甚至会向您显示某些寄存器是只读的还是只写的,并且通常会详细说明寄存器的作用。如果你像pic或AVR那样编程MCU,你需要了解数据表,它们是你最有价值的工具。