)
C51 按鍵消抖兩種邏輯51單片機前提按鍵按下拉低IO松開為高電平消抖原理機械按鍵通斷瞬間有10ms左右抖動毛刺方式1檢測到低電平 → 延時消抖按下觸發(fā)最常用邏輯讀到IO為低先延時10ms過濾抖動再次判斷IO是否還是低確認是真按下再執(zhí)行功能。sbit key P3^2;void Delay10ms(void) //粗略延時{unsigned char i,j;for(i20;i0;i--)for(j248;j0;j--);}void KeyScan1(void){if(key 0) //檢測到低電平疑似按下{Delay10ms(); //等待抖動消失if(key 0) //二次確認確實按下{// 執(zhí)行按鍵功能}}}?特點按下一瞬間就觸發(fā)缺點阻塞式delay延時期間CPU啥事不能干。方式2檢測低電平后while等待直到松開松開觸發(fā)等待釋放邏輯檢測到按鍵按下低→延時消抖確認按下 →while循環(huán)卡死一直等到按鍵變回高電平松開再執(zhí)行功能void KeyScan2(void){if(key 0){Delay10ms();if(key 0){while(key 0); //阻塞等待按鍵保持低就一直卡在這里直到松手變高Delay10ms(); //松開也要消抖// 執(zhí)行按鍵功能}}}?特點松手那一刻才執(zhí)行函數(shù)適合防止長按重復觸發(fā)同樣是阻塞代碼。核心區(qū)別方式1按下觸發(fā)方式2等待松開再執(zhí)行執(zhí)行時機確認按下立刻執(zhí)行按鍵松開之后才執(zhí)行長按行為長按會反復掃描多次觸發(fā)長按只會等松手執(zhí)行1次阻塞點僅delay短暫阻塞while會長期阻塞按住不放代碼停住補充上面兩個都是阻塞式消抖項目高級寫法是定時器中斷做非阻塞消抖不用delay和while死等。