|
發布時間: 2020-3-6 20:29
正文摘要:我打算用switch case語句做一個按鍵檢測程序。 switch(P1)//檢測幾號按鍵按下 { case 0xfe://1號 & ... |
| 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;就行了 |