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端口方向,确保输入引脚处于正确的数字模式后再进行电平检测。
验证步骤
- 在汇编代码中添加
ADCON1和INTCON2的配置代码,重新编译烧录; - 在Proteus仿真中观测RB1引脚的实时电平,确认按键按下时PORTB的RB1位为低电平;
- 观测LATB的RB2位是否随RB1电平变化同步更新。
内容的提问来源于stack exchange,提问作者John Sall
相关产品推荐
相关产品推荐

