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

Microchip MPLAB IDE XC8编译器if条件失效:按键整十计数时LED无响应

问题分析与修复方案

核心问题

  • 按键检测仅执行一次:原代码里if (Button==1)在进入while(1)死循环前只运行一次,程序后续再也不会检查按键状态,导致按下按键完全无法触发计数逻辑。
  • 缺少按键消抖:物理按键按下/释放时存在机械抖动,直接检测会导致一次按键触发多次Counter++,逻辑混乱。
  • 条件判断冗余:Counter !=0属于多余判断,因为Counter从0开始递增,Counter%10==0在初始值0时虽成立,但首次按键后Counter会变为1,后续只有整十数值才会满足条件,可直接简化。

修复后的代码

/*
 * File:   proje_6.c
 * Author: ayanoglu
 *
 * Created on 08 Nisan 2023 Cumartesi, 12:14
 */


#include <xc.h>

void delayFunction(unsigned int);

#define Button PORTBbits.RB0   //RB0 button
#define Led PORTBbits.RB1       //RB1 led

unsigned char Counter = 0; // 改为无符号字符型,避免负数溢出问题

void main(void) {
  
    TRISBbits.TRISB0 = 1;
    TRISBbits.TRISB1 = 0;
    Led = 0; // 初始化LED为熄灭状态

    while(1){ // 主循环持续检测按键状态
        if (Button == 1){
            delayFunction(20); // 按键按下消抖延时
            if (Button == 1){ // 再次确认按键处于按下状态
                Counter++;
                
                if (Counter % 10 == 0){ // 直接判断是否为整十数值
                    Led = 1;
                    delayFunction(500); // 延长亮灯时长,方便观察效果
                    Led = 0;
                }
                
                // 等待按键释放,避免按住按键时Counter持续递增
                while(Button == 1);
                delayFunction(20); // 按键释放消抖
            }
        }
    }
}

void delayFunction(unsigned int itime){
    unsigned int i;
    unsigned char j;
    for (i=0;i<itime;i++){
        for(j=0;j<165;j++);
    }
}

关键修改说明

  • 将按键检测移入主循环:让程序在死循环中持续检查按键状态,确保每次按键操作都能被捕获。
  • 添加按键消抖逻辑:按下和释放时都加入短延时,过滤机械抖动导致的误触发。
  • 等待按键释放:保证一次按键操作仅触发一次Counter递增,避免按住按键时计数连续增加。
  • 优化变量类型:把char Counter改为unsigned char,计数范围变为0-255,更贴合需求且避免负数问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:22:16