MOVF 操作后工作寄存器中的值错误

Wrong value in the working register after a MOVF operation

MOVF操作后W寄存器获取错误值如何解决?

我正在调试一个成功构建和编程的代码,但作为电路的一部分通电时没有得到预期的结果,我注意到在 MOVF 操作后工作寄存器不包含正确的值,在调试时。

如果复制到 W-reg 的值是在调试期间手动写入的,那么代码会正常运行。

我相信下面的图片很好地说明了我的问题。

1.端口定义.

2。 LEDportA 值 0x02 将被移动到 W-reg.

3。运行后,W-reg 包含 0x00,而不是 0x02。

4.最终图像显示 LEDportA 与 LATA 相同,因为它在“clrf LEDportA 指令后被清除。

我完全不知道是什么原因造成的,非常感谢任何人可以提供的任何见解或建议。

请注意,使用的PIC单片机是PIC16F1829。

由于您没有提供足够的信息,例如您正在使用的 PIC 型号和其余代码,据我所知,您的问题是因为银行选择错误。您的 TempC 寄存器位于 bank 0 中的 0x70,而 LATA 寄存器位于内存中的 0x10C bank 2。因此,当您尝试读取 LATA 时,实际上您读取的是 bank0 中相应的 0C 地址位置。在尝试从 RAM 中的任何寄存器读取或写入之前,您必须切换正确的存储区。检查具有访问寄存器的正确方法的代码片段。您可以使用 BANKSEL 指令切换到一个库,这对程序员来说更方便,或者将一个库值加载到 BSR(Bank Select 寄存器)。

UpdateDisplay:
        BANKSEL     LEDportA    ; Switch to LEDportA bank before any access
        MOVF        LEDportA, w
        andlw       0x0f
        BANKSEL     TempC       ; Switch to TempC bank before any access
        movwf       TempC
        bsf         TempC, 4
        rrf         TempC, F
        btfss       STATUS, C
        bcf         TempC, 3
        btfsc       TempC, 0
        ....