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

📄 ds1302+lcd1602-c51.c.bak

📁 这是一个基于51单片机的DS1302_实时时钟驱动程序
💻 BAK
📖 第 1 页 / 共 2 页
字号:
		 alarm_time();             //K4键设定报警时间
		 if(alarm_flag)              //alarm_flag=1,开定时
	      {
	        write_position(2,16);
            lcd_wdat(0x00);           //显示自定义字符小喇叭
	      }
		}
	  }
//---------------------------------------------------------
   if(!K4)
   {
     beep();
     alarm_flag=~alarm_flag;
	 if(alarm_flag)              //alarm_flag=1,开定时
	 {
	   write_position(2,16);
       lcd_wdat(0x00);           //显示自定义字符小喇叭
	 }
	 else
	 {
	 write_position(2,16);
     lcd_wdat(0x20);           //显示自定义字符小喇叭
     }
   }

//---------------------------------------------------------
     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)
          {
			Set_W1302(0x8c);
            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)
          {
			Set_W1302(0x88);
            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)
          {
			Set_W1302(0x86);
            Set_place(1,7);
			day=0;
			week=1;
            count=init[5]&0x0f;  //读当前星期数据
           }
	   }

      while(week)             //设定星期
      {
        if(!K2)
        {
           beep();
		   if(count!=7)
           count++; 
       	   else count=1;
        }
        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); 
       }
       else
      {
       write_position(1,15);
       lcd_wdat(0x20);
      }

        if(!K3)
          {
			Set_W1302(0x8a);
            write_position(1,15);
            lcd_wdat(init1[1]+0x30); 
			week=0;
			hour=1;
            count=((init[2]&0xf0)>>4)*10+(init[2]&0x0f); //读当前时数据
           }
	   }

      while(hour)             //设定时
      {
	    key_set(23,2,7);
        if(!K3)
          {
			Set_W1302(0x84);
            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)
        {
          Set_W1302(0x82);
          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)
       {
        Set_W1302(0x80);
        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);
     write_position(row,col+1);
     lcd_wdat(init1[1]+0x30); 
   }
   else
   {                            //清屏
     write_position(row,col);
     lcd_wdat(0x20);
     write_position(row,col+1);
     lcd_wdat(0x20); 
   }
}

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

/**********************************************************/
// 显示当前时间
/**********************************************************/
void  Play_nowtime()
{
    read_nowtime(0x81,init,7);   //读出当前时间,读出7个字节

    write_position(2,7);
    lcd_wdat(((init[2]&0xf0)>>4)+0x30);

    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));

    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));

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

    write_position(1,1);
    lcd_wdat('0'+((init[6]&0xf0)>>4)); 

    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)); 

    write_position(1,8);
    lcd_wdat('0'+(init[3]&0x0f)); //读日

    write_position(1,15);
    lcd_wdat('0'+(init[5]&0x0f)); //读周

    flash();
}

/*********************************************************/
// 键设定函数
/*********************************************************/
void  key_set(uchar num,uchar row,uchar col )
{
   if(!K2)
   {
     beep();
     if(count!=num)
     count++; 
     else count=0;
   }
   if(!K1)
   {
     beep();
     if(count!=0)
     count--; 
     else count=num;
   }
	 Set_Flash(row,col);
}

/*********************************************************/
// 报警时间设定
/*********************************************************/
void  alarm_time()
{
//   if(!K4&flag)                  //开始设定报警时间
   {
     write_str(0xc0,str3);       //液晶显示提示信息
	 Play_alarmtime();
     beep();
	 hour=1;
	 count=((bj_time[2]&0xf0)>>4)*10+(bj_time[2]&0x0f);  //读当前时报警数据

	 while(hour)             //设定时
      {
	    key_set(23,2,7);
        
        if(!K4)
         {			
           Set_place(2,7);
		   bj_time[2]=((init1[0]<<4)|init1[1]);
		   beep();
		   hour=0;
		   min=1;
           count=((bj_time[1]&0xf0)>>4)*10+(bj_time[1]&0x0f); //读当前分报警数据
          }
	   }

	 while(min)             //设定分
      {
	    key_set(59,2,10);
       
        if(!K4)
         {			
           Set_place(2,10);
		   bj_time[1]=((init1[0]<<4)|init1[1]);
		   beep();
		   min=0;
		   sec=0;
           count=((bj_time[0]&0xf0)>>4)*10+(bj_time[0]&0x0f); //读当前秒报警数据
		   write_str(0xc0,str2);       //液晶显示提示信息
         }
	   }
/*
     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()
{
    write_position(2,7);
    lcd_wdat(((bj_time[2]&0xf0)>>4)+0x30);

    write_position(2,8);
    lcd_wdat('0'+(bj_time[2]&0x0f)); //读小时

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

    write_position(2,10);
    lcd_wdat('0'+((bj_time[1]&0xf0)>>4));

    write_position(2,11);
    lcd_wdat('0'+(bj_time[1]&0x0f)); //读分钟

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

    write_position(2,13);
    lcd_wdat('0'+((bj_time[0]&0xf0)>>4));

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

/*********************************************************/
// 时间比较
/*********************************************************/
void  Time_compare()
{
   if(alarm_flag)
   {
   if(init[2]==bj_time[2])
   {
     if(init[1]==bj_time[1])
	 beep();
   }
   }
}

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

⌨️ 快捷键说明

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