#include <REGX52.H>
#include "Delay.h"
#include "Buzzer.h"
unsigned int hour=12,min=1,sec=0,day=27,month=2,year=2022,year_1=20,year_2=22; //對時分秒日月年進行定義和賦值
unsigned int week=1,b=30,i=1,c=0,d=0,e=0,f,g,h=0,k=0,l=0,p,q,z=13; //星期,b為二月計數,其他均為用來計數,
unsigned int N1hour=12,N1min=1,N1miao=0,N2hour=0,N2min=0,N2miao=0;//鬧鐘的時分秒
unsigned int Timer0Count=0; //定時器設定為沒10毫秒打斷一次,當目的是每1秒鐘讓秒數加一,就讓定時器打斷100次,總時長為1秒,
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x01,0x08,0x09,0x00};//最后一個顯示空后三個為定時器標志
void shijian()//防止調時溢出
{
if(hour==25)
hour=1;
if(hour==0)
hour==24;
if(min==61)
min=1;
if(min==0)
min=60;
if(week==8)
week=1;
if(week==0)
week=7;
if(month==13)
month=1;
if(month==0)
month=12;
if((year%4==0)&&(year%100!=0)||(year%400==0))
{
if(day==30)
day=1;
if(day==0)
day=29;
}
else
{
if(day==29)
day=1;
if(day==0)
day=28;
}
}
void runnian(void)//判斷閏年及二月變化
{
if((year%4==0)&&(year%100!=0)||(year%400==0))
{
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
b=31;
if((month==4)||(month==6)||(month==9)||(month==11))
b=30;
if(month==2)
b=29;
}
else
{
if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
b=31;
if((month==4)||(month==6)||(month==9)||(month==11))
b=30;
if(month==2)
b=28;
}
}
void NixieTube(unsigned char Location,Number)//數碼管位選段選
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number];
Delay(1);
P0=0x00;
}
void Timer0_Init(void) //10毫秒@11.0592MHz
{
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0x00; //設置定時初值
TH0 = 0xDC; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0=1; //中斷初始化
EA=1; //中斷初始化
PT0=0; //中斷初始化
}
void main()
{
Timer0_Init(); //定時器初始化
runnian();
while(1)
{
if(P3_3==0)//界面切換判斷
{
Delay(20);
while(P3_3==0);
Delay(20);
i++;
if(i>=4)
i=1;
}
if(N1hour==hour&&N1min==min&&z==10||z==12)//鬧鐘1到時響
{
Buzzer(10);
if(P3_0==0||P3_1==0||P3_2==0||P3_3==0) N1min=0;//任意按鍵按下鬧鐘關閉
}
if(N2hour==hour&&N2min==min&&z==11||z==12)//鬧鐘2到時響
{
Buzzer(10);
if(P3_0==0||P3_1==0||P3_2==0||P3_3==0) N2min=0;//任意按鍵按下鬧鐘關閉
}
if(i==1)//時分秒<主界面>
{
NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);
if(P3_1==0)
{
Delay(20);while(P3_1==0);Delay(20);c=c+1;h=h+1;//按鍵1按下進入調時 c為調時位置 h為調時位置轉換
while(1)
{
if(P3_1==0) {Delay(20);while(P3_1==0);Delay(20);c=c+1;h=h+1;}//按鍵1按下計數調時
switch(c)
{
case 1://秒調時
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);sec=0;}
for(f=0;f<=50;f++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);}
for(g=0;g<=50;g++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,13);
NixieTube(6,13);
NixieTube(7,z);
NixieTube(8,week);}f=0;g=0;if(h==2) {h=0;}break;
case 2://分調時
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);min=min+1;}shijian();
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);min=min-1;}shijian();
for(f=0;f<=50;f++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);}
for(g=0;g<=50;g++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,13);
NixieTube(4,13);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);}f=0;g=0;if(h==1){ h=0;}break;
case 3://時調時
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);hour=hour+1;}shijian();
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);hour=hour-1;}shijian();
for(f=0;f<=50;f++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);}
for(g=0;g<=50;g++)
{ NixieTube(1,13);
NixieTube(2,13);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);}f=0;g=0;if(h==1){ h=0;}break;
case 4://星期調時
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);week=week+1;}shijian();
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);week=week-1;}shijian();
for(f=0;f<=50;f++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);}
for(g=0;g<=50;g++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,13);}f=0;g=0;if(h==1){ h=0;}break;
case 5://鬧鐘開關
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);p++;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);q++;}
if(p==1) z=10;//鬧鐘一標志位
if(p==2) z=13;
if(q==1) z=11;//鬧鐘二標志位
if(q==2) z=13;
//if(p==1&&q==1) z=12;
if(p>=3) p=1;
if(q>=3) q=1;
for(f=0;f<=50;f++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,z);
NixieTube(8,week);}
for(g=0;g<=50;g++)
{ NixieTube(1,hour/10);
NixieTube(2,hour%10);
NixieTube(3,min/10);
NixieTube(4,min%10);
NixieTube(5,sec/10);
NixieTube(6,sec%10);
NixieTube(7,13);
NixieTube(8,week);}f=0;g=0;if(h==1){ h=0;}break;
}
if(c>=6) c=1;//防溢出
if(P3_3==0) break;//退出死循環
}
}
}
if(i==2)//年月日顯示
{
NixieTube(1,year_1/10);
NixieTube(2,year_1%10);
NixieTube(3,year_2/10);
NixieTube(4,year_2%10);
NixieTube(5,month/10);
NixieTube(6,month%10);
NixieTube(7,day/10);
NixieTube(8,day%10);
if(P3_1==0)
{
Delay(20);while(P3_1==0);Delay(20);d=d+1;e=e+1;//年月日調節 d,e與c,h作用相同
while(1)
{
if(P3_1==0) {Delay(20);while(P3_1==0);Delay(20);d=d+1;e=e+1;}
switch(d)
{
case 1://年調時
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);year_2=year_2+1;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);year_2=year_2-1;}
for(f=0;f<=50;f++)
{ NixieTube(1,year_1/10);
NixieTube(2,year_1%10);
NixieTube(3,year_2/10);
NixieTube(4,year_2%10);
NixieTube(5,month/10);
NixieTube(6,month%10);
NixieTube(7,day/10);
NixieTube(8,day%10);}
for(g=0;g<=50;g++)
{ NixieTube(1,13);
NixieTube(2,13);
NixieTube(3,13);
NixieTube(4,13);
NixieTube(5,month/10);
NixieTube(6,month%10);
NixieTube(7,day/10);
NixieTube(8,day%10);}f=0;g=0;if(e==2) h=0;break;
case 2://月調時
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);month=month+1;}shijian();
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);month=month-1;}shijian();
for(f=0;f<=50;f++)
{ NixieTube(1,year_1/10);
NixieTube(2,year_1%10);
NixieTube(3,year_2/10);
NixieTube(4,year_2%10);
NixieTube(5,month/10);
NixieTube(6,month%10);
NixieTube(7,day/10);
NixieTube(8,day%10);}
for(g=0;g<=50;g++)
{ NixieTube(1,year_1/10);
NixieTube(2,year_1%10);
NixieTube(3,year_2/10);
NixieTube(4,year_2%10);
NixieTube(5,13);
NixieTube(6,13);
NixieTube(7,day/10);
NixieTube(8,day%10);}f=0;g=0;if(e==1) h=0;break;
case 3://日調時
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);day=day+1;}shijian();
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);day=day-1;}shijian();
for(f=0;f<=50;f++)
{ NixieTube(1,year_1/10);
NixieTube(2,year_1%10);
NixieTube(3,year_2/10);
NixieTube(4,year_2%10);
NixieTube(5,month/10);
NixieTube(6,month%10);
NixieTube(7,day/10);
NixieTube(8,day%10);}
for(g=0;g<=50;g++)
{ NixieTube(1,year_1/10);
NixieTube(2,year_1%10);
NixieTube(3,year_2/10);
NixieTube(4,year_2%10);
NixieTube(5,month/10);
NixieTube(6,month%10);
NixieTube(7,13);
NixieTube(8,13);}f=0;g=0;if(e==1) h=0;break;
}
if(d>=4) d=1;if(P3_3==0) break;
}
}
}
if(i==3)//鬧鐘顯示模塊
{
NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);
if(P3_1==0)
{
Delay(20);while(P3_1==0);Delay(20);k=k+1;l=l+1;
while(1)
{
if(P3_1==0) {Delay(20);while(P3_1==0);Delay(20);k=k+1;l=l+1;}//k,l與c,h作用相同
switch(k)
{
case 1://時鐘1調時
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);N1hour=N1hour+1;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);N1hour=N1hour-1;}
for(f=0;f<=50;f++)
{NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);}
for(g=0;g<=50;g++)
{NixieTube(1,13);
NixieTube(2,13);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);}f=0;g=0;if(l==2) l=0;break;
case 2://時鐘1調分
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);N1min=N1min+1;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);N1min=N1min-1;}
for(f=0;f<=50;f++)
{NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);}
for(f=0;f<=50;f++)
{NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,13);
NixieTube(4,13);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);}f=0;g=0;if(l==1) l=0;break;
case 3://時鐘2調時
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);N2hour=N2hour+1;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);N2hour=N2hour-1;}
for(f=0;f<=50;f++)
{NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);}
for(f=0;f<=50;f++)
{NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,13);
NixieTube(6,13);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);}f=0;g=0;if(l==1) l=0;break;
case 4://時鐘2調分
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);N2min=N2min+1;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);N2min=N2min-1;}
for(f=0;f<=50;f++)
{NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,N2min/10);
NixieTube(8,N2min%10);}
for(f=0;f<=50;f++)
{NixieTube(1,N1hour/10);
NixieTube(2,N1hour%10);
NixieTube(3,N1min/10);
NixieTube(4,N1min%10);
NixieTube(5,N2hour/10);
NixieTube(6,N2hour%10);
NixieTube(7,13);
NixieTube(8,13);}f=0;g=0;if(l==1) l=0;break;
}if(k>=5) k=1;if(P3_3==0) break;
}
}
}
}
}
void Timer0_Routine() interrupt 1 //中斷
{
TL0 = 0x00; //設置定時初值,讓定時器重新開始計時
TH0 = 0xDC; //設置定時初值
Timer0Count++; //每10ms打斷一次,計數器加1
if(Timer0Count>=100) //當計數器到100,即經過1秒后讓秒加一,然后時分做出響應變化
{
Timer0Count=0;
sec++;
if(sec>=60)
{
min++;
sec=0;
if(min>=60)
{
hour++;
min=0;
if(hour>=24)
{
day++;c++;
hour=0;
runnian();
if(day>=b)
{
month++;
day=1;
if(month>=13)
{
year++;
month=1;
}
}
}
}
}
if(c>=7)
{
week=week+1;
c=0;
if(week>=8)
{
week=1;
}
}
}
}
|