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

📄 ds1302+lcd1602-c51.c

📁 基于C51实现多功能钟,一键多功能,友好的液晶显示,人机界面,同时能播放音乐.绝对原创!
💻 C
📖 第 1 页 / 共 2 页
字号:
	else
	 {
	 write_position(2,16);
     lcd_wdat(0x20);           //显示自定义字符小喇叭
     }
  }
}
//---------------------------------------------------------
     if(!K3&flag)               //开始设定时间
      {
	  delay1(35); 	//消除抖动
	   if(!K3&flag)
	  {
	   write_ds1302(0x8e,0x00);  //写保护控制字,允许写
	   write_ds1302(0x80,0x80);  //停止时钟运行
       write_ds1302(0x8e,0x80);  //写保护控制字,禁止写
       beep();
       year=1;
	   count=((init[6]&0xf0)>>4)*10+(init[6]&0x0f);  //读当前年数据
	  }
	  }
     while(year)             //设定年
      {
         key_set(99,1,1);	  // 键设定函数
		if(!K3)
	   {
		delay1(35); 	//消除抖动
        if(!K3)
          {
			Set_W1302(0x8c);   // 设定值写入DS1302
            Set_place(1,1);	  // 指定位置显示
			year=0;
			month=1;
            count=((init[4]&0xf0)>>4)*10+(init[4]&0x0f);  //读当前月数据
           }
		 }
	   }

       while(month)             //设定月
      {
	    key_set(12,1,4);
         if(!K3)
		{
		 delay1(35); 	//消除抖动     
        if(!K3)
          {
			Set_W1302(0x88);  // 设定值写入DS1302
            Set_place(1,4);	 // 指定位置显示
			month=0;
			day=1;
            count=((init[3]&0xf0)>>4)*10+(init[3]&0x0f); //读当前日数据
           }
		 }
	   }

      while(day)             //设定日
      {
         key_set(31,1,7);	// 键设定函数
     	if(!K3)
		{
		 delay1(35); 	//消除抖动
        if(!K3)
          {
			Set_W1302(0x86);   // 设定值写入DS1302
            Set_place(1,7);	 // 指定位置显示
			day=0;
			week=1;
            count=init[5]&0x0f;  //读当前星期数据
           }
	     }
	   }

      while(week)             //设定星期
      {
	    if(!K2)
	   {
	   	  delay1(40); 	//消除抖动
        if(!K2)
        {
           beep();
		   if(count!=7)
           count++; 
       	   else count=1;
        }
	   }
        if(!K1)
	   {
	     delay1(40); 	//消除抖动
		if(!K1)
        {
           beep();
		   if(count!=1)
           count--; 
      	   else count=7;
        }
 	   }
        init1[1]=count%10;

       if(flag)
       {
       write_position(1,15);
       lcd_wdat(init1[1]+0x30);   //写显示数据到LCD
       }
       else
      {
       write_position(1,15);
       lcd_wdat(0x20);
      }
		if(!K3)
		{  
		   delay1(35); 	//消除抖动
        if(!K3)
          {
			Set_W1302(0x8a);	  // 设定值写入DS1302
            write_position(1,15);
            lcd_wdat(init1[1]+0x30);   //写显示数据到LCD
			week=0;
			hour=1;
            count=((init[2]&0xf0)>>4)*10+(init[2]&0x0f); //读当前时数据
           }
	  	 }
	   }

      while(hour)             //设定时
      {
	    key_set(23,2,7);
       	 if(!K3)
		{	delay1(35); 	//消除抖动
	    if(!K3)
          {
			Set_W1302(0x84);  // 设定值写入DS1302
            Set_place(2,7);	 // 指定位置显示
			hour=0;
			min=1;
            count=((init[1]&0xf0)>>4)*10+(init[1]&0x0f); //读当前分数据
           }
	   	 }
	   }

       while(min)            //设定分
      {
	    key_set(59,2,10);	 // 键设定函数
       	 if(!K3)
	   {   delay1(35); 	//消除抖动
	    if(!K3)
        {
          Set_W1302(0x82);	 // 设定值写入DS1302
          Set_place(2,10);	// 指定位置显示
		  min=0;
		  sec=1;
          count=((init[0]&0xf0)>>4)*10+(init[0]&0x0f);  //读当前秒数据
        }
		}
	  }

      while(sec)            //设定秒
      {
       key_set(59,2,13);
	   if(!K3)
	   { delay1(35); 	//消除抖动
	   if(!K3)
       {
        Set_W1302(0x80); // 设定值写入DS1302
        Set_place(2,13); // 指定位置显示
	    sec=0;
        count=0;
       }
	   }
	  }
	Play_nowtime();
	Time_compare();
   }
}

