我需要从0数到10,并将这些值以二进制格式存储在ADCON0(5:2)中。如何指向该寄存器的位5?第5位被命名为ADCON0bits.CHS3。如果我将一个4位变量存储到ADCON0bits.CHS3,是否会将位1-3写入寄存器的位4-2?
另外,有没有我可以使用的4位数据类型?
这些都是在PIC微控制器上实现的。
编辑:我需要在寄存器中存储4位,如下所示:
unsigned char count = 10 //max value
[X][X][1][0][1][0][X][X]
这与下面的假设是一致的,但我想我会把我的问题弄清楚一点。
发布于 2010-01-18 11:10:26
写入位变量会将该变量的真值存储到位中。例如,这样写:
ADCON0bits.CHS3 = 3;
将该位设置为1。
如果bit5引用掩码为0x20 (00100000)的位,并且您需要将4位数存储在掩码为0x3c (00111100)的位中,则可以使用位移位和位操作:
// First clear bits 1-5:
ADCON0 &= ~0x3c;
// Now set the bits to correct value:
ADCON0 |= (count << 2); // <-- remember to shift 2 bits to the left
更新:正如Ian在评论中提到的那样。这会在更新之前将ADCON0设置为中间值。在这种情况下,这是正常的,因为它只选择A/D通道,而不实际执行转换。但总的来说,这样做更好:
unsigned char temp_adcon;
temp_adcon = ADCON0 & ~0x3c;
ADCON0 = temp_adcon | (count << 2);
发布于 2010-01-18 11:21:23
请参阅this SO question的答案。
请注意,您正在执行读取-修改-写入操作。在执行此操作时,您必须小心竞争条件。竞争条件可能由以下原因引起:
发布于 2010-01-18 11:04:38
我不确定确切的寄存器ADCON0,但通常您可以读取寄存器,屏蔽4位并插入您的计数,然后使用该值写回寄存器。
以防万一,掩蔽是通过AND操作执行的,而inserting是一个OR操作,在您的情况下,计数移位超过2位。
https://stackoverflow.com/questions/2083661
复制相似问题