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

dsPIC33单片机按键点击时整型变量无法正常递增问题咨询

问题根源梳理
  • 变量作用域错误:main函数中定义的v是局部变量,display()函数中无法访问,实际打印的是全局默认值,数值显示本身就不准确。
  • 主函数缺少永久循环:单片机程序执行完main函数末尾的代码后会进入异常复位状态,不会重复检测按键动作,仅能执行一次逻辑。
  • 循环逻辑不符合需求:当前while循环仅在按键按下且cnt>0时执行,最多执行2次后cnt=0就永久退出循环,既没有实现循环递增回滚的效果,也没有检测按键松开、按键消抖的正确逻辑。
  • 端口配置缺失:未将RB3配置为输入模式,也未配置上下拉,按键电平检测会出现浮空误判。
修复方案

修复后的可运行代码如下:

#define GreenButton PORTBbits.RB3 // 按键输入引脚定义
// 定义全局变量,供display函数访问
int v = 0;
char buff1[10], buff2[10], buff3[10];

void longdelay()
{
    long unsigned int i;
    for(i=0;i<300000;i++);
}

// 按键消抖+按下检测函数,返回1代表有效按键动作
unsigned char key_scan()
{
    if(GreenButton == 0) // 假设按键按下为低电平,根据硬件实际接线调整
    {
        longdelay(); // 消抖延时,滤除按键机械抖动
        if(GreenButton == 0)
        {
            while(GreenButton == 0); // 等待按键松开,避免单次按压触发多次计数
            return 1;
        }
    }
    return 0;
}

void display()
{
   sprintf(buff1,"mode");
   sprintf(buff2,"  ");
   sprintf(buff3,"%d",v); 
   call_display();
   lcddelay(); 
}

int main()
{
    // 必须补充端口初始化配置
    TRISBbits.TRISB3 = 1; // 设置RB3为输入模式
    CNPU2bits.CN21PUE = 1; // 开启RB3内部上拉,根据实际dsPIC33型号调整寄存器名,硬件已接外部上下拉可省略
    display();
    
    while(1) // 单片机主程序永久循环
    {
        if(key_scan())
        {
            v++;
            if(v >= 3) // 0、1、2三个值循环,达到3就回滚到0
            {
                v = 0;
            }
            display();
        }
    }
}
  • 若你的按键按下为高电平,将key_scan里的电平判断逻辑反过来即可。
  • 消抖延时的长度可以根据实际按键触发效果调整,避免误触发或者触发不灵敏。
  • 内部上下拉配置根据你使用的具体dsPIC33型号调整寄存器名即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 16:00:04