参考一下:
sbit KEY=P3^2; //按键开关
bit ON; //开机状态标志位
unsigned char time_10ms=0x00; //按键10mS延时变
while(1)
{
if((time_10ms>=5)&&KEY) //按键没有按下,50mS进行一次处理
{
if(!key_press)
{
ON=!ON; //按键有效按下就开/关机
key_press=0;
}
if(!ON&&!key_press) //ON标志位补清除,按键已经处理,关机
{
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是一个标示,按键中断按下就标志,随便按键怎么抖动,中断只做这两件事
主程序中的相关程序执行,永远是在if((time_10ms>=5)&&KEY) 这个条件下才会被执行的,这就是一个去抖动的效果
|