/**********************************************************/
// Time0中断函数
/**********************************************************/
void Time0(void) interrupt 1 using 0
{
  TH0=0x4c; //50ms定时
  TL0=0x00;
  timecount++;
  if(timecount>9)
   {
    timecount=0;    
    flag=~flag;             
   }  
}
/**********************************************************/
// 设定值写入DS1302
/**********************************************************/
void  Set_W1302(uchar addr)
{
   uchar  temp;
   write_ds1302(0x8e,0x00);
   temp=(init1[0]<<4)+init1[1];   //转换为十六进制数
   write_ds1302(addr,temp); 
   write_ds1302(0x8e,0x80);
   beep();
}

/**********************************************************/
// 被设置数据闪动
/**********************************************************/
void  Set_Flash(uchar row,uchar col )
{
   init1[0]=count/10;
   init1[1]=count%10;

   if(flag)
   {                                 //显示
     write_position(row,col);         //设定显示位置
     lcd_wdat(init1[0]+0x30);		   //写显示数据到LCD
     write_position(row,col+1);		  //设定显示位置
     lcd_wdat(init1[1]+0x30); 		  //写显示数据到LCD
   }
   else
   {                            //清屏
     write_position(row,col);	     //设定显示位置
     lcd_wdat(0x20);				  //写显示数据到LCD
     write_position(row,col+1);		 //设定显示位置
     lcd_wdat(0x20); 				 //写显示数据到LCD
   }
}

/**********************************************************/
// 指定位置显示
/**********************************************************/
void  Set_place(uchar row,uchar col)
{
    write_position(row,col);	   //设定显示位置
    lcd_wdat(init1[0]+0x30);	   //写显示数据到LCD
    write_position(row,col+1);	   //设定显示位置
    lcd_wdat(init1[1]+0x30); 	   //写显示数据到LCD
}

/**********************************************************/
// 显示当前时间
/**********************************************************/
void  Play_nowtime()
{
    read_nowtime(0x81,init,7);   //读出当前时间,读出7个字节 秒,分,时,日,月,星期,年

    write_position(2,7);        //设定显示位置 
    lcd_wdat(((init[2]&0xf0)>>4)+0x30);//写显示数据到LCD  十位

    write_position(2,8);		 //设定显示位置
    lcd_wdat('0'+(init[2]&0x0f)); //读小时		   个位

//    write_position(2,9);
//    lcd_wdat(':');

    write_position(2,10);	   //设定显示位置
    lcd_wdat('0'+((init[1]&0xf0)>>4));		//写显示数据到LCD	  十位

    write_position(2,11);	   //设定显示位置
    lcd_wdat('0'+(init[1]&0x0f)); //读分钟		  个位

//    write_position(2,12);
//    lcd_wdat(':');

    write_position(2,13);		//设定显示位置
    lcd_wdat('0'+((init[0]&0xf0)>>4));			//写显示数据到LCD

    write_position(2,14);
    lcd_wdat('0'+(init[0]&0x0f)); //读秒

    write_position(1,1);
    lcd_wdat('0'+((init[6]&0xf0)>>4)); 		  //写显示数据到LCD

    write_position(1,2);
    lcd_wdat('0'+(init[6]&0x0f)); //读年

//    write_position(1,3);
//    lcd_wdat('/');

    write_position(1,4);		 //设定显示位置
    lcd_wdat('0'+((init[4]&0xf0)>>4)); 

    write_position(1,5);			//设定显示位置
    lcd_wdat('0'+(init[4]&0x0f));  //读月

//    write_position(1,6);
//    lcd_wdat('/');

    write_position(1,7);			//设定显示位置
    lcd_wdat('0'+((init[3]&0xf0)>>4)); 	  //写显示数据到LCD

    write_position(1,8);			//设定显示位置
    lcd_wdat('0'+(init[3]&0x0f));   //读日

    write_position(1,15);		    //设定显示位置
    lcd_wdat('0'+(init[5]&0x0f));   //读周	 &0x0f

    flash();
}

