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

📄 电子钟带生肖.c

📁 利用12864液晶+AT89S52制作成的带农历及生肖的电子钟程序
💻 C
📖 第 1 页 / 共 2 页
字号:
  write_clock(0x8e,0x00);//允许写操作
  write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
  write_clock(0x8e,0x80);//写保护,禁止写操作 
  updata ();	//刷新数据
  lcm_w_mm();//刷新 分 
}
/*****************************************************************************/
//设置1302的初始时间
void Init_1302(void){//(2008年1月1日00时00分00秒星期一)
	write_clock(0x8e,0x00);//允许写操作

	write_clock(0x8c,0x08);//年
	write_clock(0x8a,0x02);//星期
	write_clock(0x88,0x01);//月
	write_clock(0x86,0x01);//日
	write_clock(0x84,0x12);//小时
	write_clock(0x82,0x00);//分钟
	write_clock(0x80,0x00);//秒
	write_clock(0x90,0xa5);//充电	
	write_clock(0x8e,0x80);//禁止写操作
	}
/*****************************************************************************/
//DS1302写数据(底层协议)
void write_clock(unsigned char Writeaddr,unsigned char Writedata)
  	{
 unsigned char i;

 clock_clk=0;
 Delay(1);
 clock_Rst=1;
 Delay(1);

 for(i=8;i>0;i--)
 {
  clock_clk=0;
  clock_dat=Writeaddr&0x01;
  Delay(1);
  clock_clk=1;
  Writeaddr=Writeaddr>>1;
 }

 for(i=8;i>0;i--)
 {
  clock_clk=0;
  clock_dat=Writedata&0x01;
  Delay(1);
  clock_clk=1;
  Writedata=Writedata>>1;
 }

 clock_Rst=0;
 Delay(1);
 clock_clk=0;
 Delay(1);
}

 
/*****************************************************************************/
//DS1302读数据(底层协议)
unsigned char read_clock(unsigned char Readaddr)
{
 unsigned char i;
 unsigned char value=0;

 clock_clk=0;
 Delay(1);
 clock_Rst=1;
 Delay(1);
 
 for(i=8;i>0;i--)
 {
  clock_clk=0;
  clock_dat=Readaddr&0x01;
  Delay(1);
  clock_clk=1;
  Readaddr=Readaddr>>1;
 }

 for(i=8;i>0;i--)
 {
  value=value>>1;
  clock_clk=1;
  Delay(1);
  clock_clk=0;
  if(clock_dat==1)
  {
   value=value|0x80;
  }
  Delay(1);
 }

 clock_Rst=0;
 Delay(1);
 clock_clk=0;
 Delay(1);

 return value;
}
/*****************************************************************************/
//向LCM中填写 年 数据
void lcm_w_yy(void){
	//if(read_clock(0x8d) != yy){
		yy = read_clock(0x8d);
		lcm_w_test(0,0x81);
		lcm_w_word("20");
      lcm_w_test(0,0x83);
		lcm_w_word("年");
		lcm_w_test(0,0x82);
		lcm_w_test(1,(yy/16)+0x30);	
		lcm_w_test(1,yy%16+0x30);
}	//}
/*****************************************************************************/
//向LCM中填写 月 数据
void lcm_w_mo(void){
	//if(read_clock(0x89) != mo){
		mo = read_clock(0x89);
		lcm_w_test(0,0x90);
			if(mo/16 != 0){lcm_w_test(1,(mo/16)+0x30);}	//十位消隐
			else{lcm_w_test(1,0x20);}//同上			
		lcm_w_test(1,mo%16+0x30);
		lcm_w_test(0,0x91);
		lcm_w_word("月");
}	//}
/*****************************************************************************/
//星期处理并送入LCM的指定区域
void lcm_w_xq(void){
	unsigned char sel;

	//if(read_clock(0x8b) != xq){
	xq = read_clock(0x8b);
	sel = (read_clock(0x8b))%16; //字节低4位的BCD码放入sel
	lcm_w_test(0,0x97);//写入指定区域(97H 第二行第8个字)
	if(sel==7)  {lcm_w_word("日");}    //
  	if(sel==6)  {lcm_w_word("六");}    //
  	if(sel==5)  {lcm_w_word("五");}    //
  	if(sel==4)  {lcm_w_word("四");}    //
  	if(sel==3)  {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //此指令等于lcm_w_word("三"); 因为“三”的内码失效。
  	if(sel==2)  {lcm_w_word("二");}    //
  	if(sel==1)  {lcm_w_word("一");}    //星期一
	lcm_w_test(0,0x95);
	lcm_w_word("星期");
	//}
}
/*****************************************************************************/
//向LCM中填写 日 数据
void lcm_w_dd(void){
//	if(read_clock(0x87) != dd){
		dd = read_clock(0x87);
		lcm_w_test(0,0x92);
			if(dd/16 != 0){lcm_w_test(1,(dd/16)+0x30);}	//十位消隐
			else{lcm_w_test(1,0x20);}//同上	
		lcm_w_test(1,dd%16+0x30);
		lcm_w_test(0,0x93);
		lcm_w_word("日  ");
				
}	//}
/*****************************************************************************/
//向LCM中填写 小时 数据
void lcm_w_hh(void){
	if(read_clock(0x85) != hh){
		hh = read_clock(0x85);
			if (hh > 0x07 && hh < 0x22 && w == 0){
				beep = 0; 
				DelayM(100);
				beep = 1; 
			}
		}
		lcm_w_test(0,0x88);
		lcm_w_test(1,(hh/16)+0x30);
		lcm_w_test(1,hh%16+0x30);
				
}	//}
/*****************************************************************************/
//向LCM中填写 分钟 数据
void lcm_w_mm(void){
	if(read_clock(0x83) != mm){		
		mm = read_clock(0x83);
		if( w == 0){				
			days();	   //节日显示
			updata ();	//刷新数据
		}				
	}
	lcm_w_test(0,0x89);	
	lcm_w_test(1,0x3a);	  //":"
	lcm_w_test(1,(mm/16)+0x30);
	lcm_w_test(1,mm%16+0x30);
	lcm_w_test(1,0x3a);	 //"."	
}
/*****************************************************************************/
//刷新数据
void updata (void){
		lcm_w_hh();//刷新 小时 
		lcm_w_dd();//刷新 日
		lcm_w_xq();//更新星期值	
		lcm_w_mo();//刷新 月
		lcm_w_yy();//刷新 年
		
}
/*****************************************************************************/
//向LCM中填写 秒 数据
void lcm_w_ss(void){
	unsigned int i=0;
	unsigned char a=0,b=0,c=0;
	if(read_clock(0x81) != ss)
	{	//判断是否需要更新
	ss = read_clock(0x81);	//更新数据
	lcm_w_test(0,0x8b);		//秒值在LCM上的写入位置
	lcm_w_test(1,(ss/16)+0x30);	//写十位		
	lcm_w_test(1,ss%16+0x30);	//写个位
	//led_b = ~led_b;				//背光闪烁
	lcm_w_mm();//刷新 分		
	lcm_w_test(0,0x8d);		//温度在LCM上的写入位置		
	i=ReadTemperature();//读温度并送显
	a=i/100;
	lcm_w_test(1,a+0x30);	//显示温度十位
	b=i/10-a*10;
	lcm_w_test(1,b+0x30);	//个位
	lcm_w_test(1,0x2e);	 //"."
	c=i-a*100-b*10;
	lcm_w_test(1,c+0x30); //小位1位		
	lcm_w_word("℃");	//度C
   days();	   //节日显示
   }	
}
/*****************************************************************************/
//---主程序---//

main()
  {
	unsigned char e=0;
	yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新
	P0=0xff;P1=0xff;P2=0xff;P3=0xff; //清I/O端口
	beep = 0;
	DelayM(900);
	beep = 1;
	lcm_init();//初始化液晶显示器
   lcm_clr();//清屏
	lcm_w_test(0,0x82);
	//lcm_w_word("")可以自己随意加字
	//lcm_w_test(0,0x91);
	//lcm_w_word("");
	//lcm_w_test(0,0x8a);
	//lcm_w_word("?);
	DelayM(5000); //显示等留5秒
	lcm_clr();//清屏
  while(1)
    {
		if (w == 0)
		{   //正常走时
		lcm_w_ss();//刷新 秒
		}
			
		if (KEY_3 == 0) // 设置时间
      	{
       		DelayM(20);	   //去抖
				if(KEY_3 == 0 && w == 1)  //当是调时状态 本键用于调整下一项
			{
				e++;
				if (e >= 6 ){e = 0;}
				Set_time(e);//调整				
			}
			
			if(KEY_3 == 0 && w == 0)  //当是正常状态时就进入调时状态
			   {
				lcm_clr();          //清屏
				w=1;	              //进入调时				
				//lcm_w_test(0,0x9e);
				//lcm_w_word(" [-]");
				//lcm_w_test(0,0x80);
				//lcm_w_word("[Esc]");
				//lcm_w_test(0,0x85);
				//lcm_w_word("[Next]");
				//lcm_w_test(0,0x98);
				//lcm_w_word("[+]");
				Set_time(e);         //调整
			   }
       		while(KEY_3 == 0);   //等待键松开 
		  }

		//------------------------------------------------------------------
		if (KEY_1 == 0) // 当在调时状态时就退出调时
      	{
       		DelayM(20);
       		if(KEY_1 == 0 && w == 1){				
				w = 0;	  //退出调时
				e = 0;		//“下一项”计数器清0								
			}

			if(KEY_1 == 0 && w == 0){				
				lcm_clr();//清屏
				
            DelayM(3000);
				//----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//标尺				
				while(KEY_1 == 0);//等待键松开  
			}
				lcm_clr();//清屏
				days();	   //节日显示
				updata ();	//刷新数据
				lcm_w_mm();//刷新 分
				

       		while(KEY_1 == 0);//等待键松开  
			}

		//------------------------------------------------------------------
		if (KEY_2 == 0 && w == 1){ // 加减调整{
       		DelayM(20);
       		if(KEY_2 == 0 && w == 1){				
				Set_time(e);//调整
			}
       		while(KEY_2 == 0);//等待键松开
			  
      	}

		//------------------------------------------------------------------
		if (KEY_4 == 0 && w == 1){ // 加减调整      	
       		DelayM(20);	
       		if(KEY_4 == 0 && w == 1){				
				Set_time(e);//调整
			   }
       		while(KEY_4 == 0);//等待键松开
			}

	   //------------------------------------------------------------------
		 if(KEY_1 == 1 && KEY_2 == 0 && KEY_3 == 1 && KEY_4 == 0){	//时钟初始化{
							
			if(KEY_1 == 0 && KEY_2 == 0&& KEY_3 == 1&& KEY_4 == 0){
				Init_1302();
			   lcm_w_test(0,0x80);
				lcm_clr();//清屏
				lcm_w_word("初始化成功!    2008-1-1 00:00.0");
        while(1);
			}
		 }			
     }
   }



				
				






⌨️ 快捷键说明

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