|
修改后完美解決你的問(wèn)題,有詳細(xì)注釋
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
bit sign_a=0,sign_b=0,sign_c=0,sign_d=0;//標(biāo)志
uint count1=0,count2=0; //計(jì)數(shù)器
sbit LED1 = P1^0;
sbit key = P3^0;
void keyscan() //按鍵掃描程序
{
static uchar count=0; //消抖計(jì)數(shù)變量
if(key==0) //檢測(cè)按鍵如果為0
{
count++; //消抖計(jì)數(shù)
if(count>=100) //重復(fù)檢測(cè)按鍵如果為0
{
count=100; //防止溢出
if(sign_c==0) //按鍵自鎖標(biāo)志為0
{
sign_a=1; //延時(shí)1秒啟動(dòng)標(biāo)志
sign_c=1; //按鍵自鎖標(biāo)志置1,防止一次按鍵多次響應(yīng)
EA = 0; //關(guān)閉總中斷,防止改變count2時(shí)與中斷沖突
count2+=600; //每30秒延時(shí)累加(600),最大累加到54.5分鐘,超過(guò)109次溢出
EA = 1; //開(kāi)啟總中斷
}
}
}
else //按鍵抬起
{
if(sign_c==1) //如果按鍵自鎖標(biāo)志為1
{
sign_c=0; //按鍵自鎖標(biāo)志清0
sign_d=1; //按鍵按下后再抬起標(biāo)志為1
}
count=0; //消抖計(jì)數(shù)清0
}
}
void main(void) //@12T、12MHz、定時(shí)50ms
{
TMOD = 0x01;
TH0 =(65536-50000)/256; //設(shè)置定時(shí)初值
TL0 =(65536-50000)%256; //設(shè)置定時(shí)初值
TR0=1;
EA = 1;
ET0 = 1;
while(1)
{
keyscan(); //按鍵掃描
/*******顯示部分********/
if(sign_b==1) //1秒延時(shí)結(jié)束
LED1 = 0; //LED1亮
else
LED1 = 1; //LED1滅
}
}
void time0() interrupt 1
{
TH0 =(65536-50000)/256; //設(shè)置定時(shí)重載值
TL0 =(65536-50000)%256; //設(shè)置定時(shí)重載值
if(sign_a==1) //判斷計(jì)時(shí)標(biāo)志,啟動(dòng)延時(shí)1秒
{
count1++; //計(jì)數(shù)器1自+1
if(count1>=20) //1秒延時(shí)到
{
count1=0; //計(jì)數(shù)1清0
sign_a=0; //1秒延時(shí)標(biāo)志清0
sign_b=1; //30秒延時(shí)標(biāo)志
}
}
if((sign_b==1)&(sign_d==1)) //30秒延時(shí)標(biāo)志與按鍵抬起標(biāo)志
{
count2--; //計(jì)數(shù)器2自-1
if(count2==0) //N+30秒延時(shí)到
{
sign_b=0; //30秒延時(shí)標(biāo)志清0
sign_d=0; //按鍵抬起標(biāo)志清0
}
}
}
|
|