|
/30秒,300秒,600秒三檔倒計(jì)時(shí),key1按鍵切換時(shí)間,key2鍵LED點(diǎn)亮,松手后啟動(dòng)倒計(jì)時(shí),數(shù)碼管顯示數(shù)值每秒減1,
//倒計(jì)時(shí)結(jié)束,LED熄滅,數(shù)碼管顯示設(shè)定值;如果倒計(jì)時(shí)沒(méi)結(jié)束時(shí),再按下key2鍵,倒計(jì)時(shí)時(shí)間置設(shè)定值重新計(jì)時(shí)
//仿真通過(guò)
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led = P1^7;
sbit key1 = P1^0; //時(shí)間切換鍵
sbit key2 = P1^1; //啟動(dòng)按鍵
sbit we1 = P2^0; //數(shù)碼管位端口
sbit we2 = P2^1;
sbit we3 = P2^2;
uchar knum; //key1按鍵按下次數(shù)計(jì)數(shù)變量
uchar cont; //中斷次數(shù)變量
uint cont1=30,cont2=300,cont3=600; //定義時(shí)間變量并賦值30秒,300秒,600秒
uchar code LedTab[]= //定義共陰極數(shù)碼管段碼
{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; //點(diǎn)亮LED,松手后啟動(dòng)倒計(jì)時(shí)
while(!key2) //這句后面不加分號(hào),下一句調(diào)用顯示函數(shù),按鍵時(shí)數(shù)碼管才不會(huì)滅
{
// 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; //啟動(dòng)定時(shí)器
// led = 0; //點(diǎn)亮LED
cont1=30;
cont2=300;
cont3=600;
}
}
}
}
void main()
{
TMOD = 0X01; //T0定時(shí)器,模式1, 16位計(jì)數(shù)
TH0 = (65536-46082)/256; //50ms初值
TL0 = (65536-46082)%256;
EA = 1; //開(kāi)總中斷
ET0 = 1; //開(kāi)定時(shí)器中斷
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; //倒計(jì)時(shí)時(shí)間到
led=1; //熄滅LED
TR0=0; //關(guān)閉定時(shí)器
} 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;
}
}
} |
|