參考一下:
sbit KEY=P3^2; //按鍵開關(guān)
bit ON; //開機狀態(tài)標志位
unsigned char time_10ms=0x00; //按鍵10mS延時變
while(1)
{
if((time_10ms>=5)&&KEY) //按鍵沒有按下,50mS進行一次處理
{
if(!key_press)
{
ON=!ON; //按鍵有效按下就開/關(guān)機
key_press=0;
}
if(!ON&&!key_press) //ON標志位補清除,按鍵已經(jīng)處理,關(guān)機
{
PCON=0x02; //進入掉電模式
_nop_();_nop_();_nop_();_nop_(); //4個空指令
Mcu_Awaken(); //單片機喚醒,自己可以寫一些自己需要的功能
}
time_10ms=0x00; //清除時間
}
}
void Int0_isr() interrupt 0 //外部中斷0
{
key_press=1; //按下按鍵
time_10ms=0x00; //從最后一次退出中斷開始計時
IE0=0;
}
void T0_isr() interrupt 1
{
if(time_10ms<250)time_10ms++; //每10mS,time_10ms++一次
}
time_10ms是定時器中斷中++的全局變量.按鍵按下就清除
key_press是一個標示,按鍵中斷按下就標志,隨便按鍵怎么抖動,中斷只做這兩件事
主程序中的相關(guān)程序執(zhí)行,永遠是在if((time_10ms>=5)&&KEY) 這個條件下才會被執(zhí)行的,這就是一個去抖動的效果
|