修改后完美解決你的問題,有詳細注釋
#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
}
}
}
|