PIC16F628A中断程序问题求助:PORTB.3无法随PORTB.0状态关断
问题排查与代码修正
核心问题分析
你的代码存在以下几个关键问题,导致RB3无法正常关断:
中断触发条件单一
你设置了BSF INTCON,4(INTEDG=1),仅让RB0的上升沿触发中断。当RB0从高变低(下降沿)时不会触发中断,程序无法及时检测到RB0状态变化来关闭RB3。中断处理逻辑不完整
中断服务程序(ISR)仅处理了"RB7为1时设置RB3为高"的情况,但没有判断RB0的当前状态,也没有在RB0不为1或RB7不为1时清零RB3的分支。主循环逻辑冲突
主循环中持续执行BCF PORTB,3,这会导致即使中断设置RB3为高,返回主循环后也会立即被清零,与"RB0和RB7同时为1时RB3保持高"的预期矛盾。寄存器操作混淆
在Bank1(STATUS,5=1)下,地址0x06对应的是TRISB(端口方向寄存器)而非PORTB,代码中用PORTB变量操作容易造成误解。
修正后的代码
#include "p16f628a.inc" ; CONFIG __config 0x3F18 ; __CONFIG _FOSC_INTOSCIO & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF LIST P=16F628A RADIX HEX ; 寄存器定义(区分Bank0和Bank1的寄存器) STATUS EQU 0x03 PORTA EQU 0x05 PORTB EQU 0x06 CMCON EQU 0x1F TRISA EQU 0x85 ; Bank1的PORTA方向寄存器 TRISB EQU 0x86 ; Bank1的PORTB方向寄存器 ORG 0x00 GOTO CONF ORG 0x04 ; 中断向量 GOTO INTERRUPCIONES CONF ; 关闭比较器,设置为数字IO BSF CMCON, 0 BSF CMCON, 1 BSF CMCON, 2 ; 配置端口方向:RB0、RB7为输入,其余为输出 BSF STATUS, 5 ; 切换到Bank1 MOVLW 0xFF MOVWF TRISA ; PORTA全输入 MOVLW 0x81 ; RB0(bit0)、RB7(bit7)为输入,其余为输出 MOVWF TRISB BCF STATUS, 5 ; 切回Bank0 ; 初始化PORTB MOVLW 0x00 MOVWF PORTB ; 配置外部中断:允许INT中断,触发方式为下降沿 BSF INTCON, 3 ; INTE=1,允许INT中断 BCF INTCON, 4 ; INTEDG=0,下降沿触发(如需双边沿检测,可在ISR中切换该位) BSF INTCON, 7 ; GIE=1,开全局中断 MAIN ; 主循环仅保持空闲,RB3的状态由中断控制 GOTO MAIN INTERRUPCIONES BCF INTCON, GIE ; 关全局中断,避免嵌套中断 BTFSC INTCON, INTF ; 检查是否为INT中断 GOTO HANDLER_INT ; 其他中断处理(如果有) GOTO EXIT_ISR HANDLER_INT ; 检测RB0和RB7的当前状态 BTFSC PORTB, 0 ; 如果RB0=1,跳过下一条指令 GOTO CLEAR_RB3 ; RB0=0,直接清零RB3 BTFSC PORTB, 7 ; RB0=1,再检查RB7:如果RB7=1,跳过下一条指令 BSF PORTB, 3 ; RB0=1且RB7=1,设置RB3为高 GOTO CLEAR_INTF CLEAR_RB3 BCF PORTB, 3 ; RB0=0 或 RB7=0,清零RB3 CLEAR_INTF BCF INTCON, INTF ; 清除中断标志位 EXIT_ISR BSF INTCON, GIE ; 开全局中断 RETFIE END
关键修正说明
完善中断触发与处理
- 初始设置
INTEDG=0(下降沿触发),确保RB0从高变低时能触发中断;如果需要检测双边沿,可在ISR末尾切换INTEDG的状态。 - 在ISR中同时检测RB0和RB7的电平,根据组合状态设置或清零RB3,确保逻辑完整。
- 初始设置
修正主循环逻辑
主循环仅保持空闲跳转,不再持续清零RB3,让中断完全控制RB3的状态,避免逻辑冲突。明确寄存器操作
新增TRISA和TRISB的定义,在Bank1中明确操作端口方向寄存器,避免混淆。初始化PORTB
配置完成后初始化PORTB为全低,确保初始状态正确。
内容的提问来源于stack exchange,提问作者NEW_ING
相关产品推荐
相关产品推荐

