main.c

来自「51写的一个定时时钟」· C语言 代码 · 共 468 行

C
468
字号
 #include<reg52.h>
#include<LCD12864.H>

/****定义按键接口**************/
sbit Mode=P2^6;
sbit Add=P2^7;
sbit Dec=P1^5;
sbit Ent=P1^6;
sbit led1=P1^1; 
sbit led2=P1^0;
sbit led3=P1^4;
sbit SPK=P1^3;

unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5};	//星期月参变数

unsigned char cnt,counter,counter1;
 
unsigned char id,id1,word;

void Add_key1();
void Set_time(unsigned char sel,bit sel_1);
void Add_key2();
void Set_bell(unsigned char sel,bit sel_1);
bit leap_year();
unsigned char week_proc();

extern void Write_24c04( unsigned char add,unsigned char dat);
extern unsigned char Read_24C04(unsigned char add);

/*******************按键加一减一程序*******************/
void Add_key1()
  {
    if(Add==0)
	{
	  Delay12864(20);
	  if(Add==0)
	  { 
	    Set_time(id,0);
		while(Add==0);
		}
	  }
    if(Dec==0)
	{
	   Delay12864(20);
	   if(Dec==0)
	   {
	     Set_time(id,1);
		while(Dec==0);
		}
	  }
	}

 /***************设定时间**********/
void Set_time(unsigned char sel, bit sel_1) //根据选择调整相应项目并写入DS1302
{
  if(sel==1){
       if(sel_1==0){year++;if(year>99)year=0;}
	    else { year--;if(year==0)year=99;}}
  if(sel==2){
       if(sel_1==0){month++;  if(month>12)month=1;}
       else {month--;if(month==0)month=12;}}
   if(sel==3){
       if(sel_1==0){date++;if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
					if (date>31) date=1;			//大月31天
				if (month==4||month==6||month==9||month==11)		
				 	if (date>30) date=1;			//小月30天
				if (month==2)			
					{if(leap_year())				//闰年的条件
						{if (date>29) date=1;}		//闰年2月为29天
					 else
						{if (date>28) date=1;}}
						}		//平年2月为28天
	else {date--;if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
					if (date==0) date=31;			//大月31天
				if (month==4||month==6||month==9||month==11)		
				 	if (date==1) date=30;			//小月30天
				if (month==2)			
					{if(leap_year())				//闰年的条件
						{if (date==0) date=29;}		//闰年2月为29天
					 else
						{if (date==0) date=28;}}	//平年2月为28天
						   }
						}
	 if(sel==4){
	        if(sel_1==0){week++;if(week>7)week=1;}
			else{week--;if(week==0)week=7;}}
	if(sel==5){
	        if(sel_1==0){hour++;if(hour>23)hour=0;}
			else{hour--;if(hour==0)hour=23;}}
	if(sel==6){
	        if(sel_1==0){min++;if(min>59)min=0;}
			else{min--;if(min==0)min=59;}}
	if(sel==7){
	        if(sel_1==0){sec++;if(hour>59)sec=0;}
			else{sec--;if(sec==0)sec=59;}}
 // write_clock(0x8e,0x00);//允许写操作
 // write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
 // write_clock(0x8e,0x80);//写保护,禁止写操作 
  } 
/**************设定脑铃*******************/
/*******************按键加一减一程序*******************/
void Add_key2()
  {
    if(Add==0)
	{
	  Delay12864(20);
	  if(Add==0)
	  { 
	    Set_bell(id1,0);
		while(Add==0);
		}
	  }
    if(Dec==0)
	{
	   Delay12864(20);
	   if(Dec==0)
	   {
	     Set_bell(id1,1);
		while(Dec==0);
		}
	  }
	}

 /***************设定时间**********/
void Set_Bell(unsigned char sel, bit sel_1)//根据选择调整相应项目并写入24 
{
  signed char address,item;
  signed char max,mini;
  if(sel==7)  {address=0x0e; max=59;mini=0;}    //秒
  if(sel==6)  {address=0x0d; max=59;mini=0;}    //分
  if(sel==5)  {address=0x0c; max=23; mini=0;}   //时
  if(sel==4)  {address=0x0b; max=59;mini=0;}    //秒
  if(sel==3)  {address=0x0a; max=59;mini=0;}    //分
  if(sel==2)  {address=0x09; max=23; mini=0;}   //时
  if(sel==1)  
  {
  //	address=0x08;
	if(Add ==0 || Dec ==0)
	Bell_Swh=~Bell_Swh;
	Write_24c04(0x08,Bell_Swh);
  }    //开关

  item = Read_24C04(address);
  if(sel_1==0) 
  	item++;  
  else
  	item--;
  if(item>max) item=mini;   
  if(item<mini) item=max;

  Write_24c04(address,item);//写入24
}

  //闰年的计算
