|
#include <reg52.h>
//sbit INT0 = P3^2; // INT0喚醒掉電模式
sbit key = P3^0; //定義按鍵輸入端口 //P3.0/P3.1為仿真口和USB下載口時(shí)不可演示
void DELAY_MS(unsigned int a) //mS延時(shí)函數(shù)
{
unsigned int i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
void INT0_INIT(void)
{
EA=1; //全局中斷開
EX0=1; //外部中斷0開
IT0=0; //電平觸發(fā)
}
main() // 主程序
{
INT0_init();
key=1; //按鍵輸入端口電平置高
while(1) //主循環(huán)
{
if(!key) //如果檢測到低電平,說明按鍵按下
{
DELAY_MS(20); //延時(shí)去抖,一般10-20ms
if(!key) //再次確認(rèn)按鍵是否按下,沒有按下則退出
{
while(!key); //改成這樣
PCON=0x02; //MCU進(jìn)入掉電模式
DELAY_MS(20); //掉電模式被喚醒后,首先執(zhí)行此語句,然后再進(jìn)入中斷服務(wù)程序
//while(!key); //死循環(huán)
}
}
}
}
void ISR_Key(void)interrupt 0 using 1 // 外部中斷程序
{
if(!INT0) //INT0喚醒掉電模式
{
//通常在中斷子程序中是不調(diào)用延時(shí)子程序的,這樣會(huì)增加中斷處理時(shí)間,則下次中斷有可能不會(huì)被觸發(fā),就會(huì)延誤響應(yīng)中斷了,導(dǎo)致定時(shí)器時(shí)間出錯(cuò)。
DELAY_MS(20);
if(!INT0)
{
PCON=0x00;
DELAY_MS(20);
}
}
}
|
|