我正在使用MPLAB为我的项目编程PIC16F84A。我有一个汇编代码,其中RB4-7位连接到按钮,因此用作输入。实现中断子程序以处理任何新的中断(当按下按钮时)。一切正常,当按下按钮时,pic进入指定的子程序。但是现在当我进入子程序时,我必须清除标志(INTCON - RBIF)但它没有被清零,但是清除INTCON寄存器中的任何其他位都能正常工作。那我该怎么办?
这是我的代码:
ORG 0X00
GOTO START
ORG 0x04
BTFSC INTCON,RBIF
GOTO RBX_INT
START CLRF PORTA
MOVLW B'10001000'
MOVWF INTCON
BSF STATUS,RP0
CLRF TRISA
MOVLW B'11110000'
MOVWF TRISB
MOVLW B'10000111'
MOVWF OPTION_REG
BCF STATUS,RP0
MAIN GOTO MAIN
这是我的子程序:
RBX_INT BCF INTCON,RBIF
MOVLW D'156'
CALL DELAY
RETFIE
答案 0 :(得分:0)
您应该在从中断返回之前清除该位,否则在delay
循环中可能已经发生新的中断,并且RBIF
将再次被清除。这是因为按钮反弹(https://en.wikipedia.org/wiki/Switch#Contact_bounce)。
此外,数据表指出:
输入引脚(RB7:RB4) 与最后锁定的旧值进行比较 阅读PORTB。 RB7的“不匹配”输出:RB4 OR一起生成RB端口更改 具有标志位RBIF(INTCON< 0>)的中断。
这意味着您必须在清除PORTB
之前阅读RBIF
以更新锁定值。
RBX_INT
MOVFW PORTB ;Read PORTB to update the latch.
MOVLW D'156'
CALL DELAY
BCF INTCON,RBIF ;Clear interrupt flag as close as possible to RETFIE.
RETFIE
此外,您应该阅读有关中断服务例程的上下文保存/恢复的信息。对于这个例子,重要的不是,因为主循环什么都不做,只是因为中断可以在任何时刻发生,它应该注意保存它使用的所有寄存器和资源,并在退出中断之前恢复它们,以防止破坏任何数据/状态主要的代码路径。
见
部分6.9 中断期间的上下文保存
在PIC16F84A数据表中。