/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;
}
}
} |