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,然后再檢測是哪個引腳電平發生了變化,然后開始對應指令。這樣能達到防抖效果嗎?