单片机 模拟电子闹钟 c语言,分享一个LCD1602电子闹钟 双闹版 带单片机源程序

该博客详细介绍了基于DS1302实时时钟、DS18B20温度传感器和LCD1602显示器的电子时钟设计,包括功能如闹钟设置、语音报时、周闹钟、温度显示等。还涉及到EEPROM存储、按键操作及延时函数的应用。
摘要由CSDN通过智能技术生成

/*******************************************************************************

*标题:                    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黑下载附件…………

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值