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

📄 main.c

📁 电子时钟
💻 C
字号:
/*---------------------------------------------------------------*
************************ design by ghtyoo ************************
*----------------------------------------------------------------*/
#include <reg51.h>
#include <init.h>
void Time_C(void);
void Clock_C(void);
void ring_c(void) ;
void Delay(unsigned char i);
extern  void ring(void);
extern void LCD_Write(unsigned char cmd);
extern void LCD_Write_Com(unsigned char com);
extern void LCD_Write_Dat(unsigned char dat);
extern void LCD_Write_Dat_Nmov(unsigned char dat);
extern void LCDInit(void);
extern void TimeInit(void);
extern void LCD_Show1(void);
extern unsigned char Key_Scan(void);
extern unsigned char LCD_Read_Dat(unsigned char com);
extern void Watch(void);
extern void Right(void);
extern void Left(void);
unsigned char store_c,store_i,count,time[3],date[3],store[6]; 
unsigned char wc,wd2,wd1,wd0; 

void main()
{ 
  unsigned char i,m,n,j,temp; 
  store_c=0; //闹钟设置完成标志初始化
  store_i=0; //闹钟设置进行中标志初始化
  SPEAK=1;
  i=0xff;//定义一个没用过的数
  LCDInit();
  LCD_Show1();
  EA=0;
  TimeInit();
  while(1)
  {	 
	 temp=i;
     i=Key_Scan();
	 if(i==temp)
	    continue;	  //消除按键抖动
	 switch(i)
	   {
	     case '1':LCD_Write_Dat_Nmov('1');break;
		 case '2':LCD_Write_Dat_Nmov('2');break;
		 case '3':LCD_Write_Dat_Nmov('3');break;
		 case '4':LCD_Write_Dat_Nmov('4');break;
		 case '5':LCD_Write_Dat_Nmov('5');break;
		 case '6':LCD_Write_Dat_Nmov('6');break;
		 case '7':LCD_Write_Dat_Nmov('7');break;
		 case '8':LCD_Write_Dat_Nmov('8');break;
		 case '9':LCD_Write_Dat_Nmov('9');break;
		 case '0':LCD_Write_Dat_Nmov('0');break;
//		 case 'T':LCD_Write_Dat('T');break;	  //上电开始就有调时间,不需要这个键来特定调时间
//		 case 'C':LCD_Write_Dat('C');break;				      //时间都没调好,还来什么闹钟,
//		 case 'W':LCD_Write_Dat('W');break;
//		 case 'L':LCD_Write_Dat('L');break;
//		 case 'R':LCD_Write_Dat('R');break;
//		 case 'B':LCD_Write_Dat('B');break;
//	 	 case 'W':Watch();break;
         case 'L':Left()	;break;
		 case 'R':Right();break;
		 default:break;
	   }
	   if (i=='B')
	   {
	     date[0]=(LCD_Read_Dat(0x85)-'0')*10+(LCD_Read_Dat(0x86)-'0');
		 date[1]=(LCD_Read_Dat(0x88)-'0')*10+(LCD_Read_Dat(0x89)-'0');
		 date[2]=(LCD_Read_Dat(0x8b)-'0')*10+(LCD_Read_Dat(0x8c)-'0');
		 time[0]=(LCD_Read_Dat(0xc4)-'0')*10+(LCD_Read_Dat(0xc5)-'0');
		 time[1]=(LCD_Read_Dat(0xc7)-'0')*10+(LCD_Read_Dat(0xc8)-'0');
		 time[2]=(LCD_Read_Dat(0xca)-'0')*10+(LCD_Read_Dat(0xcb)-'0');
		 LCD_Write_Com(0x0c);//开显示,关光标,不闪烁
	     break;	
	   }
   }
   TR0=1;	   //定时器0开始计数  
   ET0=1;	  //打开定时器0中断
   EA=1;		  //开总中断
   m=time[2];
   while(1)
   {
    n=time[2];
	if((m!=n)&&(store_i==0)) //一秒更一次,当闹钟没正在设置时
	  {
	    LCD_Write_Com(0x83);
		LCD_Write_Dat('2');
		LCD_Write_Com(0x84);
		LCD_Write_Dat('0');
		LCD_Write_Com(0x87);
		LCD_Write_Dat('-');
		LCD_Write_Com(0x8a);
		LCD_Write_Dat('-');
		LCD_Write_Com(0xc6);
		LCD_Write_Dat(':');
		LCD_Write_Com(0xc9);
		LCD_Write_Dat(':');
		LCD_Write_Com(0x85);		 //日 期
		LCD_Write_Dat(date[0]/10+'0');		 //年数少于100年
		LCD_Write_Com(0x86);
		LCD_Write_Dat(date[0]%10+'0');
		LCD_Write_Com(0x88);
		LCD_Write_Dat(date[1]/10+'0');
		LCD_Write_Com(0x89);
		LCD_Write_Dat(date[1]%10+'0');
		LCD_Write_Com(0x8b);
		LCD_Write_Dat(date[2]/10+'0');
		LCD_Write_Com(0x8c);
		LCD_Write_Dat(date[2]%10+'0');
		LCD_Write_Com(0xc4);         //时间
		LCD_Write_Dat(time[0]/10+'0');
		LCD_Write_Com(0xc5);
		LCD_Write_Dat(time[0]%10+'0');
		LCD_Write_Com(0xc7);
		LCD_Write_Dat(time[1]/10+'0');
		LCD_Write_Com(0xc8);
		LCD_Write_Dat(time[1]%10+'0');
		LCD_Write_Com(0xca);
		LCD_Write_Dat(time[2]/10+'0');
		LCD_Write_Com(0xcb);
		LCD_Write_Dat(time[2]%10+'0');
	    m=n;
      }	
	if(store_c==1)					  //闹钟
		 if((store[0]==date[0])&&(store[1]==date[1])&&(store[2]==date[2])
		     &&(store[3]==time[0])&&(store[4]==time[1])&&(store[5]==time[2]))
		  {
		    ring_c();
		  }
	j=Key_Scan();
	if(j=='T')
	 {
		Time_C();
	 }
	if(j=='C')	  
	  {
	    Clock_C();
	  }
	if(j=='W')
		 Watch();
   } 
   
 }
 /*********************时钟设置******************************/
 void Time_C(void)
 {
    unsigned char i,temp;
    i=0xff;//定义一个没用过的数
	TR0=0;	   
    ET0=0;	 
   	LCD_Write_Com(0x80);
	LCD_Write_Dat('T');
	LCD_Write_Com(0x83);
    LCD_Write_Com(0x0f);//开显示,开光标,闪烁
	while(1)
	{
	   temp=i;
	   i=Key_Scan();
	   if(i==temp)
	     continue;
	   switch(i)
	         {
	          case '1':LCD_Write_Dat_Nmov('1');break;
	          case '2':LCD_Write_Dat_Nmov('2');break;
		      case '3':LCD_Write_Dat_Nmov('3');break;
		      case '4':LCD_Write_Dat_Nmov('4');break;
		      case '5':LCD_Write_Dat_Nmov('5');break;
		      case '6':LCD_Write_Dat_Nmov('6');break;
		      case '7':LCD_Write_Dat_Nmov('7');break;
		      case '8':LCD_Write_Dat_Nmov('8');break;
		      case '9':LCD_Write_Dat_Nmov('9');break;
		      case '0':LCD_Write_Dat_Nmov('0');break;
		      case 'L':Left();break;
		      case 'R':Right();break;
		      default:break;
	         }
	   if (i=='B')
	    {
	     date[0]=(LCD_Read_Dat(0x85)-'0')*10+(LCD_Read_Dat(0x86)-'0');
		 date[1]=(LCD_Read_Dat(0x88)-'0')*10+(LCD_Read_Dat(0x89)-'0');
		 date[2]=(LCD_Read_Dat(0x8b)-'0')*10+(LCD_Read_Dat(0x8c)-'0');
		 time[0]=(LCD_Read_Dat(0xc4)-'0')*10+(LCD_Read_Dat(0xc5)-'0');
		 time[1]=(LCD_Read_Dat(0xc7)-'0')*10+(LCD_Read_Dat(0xc8)-'0');
		 time[2]=(LCD_Read_Dat(0xca)-'0')*10+(LCD_Read_Dat(0xcb)-'0');
		 LCD_Write_Com(0x0c);//开显示,关光标,不闪烁
		 LCD_Write_Com(0x80);
	     LCD_Write_Dat(' ');	      //取消T——调整时间标志
		 TH0=0x4c;
         TL0=0x00;
		 TR0=1;	   //定时器0开始计数  
         ET0=1;	  //打开定时器0中断
		 EA=1;
	     break;	
	    }
	}
 }

 /********************闹钟设置****************************/
