【发布时间】:2014-02-20 15:19:04
【问题描述】:
我正在对 PIC18F94K20 进行编程,以与 MCP7941X I2C RTCC 船和 24AA128 I2C CMOS 串行 EEPROM 器件一起工作。目前我的代码成功地初始化了 RTCC 的秒/天/等值并启动计时器,在每秒的营业额时切换 LED。
我正在尝试扩充代码以读回这些值的正确数据,但是当我尝试考虑值中的各种“额外”位时遇到了麻烦。内存映射可能有助于在一定程度上阐明我的问题:
以小时列或 02h 地址为例。位 6 设置为 1 以切换 12 小时时间,将 01000000 添加到小时位。我可以在这个地址读回字节的全部内容,但我想使用 if 语句来检测 12 小时还是 24 小时的时间是否到位,并进行相应的调整。我不担心 10 小时位,因为我可以使用 BCD 转换循环(我认为)很容易地计算出来。
我之前在 C 中使用按位或运算符将原始小时数数据增加到 24。我在这个特殊情况下将小时数初始化为 0x11,并将 12 小时控制位设置为 0x64。设置时间时:
WriteI2C(0x11|0x64);
如您所见,它使用按位或。
在回读小时数时,如何将运算符合并到我的代码中以将多余的位与实际的时间位分开?我试着做这样的事情:
current_seconds = ReadI2C();
current_seconds = ST & current_seconds;
但这完全毁了一切。它可以编译,但设备“卡”在这个序列上。
如何将 ST / AMPM / VBATEN 位与我需要的实际数据分开,以及在它们存在的各种情况下实现 for 循环的好方法是什么(例如,如果位读回 12 小时时间6 = 0 和 24 小时时间,如果 bit6 = 1,依此类推)。
我有点 C 新手,这是我第一次涉足电子领域,所以我非常感谢任何帮助。谢谢。
【问题讨论】:
-
我认为这个问题不适合这里。只需阅读 C 位运算符(|、&、
-
你有没有推荐更合适的地方?对不起,如果我放错地方了。
-
您要查看的位的屏蔽是使用 & 运算符完成的,并且您要分隔的位设置为 1。因此,如果您从我的读取秒数中查看,可能会简单地转换为 ( ( ( regdata & 0x7 ) * 10 ) + ( regdata & 0xf ); 我认为
-
这样的问题可能会在electronics.stackexchange.com 得到更好的接待。不幸的是,PC 程序员过多地使用了 SO。不过,您需要缩小实际问题的范围,不要一次问多个问题。
-
@MartinJames 不,永远不要使用位域进行位映射。事实上,不要将它们用于任何事情。 See this.
标签: c embedded pic microchip mplab