|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
原来用来控制灯的程序
发现关机状态下电流实在太大了,电池没几天就用完了。规格书没看明白,加了掉电程序。
现在加了,可以进掉电模式也可以唤醒,但没达到原来理想效果。那们大神帮改改。。。。。
原功能:长按开、关机;短按转换switch(n)的三种工作模式的
增加了进掉电功能后,出现问题:短按一下就开机了,且有时按键抖动一样,抬起按键会出现n的工作模式转换了。(原来没加前都是正常的)
#include "stc15w.h"
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define MAIN_Fosc 11059200L
#define key_S 80 //短按(约20ms)
#define key_L key_S*100 //长按(约2s)
sbit out=P1^5; //mos_pin_p15
sbit key = P3^2; //key_INTO
sbit ledL = P3^5; //led
sbit ledH = P3^6; //led
uint Cnt250us=0,Cnt1s; //set_times
bit ON=0; //on_off
uchar n=0;
/*pin_mode*/
void port_mode()
{
P1M1 = 0x01;
P1M0 = 0x20;
P3M0 = 0x00;
P3M1 = 0x00;
out=0;
}
void readkey(void)
{
static uint count=0;
if(!key)
{
count++;
if(count==key_L) //长按开、关机
ON=~ON;
if(count>key_L)
count=key_L+1;
}
else
{
if(count>key_S && count<key_L) //短按转换工作模式
{
if(ON==1)
n++;
n%=3;
}
count=0;
}
}
void Timer0Init() //250微秒@11.0592MHz
{
AUXR |= 0x80; //1T_mode
TMOD &= 0xF0;
TL0 = 0x33;
TH0 = 0xF5;
TF0 = 0;
TR0 = 1;
}
/*
增加掉电模式,INTO P32 低电平复醒!!!!!!!!!!!!!
*/
void power_low() //掉电模式开启
{
ET0=0; //下降沿叫醒
EX0=1; //外部中断允许
EA=1;
PCON=0x02; //进入掉模式
_nop_();
_nop_();
_nop_();
_nop_();
}
void ex_int0()interrupt 0 //INT0_P32 希望长按唤醒并进入开机状态case 0模式
{
PCON=0;
ON=1;
n=0;
Cnt250us=0;
}
void main()
{
port_mode();
Timer0Init();
while(1)
{
if(TF0==1)
{
TF0=0;
readkey();
if(ON==1)
{
Cnt250us++;
if(Cnt250us>=4000)
{
Cnt250us=0;
Cnt1s++;
if(Cnt1s>=28800) //8小时自动关机
{
Cnt1s =0;
ON=0;
ledH = 1;
ledL = 1;
out = 0;
power_low();//8小时定时自动关机后进入掉电模式
}
}
switch(n) //每个档位的工作模式,三种灯工作模式
{
case 0 :ledH=0;ledL=1;break;
case 1 :ledH=0;ledL=0;break;
case 2 :ledH=1;ledL=0;break;
}
}
else //关机状态
{
Cnt250us=0;
Cnt1s= 0;
ledH = 1;
ledL = 1;
out = 0;
power_low(); //手动长按主动关机后进入掉电模式
}
}
}
}
|
|