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