修改后完美解决你的问题,有详细注释
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
bit sign_a=0,sign_b=0,sign_c=0,sign_d=0;//标志
uint count1=0,count2=0; //计数器
sbit LED1 = P1^0;
sbit key = P3^0;
void keyscan() //按键扫描程序
{
static uchar count=0; //消抖计数变量
if(key==0) //检测按键如果为0
{
count++; //消抖计数
if(count>=100) //重复检测按键如果为0
{
count=100; //防止溢出
if(sign_c==0) //按键自锁标志为0
{
sign_a=1; //延时1秒启动标志
sign_c=1; //按键自锁标志置1,防止一次按键多次响应
EA = 0; //关闭总中断,防止改变count2时与中断冲突
count2+=600; //每30秒延时累加(600),最大累加到54.5分钟,超过109次溢出
EA = 1; //开启总中断
}
}
}
else //按键抬起
{
if(sign_c==1) //如果按键自锁标志为1
{
sign_c=0; //按键自锁标志清0
sign_d=1; //按键按下后再抬起标志为1
}
count=0; //消抖计数清0
}
}
void main(void) //@12T、12MHz、定时50ms
{
TMOD = 0x01;
TH0 =(65536-50000)/256; //设置定时初值
TL0 =(65536-50000)%256; //设置定时初值
TR0=1;
EA = 1;
ET0 = 1;
while(1)
{
keyscan(); //按键扫描
/*******显示部分********/
if(sign_b==1) //1秒延时结束
LED1 = 0; //LED1亮
else
LED1 = 1; //LED1灭
}
}
void time0() interrupt 1
{
TH0 =(65536-50000)/256; //设置定时重载值
TL0 =(65536-50000)%256; //设置定时重载值
if(sign_a==1) //判断计时标志,启动延时1秒
{
count1++; //计数器1自+1
if(count1>=20) //1秒延时到
{
count1=0; //计数1清0
sign_a=0; //1秒延时标志清0
sign_b=1; //30秒延时标志
}
}
if((sign_b==1)&(sign_d==1)) //30秒延时标志与按键抬起标志
{
count2--; //计数器2自-1
if(count2==0) //N+30秒延时到
{
sign_b=0; //30秒延时标志清0
sign_d=0; //按键抬起标志清0
}
}
}
|