我目前正在创建代码,每当我按下按钮时,开始序列照明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端口设置为高,但仍然没有发生任何事情。
1条答案
按热度按时间zf9nrax11#
PIC16F877 A的模拟控制寄存器是不是CMCON寄存器,而是ADCON1寄存器。根据PIC16F877 A的datasheet,第4.1节:
上电复位时,这些引脚被配置为模拟输入并读取为“0”。
比较器处于关闭(数字)状态
因此,不需要配置CMCON,因为它默认配置为关闭。
您需要配置的是ADCON1寄存器,因为PORTA具有模拟输入(ANx引脚)。这些引脚默认配置为模拟,因此始终读取为0。这就是为什么当您按下RA0引脚上的输入按钮时,没有任何React。
这是因为端口与多种内部硬件(如ADC,比较器和数字缓冲器)进行多路复用。您需要选择正确的硬件连接到输入引脚,因此您需要的是数字缓冲器。
话虽如此,使用RA0引脚作为数字输入,所有模拟引脚作为数字IO的正确设置如下所示:
字符串