for(j=0;j<150;j++);
}
voidshow(intx,inty)
{
P2=~bit(x);
P0=a[y];
delay
(1);
}
//时间
////////////////////////////////////////////////////////////////////////////////////////////////////////
//写
voidDS1302_wr(ucharaddr,uchardat)//addr:
DS1302地址,dat要写的数据
{
unsignedchari,temp;
RST=0;
CLK=0;
RST=1;
//ACC=addr;
//地址,命令
for(i=8;i>0;i--)
{CLK=0;
temp=addr;
DIO=(bit)(temp&0x01);
addr=addr>>1;
CLK=1;
}
for(i=8;i>0;i--)
{
CLK=0;
temp=dat;
DIO=(bit)(temp&0x01);
dat>>=1;
CLK=1;
}
RST=0;
}
//读
unsignedcharDS1302_rd(unsignedcharaddr)
{
unsignedchari,temp,dat1,dat2;
RST=0;
CLK=0;
RST=1;
//地址,命令
for(i=8;i>0;i--)
{
CLK=0;
temp=addr;
DIO=(bit)(temp&0x01);
addr>>=1;
CLK=1;
}
for(i=8;i>0;i--)
{
ACC7=DIO;
CLK=1;
ACC>>=1;
CLK=0;
}
RST=0;
dat1=ACC;
dat2=dat1/16;
dat1=dat1%16;
dat1=dat1+dat2*10;
return(dat1);
}
voidintial(void)//ds1302初始化
{
DS1302_wr(write_protect,0x00);
//DS1302_wr(wr_second,0x56);
//DS1302_wr(wr_minute,0x34);
//DS1302_wr(wr_hour,0x12);
//DS1302_wr(wr_day,0x07);
//DS1302_wr(wr_month,0x12);
//DS1302_wr(wr_year,0x11);
//DS1302_wr(write_protect,0x80);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
voidshow_b()//时间日期数码管显示数
{
//uchari;
b[0]=s%10;
b[1]=s/10;
b[2]=m%10;
b[3]=m/10;
b[4]=h%10;
b[5]=h/10;
//
b[6]=day%10;
b[7]=day/10;
b[8]=mon%10;
b[9]=mon/10;
b[10]=year%10;
b[11]=year/10;
}
voidshow_time()//显示时间函数
{
show_b();
show(0,b[0]);
show(1,b[1]);
show(2,10);
show(3,b[2]);
show(4,b[3]);
show(5,10);
show(6,b[4]);
show(7,b[5]);
}
voidshow_day()//显示日期函数
{
show_b();
show(0,b[6]);
show(1,b[7]);
show(2,b[8]);
show(3,b[9]);
show(4,b[10]);
show(5,b[11]);
show(6,0);
show(7,2);
}
/////////////////////////////////////////////////////////////////////////////////////
voidddd(void)//从ds1302读出时、分、秒及日期
{
s=DS1302_rd(rd_second);
m=DS1302_rd(rd_minute);
h=DS1302_rd(rd_hour);
day=DS1302_rd(rd_day);
mon=DS1302_rd(rd_month);
year=DS1302_rd(rd_year);
}
//////////////////////////////////////////////////////////////////////////////////////
voidint_init(void)//开中断
{
EA=1;//全局中断开
EX0=1;//外部中断0开
EX1=1;//外部中断1开
IT0=1;//边沿触发,为0则为低电平触发
IT1=1;//边沿触发,为0则为低电平触发
ET1=1;//计数器1开
}
voidinit_time()//中断初始化
{
TMOD=0x10;
TR1=1;//TCON
}
/////////
/*voidint0_Key()interrupt0using1
{
u++;//q功能键转化
}*/
voidfictions()
{
if(fiction==0)
{
while(fiction==0);
q++;
}
}
voidint1_Key()interrupt2using2
{
clock=0;//关闹钟
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
voidclock_out()//闹钟程序
{
while(clock)
{
Speak=1;
delay
(1);
Speak=0;
delay
(1);
}
}
voidmove()//调小数点
{
if(left==0)
{
while(left==0);
c++;
if(c==7)c=-1;
}
}
voidmove_time()//调时间
{
move();
if(up==0)
{
uchara;
while(up==0);
switch(c)
{
//case-1:
break;
case0:
a=s%10+s/10*16;
a=a+0x01;
if(a>=96)
a=a-0x60;
DS1302_wr(wr_second,a);break;
case1:
a=s%10+s/10*16;
a=a+0x10;
if(a>=96)
a=a-0x60;
DS1302_wr(wr_second,a);break;
//case2:
break;
case3:
a=m%10+m/10*16;
a=a+0x01;
if(a>=96)
a=a-0x60;
DS1302_wr(wr_minute,a);break;
case4:
a=m%10+m/10*16;
a=a+0x10;
if(a>=96)
a=a-0x60;
DS1302_wr(wr_minute,a);break;
//case5:
break;
case6:
a=h%10+h/10*16;
a=a+0x01;
if(a>=36)
a=0x00;
DS1302_wr(wr_hour,a);break;
/*case7:
a=h%10+h/10*16;
a=a+0x10;
if((a&0xf0)>=32)
a=0x00+b[4];
DS1302_wr(wr_hour,a);break;*/
default:
break;
}
}
show_time();
}
voidmove_day()//调日期
{
move();
if(up==0)
{
uchara;
while(up==0);
switch(c)
{
//case-1:
break;
case0:
a=day%10+day/10*16;
a=a+0x01;
if(a>49)
a=0x01;
DS1302_wr(wr_day,a);break;
case1:
/*a=day%10+day/10*16;
a=a+0x10;
if(a>=65)
a=a-0x30;
DS1302_wr(wr_day,a);break;*/
c=c+1;
case2:
a=mon%10+mon/10*16;
a=a+0x01;
if(a>18)
a=0x01;
DS1302_wr(wr_month,a);break;
case3:
/*a=mon%10+mon/10*16;
a=a+0x10;
if(a>=34)
a=a-0x10;
DS1302_wr(wr_month,a);break;*/
c=c+1;
case4:
a=year%10+year/10*16;
a=a+0x01;
if(a>153)
a=0x00;
DS1302_wr(wr_year,a);break;
case5:
a=year%10+year/10*16;
a=a+0x10;
if(a>153)
a=a-0x90;
DS1302_wr(wr_year,a);break;
/*case7:
a=h%10+h/10*16;
a=a+0x10;
if((a&0xf0)>=32)
a=0x00+b[4];
DS1302_wr(wr_hour,a);break;*/
default:
break;
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
voidshow_naozhong()
{
show(0,d[0]);
show(1,d[1]);
show(2,10);
show(3,d[2]);
show(4,d[3]);
show(5,10);
show(6,d[4]);
show(7,d[5]);
}
voidmove_naozhong()
{
move();
if(up==0)
{
while(up==0);
switch(c)
{
//case-1:
break;
case0:
d[0]++;
if(d[0]==10)d[0]=0;break;
case1:
d[1]++;
if(d[1]>=6)d[1]=0;break;
//case2:
break;
case3:
d[2]++;
if(d[2]==10)d[2]=0;break;
case4:
d[3]++;
if(d[3]>=6)d[3]=0;break;
//case5:
break;
case6:
d[4]++;
if(d[4]==10)
{
d[4]=0;
d[5]++;
}
break;
default:
break;
}
}
}
ucharcounter=0;
voidinit_inttime()interrupt3
{
TH1=0xfc;
TL1=0x0B;
counter++;
if(counter==10)
{
counter=0;
e[0]++;
if(e[0]==10)
{
e[0]=0;
e[1]++;
if(e[1]==10)
{
e[1]=0;
e[2]++;
if(e[2]==10)
{
e[2]=0;
e[3]++;
if(e[3]==6)
e[3]=0;
}
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
unsignedcharcodeSONG[]={//祝你平安
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,
};
voidTime0_Init()
{
TMOD=0x01;
IE=0x82;
TH0=0xDC;
TL0=0x00;
}
voidTime0_Int()interrupt1
{
TH0=0xDC;
TL0=0x00;
Count++;//长度加1
}
voidDelay_xMs(uintx)
{
uinti,j;
for(i=0;i{
for(j=0;j<3;j++);
}
}
voidPlay_Song(uchari)
{
ucharTemp1,Temp2;
uintAddr;
Count=0;//中断计数器清0
Addr=i;
while(u)
{
Temp1=SONG[Addr++];
if(Temp1==0xFF)//休止符
{
TR0=0;//停止计数
Delay_xMs(100);
}
elseif(Temp1==0x00)//歌曲结束符
{
u=0;
}
else
{
Temp2=SONG[Addr++];
TR0=1;
while
(1)
{
Speak=~Speak;
Delay_xMs(Temp1);
if(Temp2==Count)
{
Count=0;
break;
}
}
}
}
}
voidchange()
{
if(yinyue==0)
{
while(yinyue==0);
u++;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
voidmain()
{
intial();
int_init();
while
(1)
{
ddd();//显示时间
if(q%3==0)
{
show_time();
move_time();
}
if(q%3==1)//显示日期
{
show_day();
move_day();
}
if(q%3==2)//闹钟调试
{
show_naozhong();
move_naozhong();
}
if(u%2==1)//音乐功能
{
Time0_Init();//定时器0中断初始化
Play_Song(0);//为祝你平安
}
show(c,11);//小数点显示
fictions();//功能键扫描
change();
if(h==(d[5]*10+d[4])&&m==(d[3]*10+d[2])&&s==(d[1]*10+d[0]))clock=1;
clock_out();
}
}