bit leap_year()
{
	bit leap;
	if((year%4==0&&year%100!=0)||year%400==0)//闰年的条件
		leap=1;
	else
		leap=0;
	return leap;
}

//星期的自动运算和处理
unsigned char week_proc()
{	unsigned char num_leap;	
	unsigned char c;
	num_leap=year/4-year/100+year/400;//自00年起到year所经历的闰年数
	if( leap_year()&& month<=2 )	  //既是闰年且是1月和2月	
		c=5;
	else 
		c=6;
	week=(year+para_month[month]+date+num_leap+c)%7;//计算对应的星期
	return week;
}
/******************做日期运算*****************/
//时间和日期处理程序
void pro_timedate()
{	
	sec++;
	if(sec > 59)
		{sec = 0;
		 min++;
		 if(min>59)
			{min=0;
			 hour++;
			 if(hour>23)
				{hour=0;
				 date++;
				 if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
					 if (date>31) {date=1;month++;}					//大月31天
				 if (month==4||month==6||month==9||month==11)		
				 	 if (date>30) {date=1;month++;}					//小月30天
				 if (month==2)			
					 {if( leap_year())								//闰年的条件
						{if (date>29) {date=1;month++;}}			//闰年2月为29天
					 else
						{if (date>28) {date=1;month++;}}			//平年2月为28天	
					 }				
				 if (month>12) {month=1;year++;}
				 if (year>99) year=0;
				}
			}
		}
	week_proc();
	 Write_24c04( 0x01,0);
 Write_24c04( 0x02,year);
 Write_24c04( 0x03,month);
 Write_24c04( 0x04,date);
 Write_24c04( 0x05,hour);
 Write_24c04( 0x06,min);
 Write_24c04( 0x07,sec);
				//闹钟启用时,报警时间到,启动Timer1
}
/********定时器0。做时钟用*****************/
void timer0() interrupt 1 using 0
{
  TH0=0x3c;
  TL0=0xb2;
  cnt++;
//	if((word==1)&&(Bell_Swh == 1))
//	{
//	  TR1=0;
//	  }
  if(cnt==20)
   {
     led1^=1;
     cnt=0;
    pro_timedate();
    }
  }
/********定时器0。做时钟用*****************/
void timer1() interrupt 3 using 0
{
	TH1=0x3c;				
	TL1=0xb0;
	counter1++;
	counter++;
 //  if(Bell_Swh == 1)counter1++;//闹钟为?
  if(counter==10)
  {
   counter=0;
    flag=~flag;
	}
//	 if(counter==20)
	// {
	//   counter=0;
//	SPK=~SPK;
 
				
}

 /*****初始化定时器***********/
 void Init_Timer()
 {
   TMOD=0x11;
  TH0=0x3c;
  TL0=0xb1;
  TH1 =0x3c;
  TL1 =0xb0;	
  TR0=1;
  TR1=1;
  ET0=1;
  ET1=1;
 //  EA=1;
 }
