- void INT0() interrupt 0 //INT0:長短按: 改邊沿觸發+20msT0消抖+電平檢測; 理論上:按鍵檢測用邊沿觸發+定時消抖最可靠;
- { //關鍵:短按一般0.1~0.3s,彈起很快;
- TH0=TL0=0xB8, TR0=1; //消抖: 20ms(B8實20.2),每次跳變抖動都重新計時;
- while(!TF0) ; TF0=0; //查詢: 一直等TF0=1才往下執行,注意用;號;查詢方式要清0; 雙沿EA=0沒必要;
- if(key==1) {Kc++, Kc=Kc%6;} //短按: 上升沿有效; 彈起20ms即可切換1次彩燈:6次循環; Kc=Kc%6等效if(Kc>=6) Kc=0;
- else //長按: 下降沿有效; 短按一般0.1~0.3s,超過為長按,彈起很快;
- { dl_ms( 480); // 按下0.3-0.5s仍未彈起趕緊執行長按代碼(不然總體太慢);
- if(key==0) // 未彈起(再處理大白燈和待機):
- {dl_ms(1000); // 再延時1s,總1.5s;
- if(key==0) W=!W; //白燈: 長按1.5s則:白燈開/關; Kc要-1;
- dl_ms(1000); // 再延時1s,總2.5s;
- if(key==1) Kc--; // 按下1.5-2s期間已經彈起, Kc先-1;
- else //復位: 按下1.5-2s期間仍未彈起, 則準備處理復位;
- {dl_ms(500), W=!W; // 先延時0.5s,總3s;白燈閃1次再準備進復位,方便觀察;效果很好!
- dl_ms(100), status=2; // 長按超3s則:復位;狀態標志2(開機0/待機1/復位2); ok!很好!
- }}} //效果: 改雙沿后短按迅速(之前等0.5秒), 無需開關中斷防干擾;
- }
- void INT1() interrupt 2 //INT1:充電監控: 邊沿觸發+20msT0消抖+電平檢測;主要實時喚醒掉電狀態; 1212;
- { //理論: 本監控電路其實只用中斷+20ms軟件消抖也可靠,暫統一用邊沿觸發+定時消抖好了;
- TH0=TL0=0xB8, TR0=1; //消抖: 20ms(實20.2),每次跳變抖動都重新計時;
- while(!TF0) ; TF0=0; //查詢: 一直等到TF0=1才往下執行,注意;號; 查詢方式要清0; EA=0防干擾沒必要;
- }
復制代碼
|