You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PIC16F628A中断程序问题求助:PORTB.3无法随PORTB.0状态关断

问题排查与代码修正

核心问题分析

你的代码存在以下几个关键问题,导致RB3无法正常关断:

  1. 中断触发条件单一
    你设置了BSF INTCON,4(INTEDG=1),仅让RB0的上升沿触发中断。当RB0从高变低(下降沿)时不会触发中断,程序无法及时检测到RB0状态变化来关闭RB3。

  2. 中断处理逻辑不完整
    中断服务程序(ISR)仅处理了"RB7为1时设置RB3为高"的情况,但没有判断RB0的当前状态,也没有在RB0不为1或RB7不为1时清零RB3的分支。

  3. 主循环逻辑冲突
    主循环中持续执行BCF PORTB,3,这会导致即使中断设置RB3为高,返回主循环后也会立即被清零,与"RB0和RB7同时为1时RB3保持高"的预期矛盾。

  4. 寄存器操作混淆
    在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

关键修正说明

  1. 完善中断触发与处理

    • 初始设置INTEDG=0(下降沿触发),确保RB0从高变低时能触发中断;如果需要检测双边沿,可在ISR末尾切换INTEDG的状态。
    • 在ISR中同时检测RB0和RB7的电平,根据组合状态设置或清零RB3,确保逻辑完整。
  2. 修正主循环逻辑
    主循环仅保持空闲跳转,不再持续清零RB3,让中断完全控制RB3的状态,避免逻辑冲突。

  3. 明确寄存器操作
    新增TRISA和TRISB的定义,在Bank1中明确操作端口方向寄存器,避免混淆。

  4. 初始化PORTB
    配置完成后初始化PORTB为全低,确保初始状态正确。

内容的提问来源于stack exchange,提问作者NEW_ING

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:10:30