/30秒,300秒,600秒三檔倒計時,key1按鍵切換時間,key2鍵LED點亮,松手后啟動倒計時,數碼管顯示數值每秒減1,
//倒計時結束,LED熄滅,數碼管顯示設定值;如果倒計時沒結束時,再按下key2鍵,倒計時時間置設定值重新計時
//仿真通過
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led = P1^7;
sbit key1 = P1^0; //時間切換鍵
sbit key2 = P1^1; //啟動按鍵
sbit we1 = P2^0; //數碼管位端口
sbit we2 = P2^1;
sbit we3 = P2^2;
uchar knum; //key1按鍵按下次數計數變量
uchar cont; //中斷次數變量
uint cont1=30,cont2=300,cont3=600; //定義時間變量并賦值30秒,300秒,600秒
uchar code LedTab[]= //定義共陰極數碼管段碼
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
void delay(uint z)
{
uint x,y;
for(x=z; x>0; x--)
for(y=114; y>0; y--);
}
void display1(uint shu)
{
we1 = 0;
P0 = LedTab[shu/100];
delay(5);
we1 = 1;
we2 = 0;
P0 = LedTab[shu%100/10];
delay(5);
we2 = 1;
we3 = 0;
P0 = LedTab[shu%10];
delay(5);
we3 = 1;
}
void keyscan()
{
if(key1==0)
{
delay(5);
if(key1==0)
{
while(!key1);
knum++;
if(knum==3)
knum=0;
}
}
if(key2 == 0)
{
delay(5);
if(key2 == 0) //key2按下
{
led = 0; //點亮LED,松手后啟動倒計時
while(!key2) //這句后面不加分號,下一句調用顯示函數,按鍵時數碼管才不會滅
{
// if(knum==0)
// display1(cont1);
// if(knum==1)
// display1(cont2);
// if(knum==2)
// display1(cont3);
switch(knum)
{
case 0: display1(cont1); break;
case 1: display1(cont2); break;
case 2: display1(cont3); break;
}
TR0 = 1; //啟動定時器
// led = 0; //點亮LED
cont1=30;
cont2=300;
cont3=600;
}
}
}
}
void main()
{
TMOD = 0X01; //T0定時器,模式1, 16位計數
TH0 = (65536-46082)/256; //50ms初值
TL0 = (65536-46082)%256;
EA = 1; //開總中斷
ET0 = 1; //開定時器中斷
while(1)
{
keyscan();
switch(knum)
{
case 0: display1(cont1); cont2=300; cont3=600; break;
case 1: display1(cont2); cont1=30; cont3=600; break;
case 2: display1(cont3); cont1=30; cont2=300; break;
}
}
}
void timer0() interrupt 1
{
TH0 = (65536-46082)/256; //重裝初值
TL0 = (65536-46082)%256;
cont++;
if(cont == 20)
{
cont = 0;
switch(knum)
{
case 0: cont1--;
if(cont1==0)
{
cont1=30; //倒計時時間到
led=1; //熄滅LED
TR0=0; //關閉定時器
} break;
case 1: cont2--;
if(cont2==0)
{
cont2=300;
led=1;
TR0=0;
} break;
case 2: cont3--;
if(cont3==0)
{
cont3=600;
led=1;
TR0=0;
} break;
}
}
} |