| 10楼的延时消抖比较好 |
mars_zfmy 发表于 2020-3-7 14:42 可以的,谢谢。 |
yxh1999 发表于 2020-3-9 09:08 好的,谢谢。 |
| delay50ms(20); |
夜空。 发表于 2020-3-7 16:26 这样也是可以的。具体情况需要根据系统复杂度和实际IO口的环境来定。如果这个脚有时候因为静电的原因偶尔有个100MS的干扰信号的话,你这里延时10MS就不够了,可能需要写100MS以上的延时,那么对整个系统而言,按键这样处理就会降低系统的执行效率,使系统越来越慢。 |
| 可以写个状态机,处理消抖感觉挺好用的 |
yxh1999 发表于 2020-3-7 13:46 我是初学者你加的这句有点似懂非懂 static BYTE last_io=0xff; static BYTE last_delay=0; void keyscan() { if(last_io!=P1) { last_io=P1; last_delay=10; } else { if(P1!=0xff) { if(last_delay>0) { last_delay--; if(last_delay==0) 意思是不是将指针定位到P1端口,然后检测P1端口电位是否发生变化,如果发生变化,则进行10ms延时。是这个意思吗? 我想了下,我直接这样加 if(P1!=0xff) //P1端口电平发生变化,表示有按键按下 { delay10ms(); //延迟10ms switch(P1)//再次检测是哪位选手按下抢答按钮 { case 0xfe://1号 beep = 1; //蜂鸣器响 delay50ms(20); beep = 0; break; case 0xfd://2号 case 0xfb://3号 case 0xf7://4号 case 0xef://5号 case 0xdf://6号 case 0xbf://7号 case 0x7f://8号 } } 如果P1端口电位发生变化,则延时10ms,然后再检测是哪个引脚电平发生了变化,然后开始对应指令。这样能达到防抖效果吗? |
|
unsigned char linkey=0;//临时按键值 void main() { while(1) { keyscan(); } } void keyscan() { linkey=P1; delay(10); if(P1==linkey) { switch(P1)//检测几号按键按下 { case 0xfe:/*1号任务*/break; case 0xfd:/*2号任务*/break; case 0xfb:/*3号任务*/break; case 0xf7:/*4号任务*/break; case 0xef:/*5号任务*/break; case 0xdf:/*6号任务*/break; case 0xbf:/*7号任务*/break; case 0x7f:/*8号任务*/break; default: break; } } } |
|
static BYTE last_io=0xff; static BYTE last_delay=0; void keyscan() { if(last_io!=P1) { last_io=P1; last_delay=10; } else { if(P1!=0xff) { if(last_delay>0) { last_delay--; if(last_delay==0) { switch(P1)//检测几号按键按下 { case 0xfe:/*1号任务*/break; case 0xfd:/*2号任务*/break; case 0xfb:/*3号任务*/break; case 0xf7:/*4号任务*/break; case 0xef:/*5号任务*/break; case 0xdf:/*6号任务*/break; case 0xbf:/*7号任务*/break; case 0x7f:/*8号任务*/break; default: break; } } } } } } 你要防抖的话,加2个变量就好了。读到P1值后保存下来,跟之前的比较下,再整个计数,达到计数值就执行按键功能,这就是防抖了。赋值10根据系统来灵活设置。反正肯定比你什么防抖都不加更可靠。 |
| 在按键等于键值时开启10ms时长的定时器到时检测值是否等于此键值,等于就是按键不等就直接退出。 |
csmyldl 发表于 2020-3-7 02:05 这个1s的延时是蜂鸣器响一秒的时间,不是按键防抖的。。。 |
yxh1999 发表于 2020-3-7 09:18 大神可以指导下吗 |
xuyaqi 发表于 2020-3-7 09:52 延时程序会写,但是不知道怎么放到这个按键检测里面去,怎么才能防抖。 |
| 你都有 delay50ms(20);,应该会自己建10ms延时程序。 |
|
while(P1!=0xff);//等待松手 如果这样玩的话,用户如果一直按住按键不放的话,整个系统可能会崩溃了。 ![]() |
|
void keyscan() { if(P1!=0xff) { delay(10); if(P1!=0xff) { switch(P1)//检测几号按键按下 { case 0xfe:/*1号任务*/break; case 0xfd:/*2号任务*/break; case 0xfb:/*3号任务*/break; case 0xf7:/*4号任务*/break; case 0xef:/*5号任务*/break; case 0xdf:/*6号任务*/break; case 0xbf:/*7号任务*/break; case 0x7f:/*8号任务*/break; default: break; } while(P1!=0xff);//等待松手 } } } |
|
switch(P1)//检测几号按键按下 { case 0xfe://1号 beep = 1; //蜂鸣器响 delay50ms(20); beep = 0; break; }这不已经加了延时程序了?后面加1个break;就行了 |