sbit unit = P1^0; //P1.0為外部中斷口(接菜單鍵)。我想實現:開機時按此鍵為菜單切換鍵,長按時休眠,休眠后再短按一下開機。 目前可以實現開機時菜單切換,自動休眠后再短按一下開機,但長按給Low_Power =101;按理論上應該可以進入休眠,但是休眠瞬間又復位開機了。如果把這句 Power_Down_F = 0; 放在掉電模式STOP2后,可以實現菜單切換,長按時休眠,但休眠后短按開機又出現了以下幾個問題:1.自動休眠后需按兩次才能開機,(休眠后電流為:15uA,按下第一次電流升到1到2mA但不開機,按下第二次才能開機)2.長按按鍵休眠后待機電流為1-2mA(休眠電流應該為:15uA,沒有完全休眠),這時只需按下一次會開機。
目前我的思路是借鑒論壇里 “家用廚房電子秤” 的休眠程序 :原程序中沒有長按關機功能,只是自動休眠前把外部中斷打開,按下接外部中斷的開關觸發中斷退出休眠。和之前WULIN老師說的方法類似,“利用單片機休眠功能即可解決。初次上電自動開機,P1.0作為普通按鍵使用,短按切換菜單,長按執行菜單下不同任務。只要再加一項菜單,長按打開外部中斷,執行睡眠即可關機。在睡眠狀態由外部觸發喚醒,關閉外部中斷,恢復P1.0作為普通按鍵使用。”
以下是按照上面的思路我寫的。
//休眠 ---------------------------------------------------------------------------------------------
if(XmCnt==1) //XmCnt為定時器500mS到標志,即500mS檢測一下是否進來休眠
{
if(md1==0&&press<50) //如果md1==0&&press<50休眠
{
Low_Power ++;
}
else
{
Low_Power = 0;
}
}
if(Low_Power > 100) //50S休眠
{
IT1=1; //使能INT1下降沿中斷
EX1=1; //使能INT1中斷
ET0=0; //關閉定時器0
ET1=0; //關閉定時器1
WD_DIS // 看門狗關閉
//--配置IO模式 (確保不漏電)
P0M0 = 0x00; P0M1 = 0xff;
P1M0 = 0x00; P1M1 = 0xfe; //P1.0為外部中斷口
P2M0 = 0x00; P2M1 = 0xff;
P3M0 = 0x00; P3M1 = 0xff;
P4M0 = 0x00; P4M1 = 0xff;
P0 = 0x00;
P1 = 0x01; //P1.0為外部中斷口
P2 = 0x2E; //p2.1 p2.2 p2.3 p2.5低電平驅動四個數碼管的COM口
P3 = 0x00;
P4 = 0x00;
Power_Down_F = 0;
_nop_();
PCON |= 0x10; //進入掉電模式STOP2
_nop_();
//-- 關機 : 等待外部中斷喚醒 ---
while(1)
{
if(Power_Down_F)
PCON = 0x0C; //喚醒
}
}
}
}
void EX_Int1 (void) interrupt 2 //INT1
{
Power_Down_F = 1 ;
}
按鍵為低層和應該用層掃描識別
void key_Service() //應用層
{
switch(Key_Scan()) //key_Scan() 為底層 返回鍵值
{
case 2: if(Setflag == 1){ KeyNum=0; E2prom_Read_user();T1Cnt=0; SSCnt=0; keyflag=0; Setflag=0;} else {KeyNum=0; wnd++; if(wnd>2) wnd=0; E2prom_write_user();} break; //短按P1.0 鍵值為2 菜單窗口wnd切換
-
-
-
case 22: KeyNum=0; Low_Power = 101; E2prom_write_user(); Setflag = 1; break; //長按P1.0 鍵值為22 這里給 Low_Power = 101; 進入上面的休眠部分,即 if(Low_Power > 100) 。
}
}
|