/*******************************************************************************
*标题: DS1302+DS18B20+LCD1602电子时钟 *
* *
********************************************************************************
* 添加闹钟时间记忆,闹铃时长,闹钟再响次数,间隔,周闹钟功能,语音整点报时 *
*
*
********************************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
#include "24c02.h"
#include "LCD1602.h"
#include "DS1302.h"
#include "DS18B20.h"
#include "yuyin.h"
sbit key1=P2^3; //调时钟和闹钟键
sbit key2=P2^2; //调时加键,正常走时状态语音报时键
sbit key3=P2^1; //调时减键,闹钟开关
sbit key4=P2^0; //查看闹铃键
sbit beep = P2^4; //蜂鸣器控制IO口
sbit led1 = P1^0; //LED灯,闹铃响标志
/******************************************************************/
/* 函数声明 */
/******************************************************************/
void Read_RTC(void);
void temp_to_str();
void keyscan();
bit ReadRTC_Flag,Display_Flag,Alarm_Flag,Alarm_Flag1,Aset_Flag,yuyin_flag,zd_baoshi,each,setzx=0; //定义标志位
uchar miao,fen,shi,ri,yue,week,nian,T,nz_flag,yuyin_shi,yuyin_ge,m=0,n=0,w=0,m1=0;
uchar set_miao,set_fen,set_shi,set_time,setzx_time,setzx_f,nz_miao,nz_fen,nz_shi,miao_ss;
char l_tmpdate[7]; //秒分时日月周年
uchar TempBuffer[5],nz_week[7];
uchar code write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位写位
uchar code read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //秒分时日月周年 最低位读位
uchar code nz_week_address[7]={0x10,0x11,0x12,0x13,0x14,0x15,0x16};
uchar code table1[]="SUN"; //星期字表
uchar code table2[]="MON";
uchar code table3[]="TUE";
uchar code table4[]="WED";
uchar code table5[]="THU";
uchar code table6[]="FRI";
uchar code table7[]="SAT";
uchar code tab1[]=" 20 - - ";
uchar code tab2[]=" : : ";
uchar code tab3[14]="Set Alarm! ";
uchar code tab4[16]="w:S M T W T F S ";
uchar code tab5[]=" *ON *OFF";
/******************************************************************/
/* 毫秒级延时函数 */
/******************************************************************/
void delay(uchar a)
{
uchar i;
while(a--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void delay1(uchar a)
{
uchar i;
while(a--)
{
for(i=0;i<5;i++)
{}
}
}
/********************************************/
/* 取出EEPROM时钟参数初始化函数 */
/*******************************************/
void Set_read()
{
uchar i,*p;
p=nz_week_address; //地址传递
for(i=0;i<7;i++) //分7次读取
{
nz_week[i]=Read24c02(*p);
p++;
}
set_miao=Read24c02(0x03);
set_fen=Read24c02(0x02);
set_shi=Read24c02(0x01);
set_time=Read24c02(0x05);
nz_flag=Read24c02(0x06);
setzx_time=Read24c02(0x07);
setzx_f=Read24c02(0x08);
zd_baoshi=Read24c02(0x09);
yuyin_flag=Read24c02(0x0a);
nz_miao=Read24c02(0x1a);
nz_fen=Read24c02(0x1b);
nz_shi=Read24c02(0x1c);
each=Read24c02(0x1d);
}
/**************************************************
初始化函数
***************************************************/
void init()
{
uchar i;
Alarm_Flag=0;
miao_ss=0;
led1=1;
TMOD=0x01; //设置定时器0为工作方式1(0000 0001)
TH0=(65536-50000)/256; //装初值50ms一次中断
TL0=(65536-50000)%256; //
IE=0x82; //开总中断,开定时器0中断
TR0=0;
write_lcd1602(0x80,0);
for(i=0;i<10;i++)
{
write_lcd1602(tab1[i],1);
}
write_lcd1602(0x80+0x40+1,0);
for(i=0;i<7;i++)
{
write_lcd1602(tab2[i],1);
}
}
/******************************************************************/
/* 温度数据转换 */
/******************************************************************/
void temp_to_str() //温度数据转换成液晶字符显示
{
/*TempBuffer[0]=temp_value/100%10+0x30; //十位
TempBuffer[1]=temp_value/10%10+0x30; //个位
TempBuffer[2]='.';
TempBuffer[3]=temp_value%10+0x30;
TempBuffer[4]=0xdf; //温度符号
*/
TempBuffer[0]=temp_value/100+0x30; //十位
TempBuffer[1]=temp_value%100/10+0x30; //个位
TempBuffer[2]='.';
TempBuffer[3]=temp_value%10+0x30;
TempBuffer[4]=0xdf; //温度符号
}
/******************************************************************/
/* 显示星期 */
/******************************************************************/
void write_week(uchar xq)
{
uchar x;
write_lcd1602(0x80+12,0);
switch(xq)
{
case 1:
for(x=0;x<3;x++)
{
write_lcd1602(table1[x],1);
}
break;
case 2:
for(x=0;x<3;x++)
{
write_lcd1602(table2[x],1);
}
break;
case 3:
for(x=0;x<3;x++)
{
write_lcd1602(table3[x],1);
}
break;
case 4:
for(x=0;x<3;x++)
{
write_lcd1602(table4[x],1);
}
break;
case 5:
for(x=0;x<3;x++)
{
write_lcd1602(table5[x],1);
}
break;
case 6:
for(x=0;x<3;x++)
{
write_lcd1602(table6[x],1);
}
break;
case 7:
for(x=0;x<3;x++)
{
write_lcd1602(table7[x],1);
}
break;
}
write_lcd1602(0x80+12,0);
}
/*****************************************************/
/* 显示闹钟1开关标志函数 */
/*****************************************************/
void a_lcd()
{
if(nz_flag==1)
{
write_lcd1602(0x80+0x40,0);
write_lcd1602('A',1);
}
else
{
write_lcd1602(0x80+0x40,0);
write_lcd1602(' ',1);
}
}
/*****************************************************/
/* 显示ON和OFF函数 */
/*****************************************************/
void on_off_lcd(uchar f)
{
uchar i;
write_lcd1602(0x80+0x40+10,0);
if(f==1)
{
for(i=0;i<6;i++)
{write_lcd1602(tab5[i],1); }
write_lcd1602(0x80+0x40+13,0);
}
else
{
for(i=5;i<11;i++)
{ write_lcd1602(tab5[i],1); }
write_lcd1602(0x80+0x40+13,0);
}
}
/******************************************************************/
/* 显示函数 */
/******************************************************************/
void display()
{
uchar i,ww;
Read_RTC();
write_sfm(8,miao);
write_sfm(5,fen);
write_sfm(2,shi);
write_nyr(3,nian);
write_nyr(6,yue);
write_nyr(9,ri);
write_week(week);
write_lcd1602(0x80+15,0);
if(setzx==1)
{write_lcd1602(0xf3,1);}
else
{
ww=nz_week[week-1];
if(ww==1)
{write_lcd1602(0xeb,1);}
else
{write_lcd1602(' ',1);}
}
a_lcd();
ReadTemp();
temp_to_str();
write_lcd1602(0x80+0x40+11,0);
for(i=0;i<5;i++)
{
write_lcd1602(TempBuffer[i],1);
}
}
/******************************************************************/
/* 读时钟数据 */
/******************************************************************/
void Read_RTC(void) //读取 日历
{
uchar i,*p;
p=read_rtc_address; //地址传递
for(i=0;i<7;i++) //分7次读取 秒分时日月周年
{
l_tmpdate[i]=Read_Ds1302(*p);
p++;
miao=((l_tmpdate[0]&0x70)>>4)*10 + (l_tmpdate[0]&0x0f);
fen =((l_tmpdate[1]&0x70)>>4)*10 + (l_tmpdate[1]&0x0f);
shi =((l_tmpdate[2]&0x70)>>4)*10 + (l_tmpdate[2]&0x0f);
ri =((l_tmpdate[3]&0x70)>>4)*10 + (l_tmpdate[3]&0x0f);
yue =((l_tmpdate[4]&0x70)>>4)*10 + (l_tmpdate[4]&0x0f);
week=((l_tmpdate[5]&0x70)>>4)*10 + (l_tmpdate[5]&0x0f);
nian=((l_tmpdate[6]&0x70)>>4)*10 + (l_tmpdate[6]&0x0f);
}
}
/******************************************************************/
/* 蜂鸣器发声函数 */
/******************************************************************/
void di()
{
uchar i;
while(key1==0||key2==0||key3==0||key4==0)
{
for(i=0;i<50;i++)
{
delay1(4);
beep=~beep;
}
}
}
/******************/
void Abeep()
{
uchar i;
for(i=0;i<250;i++)
{
delay1(4);
beep=~beep;
led1=~led1;
}
delay(50);
for(i=0;i<250;i++)
{
delay1(4);
beep=~beep;
led1=~led1;
}
delay(50);
for(i=0;i<250;i++)
{
delay1(4);
beep=~beep;
led1=~led1;
}
}
/*********************返回正常计时状态程序******************************/
void R_normal()
{
uchar i;
TR0=0;
miao_ss=0;
ReadRTC_Flag=0;
Display_Flag=0;
Aset_Flag=0;
n=0;
write_lcd1602(0x0c,0);
if(m!=0||m1!=0||w!=0)
{
m=0;
m1=0;
w=0;
write_lcd1602(0x80,0); //清掉Set Alarm
for(i=0;i<12;i++)
{
write_lcd1602(tab1[i],1);
}
write_lcd1602(0x80+0x40+1,0);
for(i=0;i<10;i++)
{
write_lcd1602(tab2[i],1);
}
}
display();
}
/******************************************************************/
/* 闹钟函数 */
/******************************************************************/
void alarm()
{
uchar tmp,temp;
if((nz_week[week-1]==1)&&(shi==set_shi)&&(fen==set_fen)&&(miao==set_miao))
{
//Read_RTC();
R_normal();
tmp=set_time+fen; //计算响铃分钟数
if(tmp>=60)
{tmp=tmp%60;}
Alarm_Flag=1; //闹铃响标志位
setzx=1;
led1=0;
if(yuyin_flag==1)
baoshi(shi,fen,week,0); //语音报当前时间
while(Alarm_Flag)
{
Abeep();
delay(500);
Read_RTC(); //边响边走时
display();
keyscan();
if(tmp==fen)
{
Alarm_Flag=0;
setzx_f--; //响铃次数减一次
if(setzx_f!=0)
{
temp=setzx_time+fen;
if(temp>=60)
{
temp=temp%60;
set_shi++;
if(set_shi>23)
{set_shi=0;}
}
set_fen=temp;
led1=0;
if(yuyin_flag==1)
baoshi(shi,fen,week,0); //语音报当前时间
}
else
{
setzx=0;
led1=1;
set_fen=Read24c02(0x02);
set_shi=Read24c02(0x01);
setzx_f=Read24c02(0x08);
if(yuyin_flag==1)
baoshi(shi,fen,week,0); //语音报当前时间
}
}
}
}
}
/******************************************************************/
/* 闹钟1函数 */
/******************************************************************/
void alarm1()
{
uchar tmp,temp;
if((nz_flag==1)&&(shi==nz_shi)&&(fen==nz_fen)&&(miao==nz_miao))
{
//Read_RTC();
R_normal();
tmp=set_time+fen; //计算响铃分钟数
if(tmp>=60)
{tmp=tmp%60;}
Alarm_Flag1=1; //闹铃响标志位
setzx=1;
led1=0;
if(yuyin_flag==1)
baoshi(shi,fen,week,0); //语音报当前时间
while(Alarm_Flag1)
{
Abeep();
delay(500);
Read_RTC(); //边响边走时
display();
keyscan();
if(tmp==fen)
{
Alarm_Flag1=0;
setzx_f--; //响铃次数减一次
if(setzx_f!=0)
{
temp=setzx_time+fen;
if(temp>=60)
{
temp=temp%60;
nz_shi++;
if(nz_shi>23)
{nz_shi=0;}
}
nz_fen=temp;
led1=0;
if(yuyin_flag==1)
baoshi(shi,fen,week,0); //语音报当前时间
}
else
{
setzx=0;
led1=1;
nz_fen=Read24c02(0x1b);
nz_shi=Read24c02(0x1c);
setzx_f=Read24c02(0x08);
if(each==0)
nz_flag=0;
if(yuyin_flag==1)
baoshi(shi,fen,week,0); //语音报当前时间
}
}
}
/* tmp=fen+5; //响铃x分钟
if(tmp>=60)
{tmp=tmp%60;}
Alarm_Flag1=1; //闹铃响标志位
led1=0;
if(yuyin_flag==1)
baoshi(shi,fen,week,0); //语音报闹钟时间
while(Alarm_Flag1)
{
Abeep();
delay(500);
Read_RTC(); //边响边走时
display();
keyscan();
if(tmp==fen)
{
Alarm_Flag1=0;
led1=1;
if(each==0)
nz_flag=0;
if(yuyin_flag==1)
baoshi(shi,fen,week,0); //语音报闹钟时间
}
} */
}
}
/******************************************************************/
/* 键盘扫描函数 */
/******************************************************************/
void keyscan()
{
uchar i,temp;
if(Alarm_Flag==0&&Alarm_Flag1==0&&setzx==0)
{
if(key1==0) //调时功能键
{
delay(9);
if(key1==0)
{
di();
while(!key1); //松手检测
miao_ss=0;
if(Display_Flag==0&&m==0&&w==0&&m1==0)
{
++n;
Aset_Flag=1; //屏蔽调闹铃功能键,进入调时功能
ReadRTC_Flag=1; //停止走时
switch(n)
{
case 1: on_off_lcd(zd_baoshi); //按一次功能键闪烁
write_lcd1602(0x0f,0);
break;
case 2: write_lcd1602(0x80+0x40+9,0); //按两次功能键秒闪烁
//Write_Ds1302(0x8e,0x00); //允许写,禁止写保护
//Write_Ds1302(0x80,((miao/10)*16+miao%10)); //写入DS1302秒位
//Write_Ds1302(0x8e,0x80); //打开写保护
break;
case 3: write_lcd1602(0x80+0x40+6,0); //按三次功能键分闪烁
break;
case 4: write_lcd1602(0x80+0x40+3,0); //按四次功能键时闪烁
break;
case 5: write_lcd1602(0x80+10,0); //按五次功能键日闪烁
break;
case 6: write_lcd1602(0x80+7,0); //按六次功能键月闪烁
break;
case 7:write_lcd1602(0x80+4,0); //按七次功能键年闪烁
break;
case 8: write_lcd1602(0x80+12,0); //按八次功能键周闪烁
break;
case 9: TR0=0; //按九次功能键开始走时,停止闪烁
n=0;
ReadRTC_Flag=0;
Aset_Flag=0;
write_lcd1602(0x0c,0);
Write_Ds1302(0x8e,0x00);
Write_Ds1302(0x80,((miao/10)*16+miao%10));
Write_Ds1302(0x82,((fen/10)*16+fen%10));
Write_Ds1302(0x84,((shi/10)*16+shi%10));
Write_Ds1302(0x8e,0x80);
break;
}
}
else
{
if(n==0&&w==0&&m1==0&&m>0)
{
m++;
Alarm_Flag=0; //初始化闹铃标志位,闹铃不响
Alarm_Flag1=0;
switch(m)
{ case 2: write_lcd1602(0x80+0x40+9,0); //开始设定闹铃,秒位闪烁可调
write_lcd1602(0x0f,0);
break;
case 3: write_lcd1602(0x80+0x40+6,0); //分位闪烁可调
break;
case 4: write_lcd1602(0x80+0x40+3,0); //时位闪烁可调
break;
case 5: write_lcd1602(0x80+0x40+14,0); //
break;
case 6: write_lcd1602(0x80+15,0); //
break;
case 7: write_lcd1602(0x80+12,0); //
break;
case 8: write_lcd1602(0x80+0x40+11,0); //
break;
case 9:R_normal();
// display(); //返回时间显示
break;
}
}
else
if(n==0&&m==0&&m1==0&&w>0)
{
w++;
Alarm_Flag=0; //初始化闹铃标志位,闹铃不响
Alarm_Flag1=0;
switch(w)
{ case 2: write_lcd1602(0x80+0x40+2,0);
write_lcd1602(0x0f,0); //开始闪烁
break;
case 3: write_lcd1602(0x80+0x40+4,0);
break;
case 4: write_lcd1602(0x80+0x40+6,0);
break;
case 5: write_lcd1602(0x80+0x40+8,0); //
break;
case 6: write_lcd1602(0x80+0x40+10,0); //
break;
case 7: write_lcd1602(0x80+0x40+12,0); //
break;
case 8: write_lcd1602(0x80+0x40+14,0); //
break;
case 9: R_normal();
break;
}
}
else
{
if(n==0&&m==0&&w==0&&m1>0)
{
m1++;
Alarm_Flag=0; //初始化闹铃标志位,闹铃不响
Alarm_Flag1=0;
switch(m1)
{ case 2: write_lcd1602(0x80+0x40+9,0); //开始设定闹铃,秒位闪烁可调
write_lcd1602(0x0f,0);
break;
case 3: write_lcd1602(0x80+0x40+6,0); //分位闪烁可调
break;
case 4: write_lcd1602(0x80+0x40+3,0); //时位闪烁可调
break;
case 5: on_off_lcd(each); //
break;
case 6:
nz_flag=1; //开启闹钟检测
R_normal();
break;
}
}
}
}
}
}
}
if(Alarm_Flag==0&&Alarm_Flag1==0&&setzx==0)
{ if(key4==0) //闹铃功能键
{
delay(9);
if(key4==0)
{
di();
while(!key4);
if(Aset_Flag==0) //不是调时钟状态就可以进入调闹钟
{
miao_ss=0;
if(m1==0)
{
if(w==0)
{
m++;
if(m>1)
{m=9;}
Display_Flag=1; //屏蔽调时功能键,进入调闹铃功能
switch(m)
{
case 1: n=0;
ReadRTC_Flag=0; //开显示
write_lcd1602(0x0c,0); //停止闪烁
Write_Ds1302(0x8e,0x00);
Write_Ds1302(0x80,((miao/10)*16+miao%10));
Write_Ds1302(0x8e,0x80);
write_lcd1602(0x80,0); //首行写入Set Alarm!
write_lcd1602('w',1);
write_lcd1602(':',1);
// write_lcd1602(' ',1);
for(i=3;i<12;i++)
{
write_lcd1602(tab3[i],1);
}
write_lcd1602(setzx_f/10+'0',1);
write_lcd1602(setzx_f%10+'0',1);
write_lcd1602(0xde,1);
write_lcd1602(setzx_time/10+'0',1);
write_lcd1602(setzx_time%10+'0',1);
write_lcd1602(0x80+0x40,0); //第二行写入设定的时间
write_lcd1602('*',1);
for(i=0;i<7;i++)
{
write_lcd1602(tab2[i],1);
}
write_lcd1602(0x80+0x40+8,0);
write_lcd1602(set_miao/10+'0',1);
write_lcd1602(set_miao%10+'0',1);
write_lcd1602(0x80+0x40+5,0);
write_lcd1602(set_fen/10+'0',1);
write_lcd1602(set_fen%10+'0',1);
write_lcd1602(0x80+0x40+2,0);
write_lcd1602(set_shi/10+'0',1);
write_lcd1602(set_shi%10+'0',1);
write_lcd1602(0x80+0x40+11,0);
if(yuyin_flag==1)
{write_lcd1602('V',1);}
else
{write_lcd1602('_',1);}
write_lcd1602(' ',1);
write_lcd1602(set_time/10+'0',1);
write_lcd1602(set_time%10+'0',1);
write_lcd1602('m',1);
break;
case 9:
m=0; //关闭更更改闹铃时间
w=1; //
write_lcd1602(0x0c,0); //停止闪烁
write_lcd1602(0x80,0); //首行写入星期表
for(i=0;i<16;i++)
{
write_lcd1602(tab4[i],1);
}
write_lcd1602(0x80+0x40,0);
write_lcd1602('*',1);
write_lcd1602(':',1);
write_lcd1602(nz_week[0]+'0',1);
write_lcd1602(' ',1);
write_lcd1602(nz_week[1]+'0',1);
write_lcd1602(' ',1);
write_lcd1602(nz_week[2]+'0',1);
write_lcd1602(' ',1);
write_lcd1602(nz_week[3]+'0',1);
write_lcd1602(' ',1);
write_lcd1602(nz_week[4]+'0',1);
write_lcd1602(' ',1);
write_lcd1602(nz_week[5]+'0',1);
write_lcd1602(' ',1);
write_lcd1602(nz_week[6]+'0',1);
write_lcd1602(' ',1);
break;
}
}
else
{
w=0;
m1=1;
write_lcd1602(0x0c,0); //停止闪烁
write_lcd1602(0x80,0); //首行写入Set Alarm!
for(i=0;i<11;i++)
{
write_lcd1602(tab3[i],1);
}
write_lcd1602('E',1);
write_lcd1602('.',1);
write_lcd1602('d',1);
write_lcd1602('a',1);
write_lcd1602('y',1);
write_lcd1602(0x80+0x40,0); //第二行写入设定的时间
write_lcd1602(' ',1);
for(i=0;i<7;i++)
{
write_lcd1602(tab2[i],1);
}
write_lcd1602(0x80+0x40+8,0);
write_lcd1602(nz_miao/10+'0',1);
write_lcd1602(nz_miao%10+'0',1);
on_off_lcd(each);
write_lcd1602(0x80+0x40+5,0);
write_lcd1602(nz_fen/10+'0',1);
write_lcd1602(nz_fen%10+'0',1);
write_lcd1602(0x80+0x40+2,0);
write_lcd1602(nz_shi/10+'0',1);
write_lcd1602(nz_shi%10+'0',1);
a_lcd();
}
}
else
{
R_normal();
// display(); //返回时间显示*/
}
}
else
R_normal();
}
}
}
if(n!=0||m>1||m1>1||w>1) //功能加键
{
if(key2==0)
{
delay(9);
if(key2==0)
{
di();
while(!key2);
miao_ss=0;
if(Display_Flag==0)
{
switch(n)
{
case 1:zd_baoshi=~zd_baoshi;
Write24c02(0x09,zd_baoshi);
on_off_lcd(zd_baoshi);
break;
case 2: miao++;
if(miao==60)
miao=0;
write_lcd1602(0x80+0x40+8,0); //使LCD1602在秒位上显示“加”设好的秒数
write_lcd1602((miao/10)+'0',1); //十进制转换成LCD1602能显示的字符,显示出来
write_lcd1602((miao%10)+'0',1);
T=(miao/10)*16+(miao%10); //十进制转换成DS1302能写的BCD码
Write_Ds1302(0x8e,0x00); //允许写,禁止写保护
Write_Ds1302(0x80,T); //写入DS1302
Write_Ds1302(0x8e,0x80); //打开写保护
//Read_RTC();
write_lcd1602(0x80+0x40+9,0); //写完数据后光标自动右移,所以要归位
break;
case 3: fen++;
if(fen==60)
fen=0;
write_lcd1602(0x80+0x40+5,0);
write_lcd1602((fen/10)+'0',1);
write_lcd1602((fen%10)+'0',1);
T=(fen/10)*16+(fen%10);
Write_Ds1302(0x8e,0x00);
Write_Ds1302(0x82,T);
Write_Ds1302(0x8e,0x80);
write_lcd1602(0x80+0x40+6,0);
break;
case 4: shi++;
if(shi==24)
shi=0;
write_lcd1602(0x80+0x40+2,0);
write_lcd1602((shi/10)+'0',1);
write_lcd1602((shi%10)+'0',1);
T=(shi/10)*16+(shi%10);
Write_Ds1302(0x8e,0x00);
Write_Ds1302(0x84,T);
Write_Ds1302(0x8e,0x80);
write_lcd1602(0x80+0x40+3,0);
break;
case 5: ri++;
if(ri==32)
ri=1;
write_lcd1602(0x80+9,0);
write_lcd1602((ri/10)+'0',1);
write_lcd1602((ri%10)+'0',1);
T=(ri/10)*16+(ri%10);
Write_Ds1302(0x8e,0x00);
Write_Ds1302(0x86,T);
Write_Ds1302(0x8e,0x80);
write_lcd1602(0x80+10,0);
break;
case 6: yue++;
if(yue==13)
yue=1;
write_lcd1602(0x80+6,0);
write_lcd1602((yue/10)+'0',1);
write_lcd1602((yue%10)+'0',1);
T=(yue/10)*16+(yue%10);
Write_Ds1302(0x8e,0x00);
Write_Ds1302(0x88,T);
Write_Ds1302(0x8e,0x80);
write_lcd1602(0x80+7,0);
break;
case 7: nian++;
if(nian==100)
nian=0;
write_lcd1602(0x80+3,0);
write_lcd1602((nian/10)+'0',1);
write_lcd1602((nian%10)+'0',1);
T=(nian/10)*16+(nian%10);
Write_Ds1302(0x8e,0x00);
Write_Ds1302(0x8c,T);
Write_Ds1302(0x8e,0x80);
write_lcd1602(0x80+4,0);
break;
case 8: week++;
if(week==8)
week=1;
write_week(week);
T=(week/10)*16+(week%10);
Write_Ds1302(0x8e,0x00);
Write_Ds1302(0x8a,T);
Write_Ds1302(0x8e,0x80);
break;
}
}
else
if(w==0&&m1==0&&m>1)
{
switch(m)
{
case 2: set_miao++; //闹钟秒加1
if(set_miao==60)
set_miao=0;
write_lcd1602(0x80+0x40+8,0);
write_lcd1602(set_miao/10+'0',1);
write_lcd1602(set_miao%10+'0',1);
write_lcd1602(0x80+0x40+9,0);
Write24c02(0x03,set_miao);
break;
case 3: set_fen++; //闹钟分加1
if(set_fen==60)
set_fen=0;
write_lcd1602(0x80+0x40+5,0);
write_lcd1602(set_fen/10+'0',1);
write_lcd1602(set_fen%10+'0',1);
write_lcd1602(0x80+0x40+6,0);
Write24c02(0x02,set_fen);
break;
case 4: set_shi++; //闹钟时加1
if(set_shi==24)
set_shi=0;
write_lcd1602(0x80+0x40+2,0);
write_lcd1602(set_shi/10+'0',1);
write_lcd1602(set_shi%10+'0',1);
write_lcd1602(0x80+0x40+3,0);
Write24c02(0x01,set_shi);
break;
case 5: set_time++; //闹钟响铃时长
if(set_time==31)
set_time=1;
write_lcd1602(0x80+0x40+13,0);
write_lcd1602(set_time/10+'0',1);
write_lcd1602(set_time%10+'0',1);
write_lcd1602(0x80+0x40+14,0);
Write24c02(0x05,set_time);
break;
case 6: setzx_time++; //闹钟再响间隔
if(setzx_time==31)
setzx_time=1;
write_lcd1602(0x80+14,0);
write_lcd1602(setzx_time/10+'0',1);
write_lcd1602(setzx_time%10+'0',1);
write_lcd1602(0x80+15,0);
Write24c02(0x07,setzx_time);
break;
case 7: setzx_f++; //闹钟响铃次数
if(setzx_f==11)
setzx_f=1;
write_lcd1602(0x80+11,0);
write_lcd1602(setzx_f/10+'0',1);
write_lcd1602(setzx_f%10+'0',1);
write_lcd1602(0x80+12,0);
Write24c02(0x08,setzx_f);
break;
case 8: yuyin_flag=~yuyin_flag;
write_lcd1602(0x80+0x40+11,0);
if(yuyin_flag==1)
{write_lcd1602('V',1);}
else
{write_lcd1602('_',1);}
write_lcd1602(0x80+0x40+11,0);
Write24c02(0x0a,yuyin_flag);
break;
}
}
else
if(m==0&&m1==0&&w>1)
{
switch(w)
{
case 2: //星期日闹钟开关,1为开
nz_week[0]=1;
write_lcd1602(0x80+0x40+2,0);
write_lcd1602(nz_week[0]+'0',1);
write_lcd1602(0x80+0x40+2,0);
Write24c02(0x10,nz_week[0]);
break;
case 3: //星期一闹钟开关
nz_week[1]=1;
write_lcd1602(0x80+0x40+4,0);
write_lcd1602(nz_week[1]+'0',1);
write_lcd1602(0x80+0x40+4,0);
Write24c02(0x11,nz_week[1]);
break;
case 4: //星期二闹钟开关
nz_week[2]=1;
write_lcd1602(0x80+0x40+6,0);
write_lcd1602(nz_week[2]+'0',1);
write_lcd1602(0x80+0x40+6,0);
Write24c02(0x12,nz_week[2]);
break;
case 5: //星期三闹钟开关
nz_week[3]=1;
write_lcd1602(0x80+0x40+8,0);
write_lcd1602(nz_week[3]+'0',1);
write_lcd1602(0x80+0x40+8,0);
Write24c02(0x13,nz_week[3]);
break;
case 6: //星期四闹钟开关
nz_week[4]=1;
write_lcd1602(0x80+0x40+10,0);
write_lcd1602(nz_week[4]+'0',1);
write_lcd1602(0x80+0x40+10,0);
Write24c02(0x14,nz_week[4]);
break;
case 7: //星期五闹钟开关
nz_week[5]=1;
write_lcd1602(0x80+0x40+12,0);
write_lcd1602(nz_week[5]+'0',1);
write_lcd1602(0x80+0x40+12,0);
Write24c02(0x15,nz_week[5]);
break;
case 8: //星期六闹钟开关
…………限于本文篇幅 余下代码请从51黑下载附件…………