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