void main()
{
  unsigned char  p;
  unsigned char H_time,M_time,H_24C04,M_24C04,a;
  unsigned char H_time1,M_time1,H_24C02,M_24C02;
  //week=6;
  p=Read_24C04(0x01);
  year=Read_24C04(0x02);
  month=Read_24C04(0x03);
  date=Read_24C04(0x04);
  hour=Read_24C04(0x05);
  min=Read_24C04(0x06);
  sec=Read_24C04(0x07); 
  Bell_Swh = Read_24C04(0x08);//读取开关的状态

  Init_Timer();
  Init_lcd();
  Clr_Scr();
  Disp_Img(logo);
  Delay12864(60000);
  Delay12864(20000);
  Lcd_Mark();
  Delay12864(60000);
  Lcd_Mark1();
     EA=1;
  while(1)
  {
    led2=p;
   if(Dec==0&&Ent==0)
   {
    
     Delay12864(20);
      if(Dec==0&&Ent==0)
	  {
	    Lcd_Mark2();
		if(Bell_Swh == 0){Mcs=0;Scs=1;Disp_Chinese(2,32,guan);}//关
		else  {Mcs=0;Scs=1;Disp_Chinese(2,32,kai);}
		  while(1)
				{
				  if(Mode==0)
				  {
				    Delay12864(20);
					 if(Mode==0)
					 {
					   id1++;
					    if(id1>8)id1=0;
						while(Mode==0);
						}
					  }

                  switch(id1)
				  {
				   		case 0:Disp2();break;//正常显示
						case 1:Kgb = 1;Add_key2();Disp2();break;//开关
						case 2:Kgb= 0;Hour2=1;Add_key2();Disp2();break;//
						case 3:Hour2=0;Min2=1;Add_key2();Disp2();break;
						case 4:Min2=0;Sec2=1;Add_key2();Disp2();break;
						case 5:Sec2=0;Hour3=1;Add_key2();Disp2();break;//
						case 6:Hour3=0;Min3=1;Add_key2();Disp2();break;
						case 7:Min3=0;Sec3=1;Add_key2();Disp2();break;
						case 8:Sec3=0;id1 = 0;Lcd_Mark1();goto FF;break;//返回主界面
						default:break;
					}
				
				}
				 if(Ent==0)
				   {
				   Delay12864(20);
					 if(Ent==0)
					 {
	                 Lcd_Mark1();
						while(Ent==0);
						}
					  }
			 }
          }
   FF: 
   if(flag == 0)
		{
			Mcs=0;Scs=1;
			Disp_Digit(3,8,maohao);// :闪烁	
			Disp_Digit(3,32,maohao);
		}
		else 
		{
			Mcs=0;Scs=1;
			Disp_Digit(3,8,space);//显示空格
			Disp_Digit(3,32,space);	
		}
		if (Mode == 0) // 设置和选择项目键
      	{
       		 Delay12864(20);
       		if(Mode == 0)
			{
				id++;if(id>7)id=0;	
			}
       		while(Mode == 0);//等待键松开    
      	}
     	switch( id )
      	{
       		case 0:ET0=1;sec1 = 0;	Disp( );break;//正常显示
         	case 1:ET0=0;year1 = 1;Add_key1();Disp();break;//年	
			case 2:year1=0;month1=1;Add_key1();Disp();break;//月
            case 3:month1=0;day1=1;Add_key1();Disp();break;  //日 
         	case 4:day1=0;week1=1;Add_key1();Disp();break;//星期     
         	case 5:week1=0;hour1=1;Add_key1();Disp();break;  //小时
       		case 6:hour1=0;min1=1;Add_key1();Disp();break; //分钟
       		case 7:min1=0;sec1=1;Add_key1();Disp();break; //秒
         	default:break;	
          	}
		if(Bell_Swh == 1)//闹钟为开
		{
			H_24C04=Read_24C04(0x09);//读取2408的
			M_24C04=Read_24C04(0x0a);
			H_24C02=Read_24C04(0x0c);//读取2408的
			M_24C02=Read_24C04(0x0d);

			H_time=hour;
			M_time=min;

            H_time1=hour;
			M_time1=min;

			if(H_24C04 == H_time)  
		 	{
				if(M_24C04 == M_time)
				{       
                   
					Clr_Scr();//清屏
					frame();//显示边框
					Mcs=1;Scs=0;
					Disp_Chinese(3,16,nao);//闹钟显示时间到!
					Disp_Chinese(3,32,zhong);
					Disp_Chinese(3,48,shit);
					Mcs=0;Scs=1;
					Disp_Chinese(3,0,jian);
					Disp_Chinese(3,16,dao);
					Disp_Digit(3,40,fh);
			
					while(M_24C04 == M_time)//判断是否到闹钟设定时间
					{
                       for(a=0; a<100; a++)//BELL脉冲输出,驱动蜂鸣器
						{
							if(a<50){SPK = 0;Delay(100);}
							else {SPK = 1;Delay(100);}
						}
					  M_time=min;	
                    }
					Lcd_Mark1();
				}//if
			}
		  
		}//if
			if(Bell_Swh == 1)//闹钟为开
		{
		//	H_24C04=Read_24C04(0x09);//读取2408的
		//	M_24C04=Read_24C04(0x0a);
			H_24C02=Read_24C04(0x0c);//读取2408的
			M_24C02=Read_24C04(0x0d);

			H_time=hour;
			M_time=min;

            H_time1=hour;
			M_time1=min;

			if(H_24C02 == H_time1)  
		 	{
				if(M_24C02 == M_time1)
				{       
                   
					Clr_Scr();//清屏
					frame();//显示边框
					Mcs=1;Scs=0;
					Disp_Chinese(3,16,nao);//闹钟显示时间到!
					Disp_Chinese(3,32,zhong);
					Disp_Chinese(3,48,shit);
					Mcs=0;Scs=1;
					Disp_Chinese(3,0,jian);
					Disp_Chinese(3,16,dao);
					Disp_Digit(3,40,fh);
			
					while(M_24C02 == M_time1)//判断是否到闹钟设定时间
					{
                       for(a=0; a<100; a++)//BELL脉冲输出,驱动蜂鸣器
						{
							if(a<50){SPK = 0;Delay(100);}
							else {SPK = 1;Delay(100);}
						}
					  M_time1=min;	
                    }
					Lcd_Mark1();
				}//if
			}
		  
		}//if
		
	 }//while
    
  }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?