/*********************************************************/
// 键设定函数
/*********************************************************/
void  key_set(uchar num,uchar row,uchar col )
{
   if(!K2)
   {  
      delay1(32); 	//消除抖动
     if(!K2)
    { beep();
     if(count!=num)
     count++; 
     else count=0;
    }
   }
   if(!K1)
   { 	
      delay1(32); 	//消除抖动Delay(100);
   if(!K1)
	{ beep();
     if(count!=0)
     count--; 
     else count=num;
    }
   }
	 Set_Flash(row,col);
  
}
/*********************************************************/
// 报警时间设定
/*********************************************************/
void  alarm_time()
{      
  k=8;
if(!K4&flag)                   //开始设定报警时间
 {  	 
   delay1(35); 	//消除抖动
   if(!K4&flag)     
	{  
   
   do	 
   {
	 write_str(0x80,str4); 
	 write_str(0xc0,str3);        //液晶显示提示信息
	 Play_alarmtime();			  //报警时间显示    
	 beep();
	 num=1;
//	 k=Read_One_Byte(0xaf);
	 count=k;
	 while(num)	   //写入闹钟个数
	   {
	     key_set(8,1,14);
	   if(!K4)
		{
		 delay1(35);
		  if(!K4)
		  {
		  Set_place(1,14);
		  k=(init1[0]<<4|init1[1]);
		  Write_One_Byte(0xaf,k);
		  beep();
		  num=0;   
	      hour=1;
	      count=((alarm2.h&0xf0)>>4)*10+(alarm2.h&0x0f);  //读当前时报警数据
       } 
	 }	 
	}
    while(hour)              //设定时
      {
	    key_set(23,2,7);       // 键设定函数
        
        if(!K4)
         {
		   	delay1(35); 	//消除抖动
		   if(!K4)		
         {
		   Set_place(2,7);		  //指定位置显示
		   alarm2.h=((init1[0]<<4)|init1[1]);
           		  
		    Write_One_Byte(0x01+(0x08-k)*0x02,alarm2.h);   //把报警时间的小时写入24C02
		    
		   beep();
		   hour=0;
		   min=1;
   		   count=((alarm2.m&0xf0)>>4)*10+(alarm2.m&0x0f);  //读当前时报警数据
          }
		  }
	   }

	 while(min)                        //设定分
      {
	    key_set(59,2,10);	  // 键设定函数
       
        if(!K4)						
         {	
		   	delay1(35); 	//消除抖动
		   if(!K4)		
           {
		   Set_place(2,10);			 //指定位置显示
		   alarm2.m=((init1[0]<<4)|init1[1]);

		   Write_One_Byte(0x00+(0x08-k)*0x02,alarm2.m); //把报警时间的分钟写入24C02

		   beep();
		   min=0;
		   sec=0;
		   count=(((alarm2.s)&0xf0)>>4)*10+((alarm2.s)&0x0f); //读当前秒报警数据
		   write_str(0xc0,str2);       //液晶显示提示信息
           }
		 }
	   }
	 write_str(0x80,str1);
   }while(k>=1);
//**************************************	 
/*
     while(sec)             //设定秒
      {
	    key_set(59,2,13);
       
        if(!K4)
         {			
           Set_place(2,13);
		   bj_time[0]=((init1[0]<<4)|init1[1]);
		   beep();
		   min=0;
		   sec=0;
           count=0;
		   write_str(0xc0,str2);       //液晶显示提示信息
         }
	   }*/
   }
  
  }

}

/*********************************************************/
// 报警时间显示
/*********************************************************/
void  Play_alarmtime()
{
  //	char i;
  // write_str(0x80,str4);     
//    k=Read_One_Byte(0xaf); 	
/*
    count=k;
	num=1;
	 while(num)	   //写入闹钟个数
	   {
	     key_set(8,1,14);
	   if(!K4)
		{
		 delay1(35);
		  if(!K4)
		  {
		  Set_place(1,14);
		  k=(init1[0]<<4|init1[1]);
		  beep();
		  num=0;   
       } 
	 }	 
	}
   */

	alarm2.h=Read_One_Byte(0x01+(8-k)*2);	 
	alarm2.m=Read_One_Byte(0x00+(8-k)*2);
   	
    write_position(2,7);
	lcd_wdat(((alarm2.h&0xf0)>>4)+0x30);	 //写显示数据到LCD
 
    write_position(2,8);
	lcd_wdat('0'+(alarm2.h&0x0f)); //读小时
 /* 
    write_position(2,9);					 //设定显示位置
    lcd_wdat(':');
  */
    write_position(2,10);					  //设定显示位置
	lcd_wdat('0'+((alarm2.m&0xf0)>>4));	 //写显示数据到LCD
   
    write_position(2,11);				  //设定显示位置
   lcd_wdat('0'+(alarm2.m&0x0f)); //读分钟
 /*  
    write_position(2,12);			       //设定显示位置
    lcd_wdat(':');		                  //写显示数据到LCD
  */              
    write_position(2,13);				      //设定显示位置
    lcd_wdat('0'+((alarm2.s&0xf0)>>4));	 //写显示数据到LCD
   
    write_position(2,14);
    lcd_wdat('0'+(alarm2.s&0x0f)); //读秒	   
  }

/*********************************************************/
// 时间比较
/*********************************************************/
void  Time_compare()
{
  int i;
 if(alarm_flag)
 {			
  	
    for(k=0;k<ALARM_NUM;k++) 
	 {
	  alarm2.h=Read_One_Byte(0x01+i);
	  alarm2.m=Read_One_Byte(0x00+i);
      
	 if(init[2]==alarm2.h)
      {		
      if(init[1]==alarm2.m)
	  beep();
       }
	 }
	 
	}  
}
//*********************************************************



⌨️ 快捷键说明

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