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
相关产品推荐
相关产品推荐