void Clock_C(void)
{
  unsigned char i,temp;
  store_i=1;
  i=0xff;//定义一个没用过的数
//  TR1=0;	   
//  ET1=0;	 
  LCD_Write_Com(0x80);
  LCD_Write_Dat('C');
  LCD_Write_Com(0x83);
  LCD_Write_Com(0x0f);//开显示,开光标,闪烁
  while(1)
	{
	   temp=i;
	   i=Key_Scan();
	   if(i==temp)
	     continue;
	   switch(i)
	         {
	          case '1':LCD_Write_Dat_Nmov('1');break;
	          case '2':LCD_Write_Dat_Nmov('2');break;
		      case '3':LCD_Write_Dat_Nmov('3');break;
		      case '4':LCD_Write_Dat_Nmov('4');break;
		      case '5':LCD_Write_Dat_Nmov('5');break;
		      case '6':LCD_Write_Dat_Nmov('6');break;
		      case '7':LCD_Write_Dat_Nmov('7');break;
		      case '8':LCD_Write_Dat_Nmov('8');break;
		      case '9':LCD_Write_Dat_Nmov('9');break;
		      case '0':LCD_Write_Dat_Nmov('0');break;
		      case 'L':Left();break;
		      case 'R':Right();break;
		      default:break;
	         }
	   if (i=='B')
	    {
		  store[0]=(LCD_Read_Dat(0x85)-'0')*10+(LCD_Read_Dat(0x86)-'0');
		  store[1]=(LCD_Read_Dat(0x88)-'0')*10+(LCD_Read_Dat(0x89)-'0');
		  store[2]=(LCD_Read_Dat(0x8b)-'0')*10+(LCD_Read_Dat(0x8c)-'0');
		  store[3]=(LCD_Read_Dat(0xc4)-'0')*10+(LCD_Read_Dat(0xc5)-'0');
		  store[4]=(LCD_Read_Dat(0xc7)-'0')*10+(LCD_Read_Dat(0xc8)-'0');
		  store[5]=(LCD_Read_Dat(0xca)-'0')*10+(LCD_Read_Dat(0xcb)-'0');
		  store_c=1;  //闹钟标志
		  store_i=0;
		  LCD_Write_Com(0x80); //清除闹钟显示信息
          LCD_Write_Dat(' ');
		  LCD_Write_Com(0x0c);//开显示,关光标,不闪烁
		  break;
		}
	}	  
}

/****************蜂鸣器*****************************/ 
 void ring(void)
 {
   SPEAK=0;
   Delay(30);
   SPEAK=1;
 }
void ring_c(void) 
{
  unsigned char i;
  i=0xff;
  while(1)
  {
    SPEAK=0;
    Delay(80);
	SPEAK=1;
	Delay(80);
    SPEAK=0;
    Delay(80);
    SPEAK=1;
	Delay(80);
    SPEAK=0;
    Delay(80);
	SPEAK=1;
	Delay(80);
    SPEAK=0;
    Delay(80);
	SPEAK=1;
	Delay(250);
    Delay(250);
	Delay(250);	
	i=Key_Scan();
	if(i=='B')
	   {
	     store_c=0;
	     break;
	   }
  }
}

/*************延时i毫秒函数********************/
void Delay(unsigned char i)
{
  unsigned char j;
  while(--i	!=0)
  {
     for(j=0;j<125;j++);
  }
}

⌨️ 快捷键说明

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