以前做的一个LED控制开关,待机小于1uA
#include<pic.h>
#define uint unsigned int
#define uchar unsigned char
#define SW1 GP3
#define led1 GP1
__CONFIG(0x00000);
bit on,work,ing,b,q; //b q释放状态位
uchar n,m,time;
void sys_init()
{
OSCCAL &= 0xfe;
OPTION = 0x86; //关电平变化时唤醒 上拉 定时器0时钟 128分频
TRISGPIO = 0x08; //GP0输入 GP1 GP2输出
on = 0;
work = 0;
ing = 0;
time = 0;
led1 = 1;
q = 0;
}
void delay10ms() //按键消抖延时
{
uchar i,j;
for(i=5;i>0;i--)
for(j=80;j>0;j--);
}
void sos()
{
if(TMR0==1)
{
time++;
TMR0 = 2;
}
if(time>=3) //100ms
{
time = 0;
m++;
n++;
if(m<16)
{
if(m<3)
{
led1 = 0;
}
else if(m<5)
{
led1 = 1;
}
else if(m<7)
{
led1 = 0;
}
else if(m<9)
{
led1 = 1;
}
else if(m<11)
{
led1 = 0;
}
else
{
led1 = 1;
}
}
else if((m>15)&&(m<37))
{
if(m<20)
{
led1 = 0;
}
else if(m<22)
{
led1 = 1;
}
else if(m<26)
{
led1 = 0;
}
else if(m<28)
{
led1 = 1;
}
else if(m<32)
{
led1 = 0;
}
else
{
led1 = 1;
}
}
else if((m>36)&&(m<52))
{
if(m<39)
{
led1 = 0;
}
else if(m<41)
{
led1 = 1;
}
else if(m<43)
{
led1 = 0;
}
else if(m<45)
{
led1 = 1;
}
else if(m<47)
{
led1 = 0;
}
else
{
led1 = 1;
}
}
else if((m>51)&&(m<60))
{
led1 = 1;
}
else
{
m = 0;
}
}
}
void main()
{
sys_init();
for(;;)
{
if(work==0)
{
if((SW1==0)&&(ing==0)) //第一次触发
{
delay10ms();
if((SW1==0)&&(ing==0))
{
led1 = 0;
on = 1;
ing = 1;
}
}
if(on==1) //第一次触发释放
{
if(SW1==1)
{
delay10ms();
if(SW1==1)
{
work = 1;
on = 0;
}
}
}
else //进入休眠模式
{
if(SW1==1)
{
delay10ms();
if(SW1==1)
{
// STATUS |= 0x80; //引脚电平变化时从休眠中唤醒导致的复位
OPTION = 0x06;
SLEEP(); //引脚电平变化时从休眠中唤醒导致的复位
}
}
}
}
else
{
if(((SW1==0)&&(on==0))&&(q==0)) //第二次触发 判断是否长按两秒以上
{
delay10ms();
while((SW1==0)&&(on==0))
{
ing = 0; //非闪灯模式
if(TMR0==1)
{
time++;
TMR0 = 2;
}
if(time>60) //2秒以上进入闪灯模式
{
on = 1;
ing = 1;
b = 1;
m = 0;
}
}
time = 0;
}
if((q==1)||(b==1))
{
if(SW1==1) //触发释放
{
delay10ms();
if(SW1==1)
{
q = 0;
b = 0;
}
}
}
if(on==1) //闪灯模式
{
sos();
if(b==0)
{
if(SW1==0)
{
delay10ms();
n = 0;
while((SW1==0)&&(q==0))
{
ing = 0; //关机模式
sos();
if(n>20) //两秒以上进入闪灯正常模式
{
on = 0;
ing = 1;
b = 1;
led1 = 0;
q = 1;
}
}
n = 0;
}
}
}
if(ing==0) //关灯 进入休眠模式
{
led1 = 1;
work = 0;
ing = 1;
on = 0;
time = 0;
}
}
}
}
|