assembly 是否有一个代码可以延迟微控制器

qlzsbp2j  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(169)

我正在编程一个PIC16F84A微控制器来监控三扇门,如果其中一扇门打开,它应该触发警报并在七段显示器上写入D1D2 0R D3。或者,如果所有门都打开,则应写为ALL,如果没有门打开,则应写为NONE
我写了一个程序,但我正在努力设置一个延迟一秒之间的字母时,显示在7段显示器。
我尝试为NONE设置NO之间的延迟,但它只是卡在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
wtzytmuj

wtzytmuj1#

你的代码流真的很难读。您可以对代码进行结构化并使其更易读。无论如何.. O字符没有被写在N之后,因为CPU被卡在延迟部分。
由于您编写延迟的方式,延迟会循环很长时间。在递减每个值之后,始终会分支到同一点。由于您没有重新加载值,因此它会一次又一次地从255开始倒数,几乎是无限次或相当长的时间。

Delay MOVLW D'100'
      MOVWF D1
      MOVLW D'100'
      MOVWF D2
      MOVLW D'100'
      MOVWF D3

Del1 NOP
      DECFSZ D3,1 ; CPU gets stucked
      GOTO Del1
      DECFSZ D2,1
      GOTO Del1
      DECFSZ D1,1
      GOTO Del1   ; between these lines

假设您已经正确计算了延迟值,则正确的程序流程应该如下所示:

Delay:
  BANKSEL D1
  MOVLW   D'100'
  MOVWF   D1
Reload2
  MOVLW   D'100'
  MOVWF   D2
Reload3
  MOVLW   D'100'
  MOVWF   D3

DelayLoop
  DECFSZ  D3,1 ;
  GOTO    DelayLoop
  DECFSZ  D2,1
  GOTO    Reload3
  DECFSZ  D1,1
  GOTO    Reload2

我还注意到您的内存分配看起来有些奇怪。我猜你的意思是为D1D2D3变量分配内存。但是你实际上把它们都分配到同一个内存位置,十进制的4。此位置对应于管理间接内存写入的FSR寄存器。

D1 EQU B'100'
D2 EQU B'100'
D3 EQU B'100'

您应该使用 General Purpose Registers GPR 为应用程序特定的变量分配内存。GPR存储器从十进制地址0x0C,12开始。所以你需要声明如下:

D1 EQU 0xC
D2 EQU 0xD
D3 EQU 0xE

相关问题