⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sub_program.c

📁 用单片机制作电子时钟,lcd1602显示,包括模拟电路图,源码,以及编译过程等
💻 C
字号:
#include "REGX52.H "
#include "LCD1602.h"
#include "DS1302.h"

					 
/*sbit H      = P1^0;	   //0x0e
sbit updown = P1^1;	   //0x0d
sbit choose = P1^2;	   //0x0b
sbit enter  = P1^3;	   //0x07	  
sbit buzzer = P1^4;				  */
	   		 

       unsigned char lcdmenu=1,resetflag=1; 
static unsigned char keyflag=0;	 
       bit lcdflag=0;
	   bit time_on=0;
	   bit Alarm_on=0;
       unsigned char keycode;
       unsigned char oldcode,keyt;
	   unsigned char station;
static unsigned char jj;
static  SYSTEMTIME CurrentTime,Alarm_time;	//*ResetTime   
	
#define th0   0xee;					  //5ms
#define tl0   0x00;
#define th1   0xdc;					  //10ms
#define tl1   0x00;

void key_explain(unsigned char );		          //按键解释
void currenttime();								  //显示当前时间
void menu_choose(unsigned char lcdmenu);		  //菜单选择
void lcd_menu(void);       		                  //显示菜单
void alarm_set();								  //闹钟设置
void alarm_speaker();							  //闹钟启动
void time_reset();								  //时间重设
void delay(unsigned char count);

void delay(unsigned char count)
 {	unsigned char i,j;
     for(i=0;i<=50;i++)
	  for(j=0;j<=count;j++)
	      ;
 }
 void time1_isr(void)  interrupt 3	  	  //T1中断
{  	static unsigned char ii;
   	//static bit  flashflag;
    TR1=0;
    TH1=th1;
    TL1=tl1;				
    ii++;


	  if(ii==50)
	   { ii=0;
		 //flashflag=~flashflag;
	   	    
		DS1302_GetTime(&CurrentTime);
		DateToStr(&CurrentTime);
		TimeToStr(&CurrentTime); 

		GotoXY(0,0);
		Print("Date: "); 
		Print(CurrentTime.DateString);

		GotoXY(0,1);
		Print("Time: ");
		Print(CurrentTime.TimeString);
	
	   }
			  
	   delay(20);

  TR1=1;
}

 void time0_isr(void)  interrupt 1	  	  //T0中断扫描键盘
 {	
    TR0=0;
    TH0=th0;
	TL0=tl0;

    keycode=P1;
	keycode=keycode&0x0f;
	oldcode=keycode;
	 if(keycode!=0x0f)
	     {while(1)
			{ keycode=P1;
	          keycode=keycode&0x0f;
			  if( keycode==0x0f)
				 break;
			}		  
		  key_explain(oldcode);         
				
	     }
  	TR0=1;
  }	
void key_explain(unsigned char oldcode)		//按键解释
{   
		   
		   lcdflag=1;   
		   switch(oldcode)
		    {
			 case 0x0e: keyflag=0;			  
		                break;			  //H

		     case 0x0d: keyflag=1;			  
		                break;			  //updown

	         case 0x0b: keyflag=2;			 
	  				    break;			  //choose

		     case 0x07: keyflag=3;            
		                break;			  //enter

		     default:  	break;
	         }

	 if(keyflag==2)
	   { if(station==0)
		   lcdmenu++;
		 if(station==2||station==3)
		   resetflag++;
	   } 	
	 if(lcdmenu==4)	
	    lcdmenu=1; 
	 if(resetflag==6)
		resetflag=1;   

}
void time_reset()								  //时间重设
{ 
    SYSTEMTIME ResetTime;
  
    TR1=0;
   	ResetTime=CurrentTime;
		GotoXY(0,0);
	    Print("Date: ");
		Print(ResetTime.DateString);
		GotoXY(0,1);
		Print("Time: ");
		Print(ResetTime.TimeString);
  if(keyflag==1)			 //updown键	  1
   {
	switch(resetflag)		 //choose健	 2
	{ case 1:
			 ResetTime.Year++;
			 if(ResetTime.Year>=100)
			   	ResetTime.Year=0;
	         break;
	 case 2:
			 ResetTime.Month++;
			 if(ResetTime.Month>=13)
			   	ResetTime.Month=0;
	         break;
	 case 3:
			 ResetTime.Day++;
			 if(ResetTime.Day>=31)
			   	ResetTime.Day=0;
	         break;
	 case 4:
			 ResetTime.Hour++;
			 if(ResetTime.Hour>=24)
			   	ResetTime.Hour=0;
	         break;
	 case 5:
			 ResetTime.Minute++;
			 if(ResetTime.Minute>=60)
			   	ResetTime.Minute=0;
	         break;
	
	 default:break;
	}
	
		GotoXY(0,0);
	    Print("Date: ");
		Print(ResetTime.DateString);
		GotoXY(0,1);
		Print("Time: ");
		Print(ResetTime.TimeString);
  
    DS1302_SetTime(DS1302_YEAR,ResetTime.Year);		 
	DS1302_SetTime(DS1302_MONTH,ResetTime.Month);
	DS1302_SetTime(DS1302_DAY,ResetTime.Day );
	DS1302_SetTime(DS1302_HOUR,ResetTime.Hour );
	DS1302_SetTime(DS1302_MINUTE,ResetTime.Minute );
   }
}
  	 
