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);//等待松手
}
}
}
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根据系统来灵活设置。反正肯定比你什么防抖都不加更可靠。
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;
}
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,然后再检测是哪个引脚电平发生了变化,然后开始对应指令。这样能达到防抖效果吗?