|
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
/****共陽(yáng)數(shù)碼管0--9+全滅段碼****/
uchar code led[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xff};
uchar a[6];//數(shù)碼管顯示
uchar b[6]={0xFB,0XF7,0XEF,0XDF,0XBF,0X7F};//數(shù)碼管位碼
/****子函數(shù)聲明****/
void delay_ms(uint z);//帶參數(shù)ms級(jí)延時(shí)子函數(shù)
void init();//初始化函數(shù)
void timechuli();//時(shí)間處理
void key();//按鍵函數(shù)
void display();//顯示函數(shù)
/****變量定義****/
uint num; // 記錄毫秒為秒的變量
uchar hour=23;
uchar minite=59;
uchar second=56;
uchar hour1=0;
uchar minite1=1;
uchar second1=0;
uchar k;
uchar flag;//更新時(shí)間的4種模式加上正常模式
uchar S_flag;//閃爍標(biāo)志位
/****位定義****/
sbit beep=P3^6; //蜂鳴器
sbit led0=P1^0; //整點(diǎn)報(bào)時(shí)顯示
sbit led1=P1^7; //鬧鐘報(bào)時(shí)顯示
sbit key1=P3^2;//模式切換鍵1正常模式 2時(shí)鐘時(shí)調(diào)整 3時(shí)鐘分調(diào)整 4鬧鐘時(shí)調(diào)整 5鬧時(shí)鐘分調(diào)整
sbit key2=P3^3;//加1
sbit key3=P3^4;//減1
sbit key4=P3^5; //復(fù)位鍵
void main()
{
init();
while(1)
{
key();
display();
}
}
void display()
{
switch(flag)
{
case 0: //時(shí)鐘顯示模式
{
a[5]=led[hour/10];
a[4]=led[hour%10];
a[3]=led[minite/10];
a[2]=led[minite%10];
a[1]=led[second/10];
a[0]=led[second%10];
}
break;
case 1: // 時(shí)鐘 時(shí)調(diào)整模式
{
if(S_flag==1) //標(biāo)志位為1
{
a[5]=led[hour/10];//調(diào)整時(shí)鐘的時(shí)
a[4]=led[hour%10];
}
else
{
a[5]=led[11];//關(guān)閉顯示
a[4]=led[11];
}
a[3]=led[minite/10];
a[2]=led[minite%10];
a[1]=led[second/10];
a[0]=led[second%10];
}
break;
case 2: //時(shí)鐘 分調(diào)整模式
{
a[5]=led[hour/10];
a[4]=led[hour%10];
if(S_flag==1)
{
a[3]=led[minite/10];
a[2]=led[minite%10];
}
else
{
a[3]=led[11];
a[2]=led[11];
}
a[1]=led[second/10];
a[0]=led[second%10];
}
break;
case 3: // 鬧鐘 時(shí)調(diào)整模式
{
if(S_flag==1)
{
a[5]=led[hour1/10];
a[4]=led[hour1%10];
}
else
{
a[5]=led[11];
a[4]=led[11];
}
a[3]=led[minite1/10];
a[2]=led[minite1%10];
a[1]=led[11];
a[0]=led[11];
}
break;
case 4:
{
a[5]=led[hour1/10];
a[4]=led[hour1%10];
if(S_flag==1)// 鬧鐘 分調(diào)整模式
{
a[3]=led[minite1/10];
a[2]=led[minite1%10];
}
else
{
a[3]=led[11];
a[2]=led[11];
}
a[1]=led[11];
a[0]=led[11]; ///
}
break;
}
}
void init()
{
beep=0;//關(guān)閉蜂鳴器
flag=0;//正常時(shí)鐘顯示模式
S_flag=0;//閃爍標(biāo)志位
TMOD=0X01;//定時(shí)器T0 方式1
TH0=(65536-50000)/256;//重裝初值
TL0=(65536-50000)%256;
EA=1;//開(kāi)總中斷
ET0=1;//開(kāi)啟定時(shí)器T0
TR0=1;
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;//重裝初值
TL0=(65536-50000)%256;
num++;
if(num==20)//1S到
{
num=0;
timechuli();//時(shí)間處理函數(shù)
}
if(hour1==hour&&minite1==minite&&second<5)//鬧鐘時(shí)間到
{
beep=!beep;
led1=!led1;
}
else//鬧鐘提醒時(shí)間到后 關(guān)閉蜂鳴器和指示燈
{
beep=0;
led1=1;
}
if((minite==0)&&(second==0)) //整點(diǎn)到
{
led0=!led0;
}
else //關(guān)閉LED指示
led0=1;
if(num%20==0) //1S取反一次
S_flag=!S_flag; //閃爍標(biāo)志位取反
for(k=0;k<6;k++)
{
P2=b[k]; //送位碼
P0=a[k]; //送段碼
delay_ms(2);
P2=0xff;//消影
}
}
void key()
{
if(key1==0)//模式切換鍵按下
{
delay_ms(10);
if(key1==0)
{
flag++;
if(flag==5)
{
flag=0;
}
}
while(!key1) ; //等待按鍵釋放
}
if(flag!=0)
{
switch(flag)
{
case 1: //時(shí)鐘時(shí)調(diào)整
{
if(key2==0) //時(shí)鐘時(shí)加1
{
delay_ms(10);
if(key2==0)
{
if(hour<23) hour++;
else hour=0;
}
while(!key2);
}
if(key3==0) //時(shí)鐘時(shí)減1
{
delay_ms(10);
if(key3==0)
{
if(hour> 0) hour--;
else hour=23;
}
while(!key3) ;
}
}
break;
case 2: //時(shí)鐘分調(diào)整
{
if(key2==0) //時(shí)鐘分加1
{
delay_ms(10);
if(key2==0)
{
if(minite<59) minite++;
else minite=0;
}
while(!key2);
}
if(key3==0) //時(shí)鐘分減1
{
delay_ms(10);
if(key3==0)
{
if(minite> 0)minite--;
else minite=59;
}
while(!key3);
}
}
break;
case 3: //鬧鐘時(shí)調(diào)整
{
if(key2==0) //鬧鐘時(shí)加1
{
delay_ms(10);
if(key2==0)
{
if(hour1<23) hour1++;
else hour1=0;
}
while(!key2);
}
if(key3==0) //鬧鐘時(shí)減1
{
delay_ms(10);
if(key3==0)
{
if(hour1> 0) hour1--;
else hour1=23;
}
while(!key3);
}
}
break;
case 4: //鬧鐘分調(diào)整
{
if(key2==0) //鬧鐘分加1
{
delay_ms(10);
if(key2==0)
{
if(minite1<59) minite1++;
else minite1=0;
}
while(!key2) ;
}
if(key3==0) //鬧鐘分減1
{
delay_ms(10);
if(key3==0)
{
if(minite1> 0)minite1--;
else minite1=59;
}
while(!key3);
}
}
break;
}
}
if(key4==0)//復(fù)位鍵
{
delay_ms(10);
if(key4==0)
{
flag=0;
hour=0;
minite=0;
second=0;
}
while(!key4);
}
}
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void timechuli()
{
second++;
if(second==60)
{
second=0;
minite++;
}
if( minite==60)
{
minite=0;
hour++;
}
if(hour==24)
hour=0;
}
|
|