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

PIC18F2550汇编实现按键控LED功能失效问题求助

问题描述

我用MPLAB X搭配XC8编译器编写了PIC18F2550的汇编代码,预期实现按键按下(RB1接地)时点亮RB2引脚连接的LED,但该功能无法正常运行。对应的C语言代码可正常实现该功能,附上汇编代码、C代码及Proteus仿真说明,请求协助排查问题原因。


汇编代码(功能异常)

org 0x0000
    goto main

    org 0x0008
    retfie

main:
    ; 配置端口方向
    bsf TRISB, 1   ; RB1设为输入
    bcf TRISB, 2   ; RB2设为输出

loop:
    btfsc PORTB, 1 ; 检测RB1是否为低(按键按下)
    goto led_off   ; 未按下则跳转到熄灭LED
    goto led_on    ; 按下则点亮LED

led_on:
    bsf LATB, 2
    goto loop

led_off:
    bcf LATB, 2
    goto loop

C语言代码(功能正常)

#include <xc.h>

void main(void) {
    TRISBbits.TRISB1 = 1;  // RB1设置为输入
    TRISBbits.TRISB2 = 0;  // RB2设置为输出
    
    while(1) {
        if(PORTBbits.RB1 == 0) {  // 按键按下(RB1接地)
            LATBbits.LATB2 = 1;   // 点亮LED
        } else {
            LATBbits.LATB2 = 0;   // 熄灭LED
        }
    }
}

Proteus仿真电路说明

RB1通过按键接地,RB2串联限流电阻后连接LED到VCC;PIC18F2550的VDD接5V,VSS接地,MCLR引脚通过上拉电阻接VCC。


问题排查方向与解决方案

1. 模拟输入功能未禁用

PIC18F2550的RB1默认配置为模拟输入通道AN1,此时无法正确读取数字电平。XC8编译器在编译C代码时,会自动根据代码中对PORTB的数字操作禁用对应引脚的模拟功能,但汇编代码需要手动配置ADCON1寄存器:

; 在main函数开头添加以下代码,将所有模拟引脚设为数字输入
movlw 0x0F
movwf ADCON1

2. 内置弱上拉电阻未启用

如果按键电路没有外接上拉电阻,RB1在按键未按下时会处于浮空状态,电平不稳定导致检测逻辑失效。C代码可能默认启用了RB端口的弱上拉,汇编代码需手动配置INTCON2寄存器:

; 在main函数开头添加,启用RB端口内置弱上拉
bcf INTCON2, 7  ; 清零RBPU位,启用弱上拉

3. 编译配置不一致

检查汇编代码的MPLAB X编译选项,确保与C代码使用相同的振荡器配置(比如内部振荡器频率、分频比)。振荡器配置错误会导致程序运行速度异常,可能出现按键检测不及时的情况。

4. 端口初始化顺序问题

建议先配置模拟功能和上拉电阻,再设置TRIS端口方向,确保输入引脚处于正确的数字模式后再进行电平检测。


验证步骤
  1. 在汇编代码中添加ADCON1和INTCON2的配置代码,重新编译烧录;
  2. 在Proteus仿真中观测RB1引脚的实时电平,确认按键按下时PORTB的RB1位为低电平;
  3. 观测LATB的RB2位是否随RB1电平变化同步更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:19:50