void alarm_set(void)								  //闹钟设置
{ 
  //SYSTEMTIME Alarm_time;
  
    TR1=0;
   	Alarm_time=CurrentTime;
		GotoXY(0,0);
	    Print("Date: ");
		Print(Alarm_time.DateString);
		GotoXY(0,1);
		Print("Time: ");
		Print(Alarm_time.TimeString);
  if(keyflag==1)			 //updown键	  1
   {
	switch(resetflag)		 //choose健	 2
	{ case 1:
			 Alarm_time.Year++;
			 if(Alarm_time.Year>=100)
			   	Alarm_time.Year=0;
	         break;
	 case 2:
			 Alarm_time.Month++;
			 if(Alarm_time.Month>=13)
			   	Alarm_time.Month=0;
	         break;
	 case 3:
			 Alarm_time.Day++;
			 if(Alarm_time.Day>=31)
			   	Alarm_time.Day=0;
	         break;
	 case 4:
			 Alarm_time.Hour++;
			 if(Alarm_time.Hour>=24)
			   	Alarm_time.Hour=0;
	         break;
	 case 5:
			 Alarm_time.Minute++;
			 if(Alarm_time.Minute>=60)
			   	Alarm_time.Minute=0;
	         break;
	
	 default:break;
	 }
	
		GotoXY(0,0);
	    Print("Date: ");
		Print(Alarm_time.DateString);
		GotoXY(0,1);
		Print("Time: ");
		Print(Alarm_time.TimeString);
  
   }

}

void lcd_menu(void)		                 //显示菜单
{ 	static unsigned char jj;
    jj++;
 
    TR1=0;
	GotoXY(0,0);
    Print("   MENU:"); 
	//delay(10);
	Print("   Alarm");	  
	//delay(10);
    GotoXY(0,1);
    Print("   Time ");
	//delay(10);
    Print("   Reset");
   
       switch(lcdmenu)
	      {
		    case 1: 
			        GotoXY(9,1);
				    Print("  ");			
			        GotoXY(0,1);
					Print("=>");
				    break;
				  
		    case 2: 
			        GotoXY(0,1);
				    Print("  ");			
			       	GotoXY(9,0);
		            Print("=>");
				    break;
				  
		    case 3: 			
			        GotoXY(9,0);
				    Print("  ");			
			        GotoXY(9,1);
		            Print("=>");
				    break;
				  
		    default:
				    break; 
		 }

  	
   
} 

 
void currenttime()							   //显示当前时间
{  
      //time_on=1; 
	  TR1=1;  
   
	    DS1302_GetTime(&CurrentTime);
		DateToStr(&CurrentTime);
		TimeToStr(&CurrentTime);
		GotoXY(0,0);
	    Print("Date: ");
		Print(CurrentTime.DateString);
		GotoXY(0,1);
		Print("Time: ");
		Print(CurrentTime.TimeString);	 
} 	 

⌨️ 快捷键说明

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