求助:STC15L104E:单键长按、短按,掉电模式程序
时间:10-02
整理:3721RD
点击:
小弟用的单片机是STC15L104E,学着用一个按键控制LED的不同模式,并且想用他的掉电模式,程序总是改不对,请各位前辈指点迷津!
#include <reg51.h>
#include <intrins.h>
#define COUNT 1000//50000 //以us为单位 (1ms)
unsigned int Tmp;
unsigned int cnt_s = 0;
unsigned int count = 0;
unsigned char L_cnt = 0;
unsigned char PD = 0;
sbit key = P3^2;
sbit led1 = P3^0;
void Timer0_Timer1_Init()
{
TMOD|=0x00; //定时器工作在模式1
TH0 = (65536-COUNT)/256; //装初值
TL0 = (65536-COUNT)%256;
TR0 = 1;
ET0 = 1;
EA = 1;
count = 0;
}
void INT_System_init()
{
IT0 = 1;
EX0 = 1;
EA = 1;
}
void main(void)
{
P3=0xFF;
L_cnt = 0;
INT_System_init();
Timer0_Timer1_Init();
while(1)
{
if(!key)
{
count ++;
if( count >= 1500 )
{
PD = 1;
PCON = 0x02; //掉电模式开启
}
else if( count >=10 )
{
L_cnt++;
if(L_cnt == 6)
L_cnt = 0;
}
}
switch(L_cnt)
{
case 1:TR0 = 1; Tmp = 456 ;break; //1Hz
case 2:Tmp = 221 ;break; //2Hz
case 3:Tmp = 111 ;break; //4Hz
case 4:Tmp = 57 ;break; //8Hz
case 5:TR0 = 0; led1 = 1; break; //全亮
default :TR0 = 0; led1 = 0;break; //全灭
}
}
}
void INT0_Routine () interrupt 0
{
if(PD)
{
PD = 0;
while( key == 0 )
{
}
PCON = 0x00; //掉电模式关闭
}
}
void Timer0_Server(void) interrupt 1 //T0做时钟源10ms中断一次
{
TH0=(65536-COUNT)/256; //装初值
TL0=(65536-COUNT)%256;
cnt_s++; //0-100 = (10ms~1000ms)
if(cnt_s >= Tmp)
{
cnt_s = 0;
led1 = ~ led1;
}
}
补充内容 (2016-4-13 21:52):
出现的问题是,按键按一下闪烁,2Hz,再按,熄灭,只有这两种状态
#include <reg51.h>
#include <intrins.h>
#define COUNT 1000//50000 //以us为单位 (1ms)
unsigned int Tmp;
unsigned int cnt_s = 0;
unsigned int count = 0;
unsigned char L_cnt = 0;
unsigned char PD = 0;
sbit key = P3^2;
sbit led1 = P3^0;
void Timer0_Timer1_Init()
{
TMOD|=0x00; //定时器工作在模式1
TH0 = (65536-COUNT)/256; //装初值
TL0 = (65536-COUNT)%256;
TR0 = 1;
ET0 = 1;
EA = 1;
count = 0;
}
void INT_System_init()
{
IT0 = 1;
EX0 = 1;
EA = 1;
}
void main(void)
{
P3=0xFF;
L_cnt = 0;
INT_System_init();
Timer0_Timer1_Init();
while(1)
{
if(!key)
{
count ++;
if( count >= 1500 )
{
PD = 1;
PCON = 0x02; //掉电模式开启
}
else if( count >=10 )
{
L_cnt++;
if(L_cnt == 6)
L_cnt = 0;
}
}
switch(L_cnt)
{
case 1:TR0 = 1; Tmp = 456 ;break; //1Hz
case 2:Tmp = 221 ;break; //2Hz
case 3:Tmp = 111 ;break; //4Hz
case 4:Tmp = 57 ;break; //8Hz
case 5:TR0 = 0; led1 = 1; break; //全亮
default :TR0 = 0; led1 = 0;break; //全灭
}
}
}
void INT0_Routine () interrupt 0
{
if(PD)
{
PD = 0;
while( key == 0 )
{
}
PCON = 0x00; //掉电模式关闭
}
}
void Timer0_Server(void) interrupt 1 //T0做时钟源10ms中断一次
{
TH0=(65536-COUNT)/256; //装初值
TL0=(65536-COUNT)%256;
cnt_s++; //0-100 = (10ms~1000ms)
if(cnt_s >= Tmp)
{
cnt_s = 0;
led1 = ~ led1;
}
}
补充内容 (2016-4-13 21:52):
出现的问题是,按键按一下闪烁,2Hz,再按,熄灭,只有这两种状态
1、count 没有清零。
2、应该加松手判断,松手再进行相应的判断工作
if(!key)
{
count ++;
}
else
{
if( count >= 1500 )
{
PD = 1;
PCON = 0x02; //掉电模式开启
}
else if( count >=10 )
{
L_cnt++;
if(L_cnt == 6)
L_cnt = 0;
}
count = 0;
}
什么问题,什么现象,说清楚。
谢谢前辈提醒,我把帖子改一下
多谢各位指点!用其他方法解决了!