我正在编程一个PIC16F84A微控制器来监控三扇门,如果其中一扇门打开,它应该触发警报并在七段显示器上写入D1
,D2
0R D3
。或者,如果所有门都打开,则应写为ALL,如果没有门打开,则应写为NONE
。
我写了一个程序,但我正在努力设置一个延迟一秒之间的字母时,显示在7段显示器。
我尝试为NONE
设置N
和O
之间的延迟,但它只是卡在N上,没有显示其余的字母
下面是一个程序:
D1 EQU B'100'
D2 EQU B'100'
D3 EQU B'100'
LIST P=PIC16F84A
#INCLUDE<P16F84A.INC>
BSF STATUS,5
MOVLW 0X0F
MOVWF TRISA
CLRF TRISB
BCF STATUS,5
T1 BTFSS PORTA,0
GOTO T2
GOTO T4
T2 BTFSS PORTA,1
GOTO T3
GOTO T6
T3 BTFSS PORTA,2
GOTO S1
GOTO S2
T4 BTFSS PORTA,1
GOTO T7
GOTO T5
T5 BTFSS PORTA,2
GOTO S7
GOTO S8
T6 BTFSS PORTA,2
GOTO S3
GOTO S4
T7 BTFSS PORTA,2
GOTO S5
GOTO S6
S1 MOVLW 0X37
MOVWF PORTB
ORG 30H
Delay MOVLW D'100'
MOVWF D1
MOVLW D'100'
MOVWF D2
MOVLW D'100'
MOVWF D3
Del1 NOP
DECFSZ D3,1
GOTO Del1
DECFSZ D2,1
GOTO Del1
DECFSZ D1,1
GOTO Del1
MOVLW 0X3F
MOVWF PORTB
MOVLW 0X37
MOVWF PORTB
MOVLW 0X79
MOVWF PORTB
BTFSC PORTA,3
GOTO T1
BCF PORTA,4
GOTO SWITCH
S2 MOVLW 0X5E
MOVWF PORTB
MOVLW 0X4F
MOVWF PORTB
BTFSC PORTA,3
BSF PORTA,4
GOTO SWITCH
S3 MOVLW 0X5E
MOVWF PORTB
MOVLW 0X5B
MOVWF PORTB
BTFSC PORTA,3
BSF PORTA,4
GOTO SWITCH
S4 MOVLW 0X5E
MOVWF PORTB
MOVLW 0X5B
MOVWF PORTB
MOVLW 0X5E
MOVWF PORTB
MOVLW 0X4F
MOVWF PORTB
BTFSC PORTA,3
BSF PORTA,4
GOTO SWITCH
S5 MOVLW 0X5E
MOVWF PORTB
MOVLW 0X06
MOVWF PORTB
BTFSC PORTA,3
BSF PORTA,4
GOTO SWITCH
S6 MOVLW 0X5E
MOVWF PORTB
MOVLW 0X06
MOVWF PORTB
MOVLW 0X5E
MOVWF PORTB
MOVLW 0X4F
MOVWF PORTB
BTFSC PORTA,3
BSF PORTA,4
GOTO SWITCH
S7 MOVLW 0X5E
MOVWF PORTB
MOVLW 0X06
MOVWF PORTB
MOVLW 0X5E
MOVWF PORTB
MOVLW 0X5B
MOVWF PORTB
BTFSC PORTA,3
BSF PORTA,4
GOTO SWITCH
S8 MOVLW 0X77
MOVWF PORTB
MOVLW 0X38
MOVWF PORTB
MOVLW 0X38
MOVWF PORTB
BTFSC PORTA,3
BSF PORTA,4
GOTO SWITCH
SWITCH BTFSS PORTA,3
GOTO STOP
GOTO T1
STOP BCF PORTA,4
GOTO T1
END
1条答案
按热度按时间wtzytmuj1#
你的代码流真的很难读。您可以对代码进行结构化并使其更易读。无论如何..
O
字符没有被写在N
之后,因为CPU被卡在延迟部分。由于您编写延迟的方式,延迟会循环很长时间。在递减每个值之后,始终会分支到同一点。由于您没有重新加载值,因此它会一次又一次地从255开始倒数,几乎是无限次或相当长的时间。
假设您已经正确计算了延迟值,则正确的程序流程应该如下所示:
我还注意到您的内存分配看起来有些奇怪。我猜你的意思是为
D1
,D2
和D3
变量分配内存。但是你实际上把它们都分配到同一个内存位置,十进制的4。此位置对应于管理间接内存写入的FSR寄存器。您应该使用 General Purpose Registers GPR 为应用程序特定的变量分配内存。GPR存储器从十进制地址0x0C,12开始。所以你需要声明如下: