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

vdgimpew  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(128)

我目前正在创建代码,每当我按下按钮时,开始序列照明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中使用了animate选项,沿着一个刺激,我将RA0端口设置为高,但仍然没有发生任何事情。

zf9nrax1

zf9nrax11#

PIC16F877 A的模拟控制寄存器是不是CMCON寄存器,而是ADCON1寄存器。根据PIC16F877 A的datasheet,第4.1节:
上电复位时,这些引脚被配置为模拟输入并读取为“0”。
比较器处于关闭(数字)状态
因此,不需要配置CMCON,因为它默认配置为关闭。
您需要配置的是ADCON1寄存器,因为PORTA具有模拟输入(ANx引脚)。这些引脚默认配置为模拟,因此始终读取为0。这就是为什么当您按下RA0引脚上的输入按钮时,没有任何React。
这是因为端口与多种内部硬件(如ADC,比较器和数字缓冲器)进行多路复用。您需要选择正确的硬件连接到输入引脚,因此您需要的是数字缓冲器。
话虽如此,使用RA0引脚作为数字输入,所有模拟引脚作为数字IO的正确设置如下所示:

include <p16f877a.inc>
list p=16f877a

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

    ORG 0 ; <-- Reset vector
; Setup code starts from the reset vector (program memory adress 0)
BCF     STATUS,RP0
BCF     STATUS,RP1  ; Bank0
CLRF    PORTA       ; Clear garbage on IO buffers
CLRF    PORTB       ; It is a good practice to reset all used output ports 
CLRF    PORTD       ; since their values on reset is unknown.
BSF     STATUS,RP0  ; Bank1
MOVLW   D'6'        ; Configure all ANx pins as digital IO
MOVWF   ADCON1
MOVLW   B'11111111' ; Set all pins of PORTA as input
MOVWF   TRISA
CLRF    TRISB       ; Set all PORTB pins as output
CLRF    TRISD       ; Set all PORTD pins as output

INICIO
BTFSS   PORTA,0
GOTO    INICIO
CALL    RUTINA_1    ; You better debounce the button press before proceeding
GOTO    INICIO

字符串

相关问题