PIC16F887外部中断(RB0 / INT)不工作

时间:2015-11-26 13:02:49

标签: assembly interrupt pic

这是任务:程序将2位数写入 EEPROM写入完成后点亮LED 6,7和8。按下开关时,LED 1应亮起。

我的问题:当我按下开关时,LED 1不亮。写入EEPROM和点亮LED的部分运行良好。当我在MPLAB IDE v8.88中运行代码时,只有LED 6,7和8被点亮。

我曾尝试将“goto $”更改为“睡眠并循环回入睡眠状态”,但它仍无法正常工作。我的代码有问题吗?我只是汇编语言和PIC的新手。感谢。

这是我的代码:

#include <p16F887.inc>
__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

 org 0000h
 goto Start
 org 0004h
 goto Interrupt

 Start:
 ;write ID code into EEPROM
 bsf STATUS,RP0             ;goes to bank 1
 movlw 78h                  ;moves address to working register
 movwf EEADR                ;moves address to EEADR
 movlw d'24'                ;moves number to working register
 movwf EEDATA               ;moves number from working register to EEDATA               
 bsf STATUS,RP1             ;goes to bank 3
 bsf EECON1,2               ;enables a write operation
 bcf INTCON,7               ;disables global interrupt

 ;safe combination
 movlw 55h                  ;'safe combination'
 movwf EECON2
 movlw 0AAh
 movwf EECON2
 bsf EECON1,1               ;starts the write operation

 ;write verify 
 btfsc EECON1,1             ;wait for WR bit to clear (wait for writing to complete)
 goto $-1

 ;light up LED 6,7,8
 bsf STATUS,RP0 
 bcf STATUS,RP1             ;select register bank 1

 bsf TRISB,0                ;make RB0 input

 bcf TRISD,5                ;make RD5 output
 bcf TRISD,6                ;make RD6 output
 bcf TRISD,7                ;make RD7 output
 bcf STATUS,RP0             ;select register bank 0
 bsf PORTD,5                ;turn on LED RD5
 bsf PORTD,6                ;turn on LED RD6
 bsf PORTD,7                ;turn on LED RD7

 bsf STATUS,RP0             ;select register bank 1
 bcf INTCON,INTF            ;clear external INT flag
 bsf OPTION_REG,INTEDG      ;interrupt on positive edge         
 bsf INTCON,INTE            ;enables interrupts on RBO/INT
 bsf INTCON,GIE             ;enable global interrupts

 goto $                     ;wait here

 Interrupt: 
 ;interrupt service routine:
 ;light up LED 1
 bsf STATUS,RP0             ;select register bank 1     
 bcf TRISD,0                ;make RD0 output
 bcf STATUS,RP0             ;select register bank 0  
 bsf PORTD,0                ;turn on LED RD0

 ;at the end of interrupt service routine
 bcf INTCON,INTF            ;clear external INT flag
 retfie                     ;end of interrupt routine

 end

0 个答案:

没有答案