为什么我的汇编子程序没有被执行?

问题描述 投票:0回答:1

我目前正在创建代码,以便在按下按钮时开始顺序点亮 10 个 LED。然而,当我应用 BTFSS 并开始在 Proteus 上进行模拟时,即使我按下按钮,一切都保持不变。

这是程序代码:

include <p16f877a.inc>
list p=16f877a

A EQU 0x20
N EQU 0x21
M EQU 0x22

BSF STATUS,5
MOVLW B'11111111'
MOVWF TRISA
CLRF TRISB
CLRF TRISD
BCF STATUS,5
MOVLW D'7'
MOVWF CMCON
CLRF PORTA
CLRF PORTB
CLRF PORTD

INICIO
BTFSS PORTA,0
GOTO INICIO
CALL RUTINA_1
GOTO INICIO

RUTINA_1
CALL ANTI_REBOTE
;10
CLRF TRISB
MOVLW B'00000010'
MOVWF PORTD
MOVLW D'200'
MOVWF A
CALL RETARDO
;9
MOVLW B'00000001'
MOVWF PORTD
MOVLW D'200'
MOVWF A
CALL RETARDO
;8
CLRF PORTD
MOVLW B'10000000'
MOVWF PORTB
MOVLW D'200'
MOVWF A
CALL RETARDO
;7
MOVLW B'01000000'
MOVWF PORTB
MOVLW D'200'
MOVWF A
CALL RETARDO
;6
MOVLW B'00100000'
MOVWF PORTB
MOVLW D'200'
MOVWF A
CALL RETARDO
;5
MOVLW B'00010000'
MOVWF PORTB
MOVLW D'200'
MOVWF A
CALL RETARDO
;4
MOVLW B'00001000'
MOVWF PORTB
MOVLW D'200'
MOVWF A
CALL RETARDO
;3
MOVLW B'00000100'
MOVWF PORTB
MOVLW D'200'
MOVWF A
CALL RETARDO
;2
MOVLW B'00000010'
MOVWF PORTB
MOVLW D'200'
MOVWF A
CALL RETARDO
;1
MOVLW B'00000001'
MOVWF PORTB
MOVLW D'200'
MOVWF A
CALL RETARDO
GOTO RUTINA_1

ANTI_REBOTE
BTFSC PORTA,0
GOTO ANTI_REBOTE
RETURN

RETARDO
TRES
    MOVLW D'80'
    MOVWF M
DOS
    MOVLW D'25'
    MOVWF N
UNO
    NOP
    NOP
    DECFSZ N,1
    GOTO UNO
    DECFSZ M,1
    GOTO DOS
    DECFSZ A,1
    GOTO TRES
RETURN
END

我使用了 MPLAB 中的动画选项以及激励,将 RA0 端口设置为高电平,但仍然没有发生任何事情。

assembly sequence pic subroutine
1个回答
0
投票

看来您的代码逻辑是正确的,并且应该按预期工作。但是,既然您提到子例程没有按预期执行,那么让我们通过故障排除过程来识别潜在的问题:

  1. 硬件模拟:由于您使用 Proteus 进行模拟,请确保您的硬件设置(包括按钮连接和 LED)在模拟环境中正确配置。检查您的按钮按下是否被正确模拟,并且按钮状态是否反映在模拟中。

  2. 刺激:您提到使用带有刺激的 MPLAB 模拟器将 RA0 设置为高电平。确保正确应用刺激设置,并且确实正确模拟按钮按下。另外,检查按钮状态 (PORTA,0) 是否按预期发生变化。

  3. 去抖动

    ANTI_REBOTE
    子例程用于按钮去抖动。确保按钮按下正确去抖,并且子例程不会阻止您的代码继续进行。

  4. 子程序流程:验证程序流程是否到达

    RUTINA_1
    子程序。您可以添加调试语句,例如切换特定的 PORT 引脚,以检查子程序是否已进入。

  5. 仿真步骤:在 MPLAB 仿真器中,您可以逐条指令单步执行代码。这使您可以查看代码的哪一部分未按预期执行。使用调试工具来确定子例程中是否存在任何问题。

  6. 寄存器状态:在仿真过程中检查寄存器和变量的状态。这将帮助您识别变量的任何意外更改或问题。

  7. 中断:确保不存在可能干扰预期程序流程的中断或中断服务例程 (ISR)。

  8. 仿真环境:确保您针对所使用的特定微控制器 (PIC16F877A) 使用正确的配置和设置。

如果检查这些方面后仍然遇到问题,请提供有关您在模拟过程中观察到的情况、任何错误消息或其他相关信息的更具体详细信息。这将有助于进一步诊断问题。

© www.soinside.com 2019 - 2024. All rights reserved.