自学了6天,写了个小程序,中断跳不出

2020-02-10 08:38发布

小弟自学了几天PIC,现在开始写小程序,6个数码管同时循环显示0到9,逢10循环再显示,要用按键扫描或中断,就是一按RB4按键,就显示5,然后跳回去,中午搞了几个小时,中断那里就是跳不出来,请高手指正,谢谢。。
下面是我写的程序:

;************************************************
TMR0          EQU         01H
PCL       EQU    02H ;定义程序计数器低字节寄存器地址
STATUS    EQU    03H ;定义状态寄存器地址
PORTA     EQU    05H ;定义RA口数据寄存器地址
PORTB          EQU         06H
PORTC     EQU    07H ;定义RC口数据寄存器地址

TRISA     EQU    85H ;定义RA口方向控制寄存器
TRISB          EQU         86H
TRISC     EQU    87H ;定义RC口方向控制寄存器
ADCON1    EQU    9FH  ;定义ADC模块控制寄存器1的地址
;-----------------------STATUS
C         EQU    0   ;定义进位标志位位地址
Z         EQU    2   ;定义0标志位位地址
W                  EQU         0
F                  EQU         1
RP0       EQU    5   ;定义页选位RP0位地址
;-----------------------
COUNTER   EQU    20H  ;定义计数器寄存器
COUNT0    EQU    21H  ;定义廷时变量计数器
COUNT1    EQU    22H  ;定义廷时变量计数器
COUNT2    EQU    24H  ;定义廷时变量计数器
PORTA_B   EQU    25H  ;定义数码管位选寄存器;
PORTB_B          EQU         26H
COUNT3          EQU         27H
COUNT4          EQU         28H
W_TEMP          EQU         0FFH

INTCON                EQU        0BH
T0IF                EQU        2
T0IE                EQU        5
INTE                EQU        4
INTF                EQU        1
RBIE                EQU        3
RBIF                EQU        0
OPTION_REG        EQU        81H
OPTION_TEMP        EQU        0A6H
STATUS_TEMP        EQU        23H

;--------------------
          ORG 0000H   
          NOP         ;放置一条ICD必需的空操作指令
          GOTO MAIN   
          ORG 0004H
                  GOTO SERV   
;******************************************************
CONVERT1                ;取数码管位码
           ADDWF PCL,1  ;地址偏移量加当前PC值
TABLE1
           RETLW 0FDH   ;第一位数码管
           RETLW 0FEH   ;第二位数码管
           RETLW 0F7H   ;第三位数码管
           RETLW 0FBH   ;第四位数码管
           RETLW 0DFH   ;第五位数码管
           RETLW 0EFH   ;第六位数码管
;-------------------- ----------------------------------
CONVERT                              ;取数码管段码
            ADDWF PCL,1              ;地址偏移量加当前PC值
TABLE                                                           
            RETLW 0C0H                            ;0
            RETLW 0F9H                            ;1                                
            RETLW 0A4H                            ;2
            RETLW 0B0H                            ;3
            RETLW 99H                            ;4
            RETLW 92H                            ;5
            RETLW 82H                            ;6
            RETLW 0F8H                            ;7
            RETLW 80H                            ;8
            RETLW 98H                            ;9
        RETLW 7FH                   ;.
;*******************************************************
MAIN
            CLRF PORTA              ;初始化IO口
            CLRF PORTC              ;
                        CLRF PORTB
     
            BSF STATUS,RP0         
            MOVLW 07H
            MOVWF ADCON1            ;设置RA口全部为普通数字IO口
            MOVLW 00H
            MOVWF TRISA             ;设置RA,RC口全部为输出
            MOVWF TRISC
                        MOVLW 0F8H
                        MOVWF TRISB                                ;RB1输入,中断
                        MOVLW 02H
                        MOVWF OPTION_REG

            BCF STATUS,RP0
                        MOVLW 88H
                        MOVWF INTCON
                        MOVF  PORTB,F
                        BCF          INTCON,RBIF

                        MOVLW 00H
            MOVWF PORTA_B          ;全部数码管都为输出
                        CLRF COUNTER                        ;中间计数器清零
                        MOVFW COUNTER
;----------------------
LOOPA        
                        CALL CONVERT           ;取段码
            MOVWF PORTC            ;段码送RC口显示
            CALL DELAY                          ;延时大约1秒                         CALL DELAY
                        CALL DELAY
                        CALL DELAY            ;
            INCF COUNTER,1         ;段码加1直到第10位即“。”
            MOVLW .11              ;
            XORWF COUNTER,0        ;
            BZ LOOPA               ;
            MOVFW COUNTER          ;
                        GOTO LOOPA
               
  ;;;;中断服务子程序;;;;;;;;;;;;
SERV
;;;;;;;;;;;;;;;;;;;;;保护现场;;;;;;;;
                        MOVWF        W_TEMP
                        SWAPF        STATUS,W
                        CLRF        STATUS
                        MOVWF        STATUS_TEMP

;;;;;;;;;;;;;;;调查中断源 ;;;;;;         
                        BTFSC        INTCON,RBIF
                        GOTO        RBSERV
                        GOTO        RETFIE0

;;;;;;;RB中断处理;;;;;;;;;
RBSERV
                        CALL        DELAY1
                        COMF        PORTB_B
                        MOVWF        PORTB_B
YEH                        MOVLW        05H
                        CALL        CONVERT
                        MOVWF        PORTC
                        CALL        DELAY
                        CALL        DELAY
                        CALL        DELAY
                        CALL        DELAY
                        GOTO        RBLOOP
               
;                        GOTO        YEH
RBLOOP                COMF        PORTB,W
                        BCF                INTCON,RBIF
                        ANDLW        0F0H
                        BTFSC        STATUS,Z
                        GOTO        RETFIE0
                        GOTO        RBLOOP

;;;;;;;恢复现场;;;;;
RETFIE0       
                        SWAPF        STATUS_TEMP,W
                        MOVWF        STATUS
                        SWAPF        W_TEMP
                        SWAPF        W_TEMP,W

                        RETFIE                                                       
                               
;---------------------------------廷时子程序------
DELAY          
        MOVLW  .2              ;设置延时常数
                MOVWF  COUNT0
L1                         
               MOVLW  .255            ;
                   MOVWF  COUNT1
L2                 
        MOVLW  .255            ;
                MOVWF  COUNT2
L3                         
        DECFSZ COUNT2,1        ;递减循环
            GOTO L3                ;
            DECFSZ COUNT1,1        ;
            GOTO L2                ;
            DECFSZ COUNT0,1        ;
            GOTO L1                ;
            RETLW  0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY1          
        MOVLW  .2              ;设置延时常数
                MOVWF  COUNT0
L4                         
        MOVLW  .50           ;
        MOVWF  COUNT1
L5                 
        MOVLW  .50           ;
                MOVWF  COUNT2
L6                         
        DECFSZ COUNT2,1        ;递减循环
            GOTO L6                ;
            DECFSZ COUNT1,1        ;
            GOTO L5                ;
            DECFSZ COUNT0,1        ;
            GOTO L4                ;
            RETLW  0

;----- -----------------------------------------------
            END
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。