首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在8位寄存器中间存储4位值

在8位寄存器中间存储4位值
EN

Stack Overflow用户
提问于 2010-01-18 11:00:38
回答 3查看 2.3K关注 0票数 1

我需要从0数到10,并将这些值以二进制格式存储在ADCON0(5:2)中。如何指向该寄存器的位5?第5位被命名为ADCON0bits.CHS3。如果我将一个4位变量存储到ADCON0bits.CHS3,是否会将位1-3写入寄存器的位4-2?

另外,有没有我可以使用的4位数据类型?

这些都是在PIC微控制器上实现的。

编辑:我需要在寄存器中存储4位,如下所示:

代码语言:javascript
运行
复制
unsigned char count = 10 //max value
[X][X][1][0][1][0][X][X]

这与下面的假设是一致的,但我想我会把我的问题弄清楚一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-18 11:10:26

写入位变量会将该变量的真值存储到位中。例如,这样写:

代码语言:javascript
运行
复制
ADCON0bits.CHS3 = 3;

将该位设置为1。

如果bit5引用掩码为0x20 (00100000)的位,并且您需要将4位数存储在掩码为0x3c (00111100)的位中,则可以使用位移位和位操作:

代码语言:javascript
运行
复制
// 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通道,而不实际执行转换。但总的来说,这样做更好:

代码语言:javascript
运行
复制
unsigned char temp_adcon;

temp_adcon = ADCON0 & ~0x3c;
ADCON0 = temp_adcon | (count << 2);
票数 3
EN

Stack Overflow用户

发布于 2010-01-18 11:21:23

请参阅this SO question的答案。

请注意,您正在执行读取-修改-写入操作。在执行此操作时,您必须小心竞争条件。竞争条件可能由以下原因引起:

  • 硬件本身改变寄存器中的位(例如,A/D转换器操作完成并设置标志)。硬件的设计应该为您提供一种避免此问题的方法-有几种可能的解决方案-阅读微/外设的手册以找出答案。
  • 您自己的中断例程也写入寄存器。如果是这样,当您的主(非中断)代码写入寄存器时,应该在“中断禁用”上下文中完成。
票数 2
EN

Stack Overflow用户

发布于 2010-01-18 11:04:38

我不确定确切的寄存器ADCON0,但通常您可以读取寄存器,屏蔽4位并插入您的计数,然后使用该值写回寄存器。

以防万一,掩蔽是通过AND操作执行的,而inserting是一个OR操作,在您的情况下,计数移位超过2位。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2083661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档