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

📄 ds1302.c

📁 用单片机驱动驱动液晶显示器
💻 C
📖 第 1 页 / 共 2 页
字号:
		if(done==1)
		{
			temp=Read1302(DS1302_SECOND);  //读取秒数
			temp=temp+1;  //秒数加1
			up_flag=1;    //数据调整后更新标志
			if((temp&0x7f)>0x59)   //超过59秒,清零
				temp=0;				
		}else
		{
			TickTime.Second=TickTime.Second+1;
			if (TickTime.Second==59)
			{
				TickTime.Second=0;
			}
		}
					  
		break;
		case 2:
			if (done==1)
			{
				temp=Read1302(DS1302_MINUTE);  //读取分数
				temp=temp+1;  //分数加1
				up_flag=1;
				if(temp>0x59)          //超过59分,清零
					temp=0;
			}else
			{
				TickTime.Minute=TickTime.Minute+1;
					if(TickTime.Minute==59)
						TickTime.Minute=0;
			}
			
			break;
		case 3:
			if (done==1)
			{
				temp=Read1302(DS1302_HOUR);  //读取小时数
				temp=temp+1;  //小时数加1
				up_flag=1;
				if(temp>0x23)   //超过23小时,清零
					temp=0;
			}else
			{
				TickTime.Hour=TickTime.Hour+1;
				if (TickTime.Hour==23)
				{
					TickTime.Hour=0;
				}
				
			}
			break;
		case 4:
			temp=Read1302(DS1302_WEEK);  //读取星期数
			temp=temp+1;  //星期数加1
			up_flag=1;
			if(temp>0x7)  
				temp=1;
			break;
		case 5:
			temp=Read1302(DS1302_DAY);  //读取日数
			temp=temp+1;  //日数加1
			up_flag=1;
			if(temp>0x31)
				temp=1;
			break;
		case 6:
			temp=Read1302(DS1302_MONTH);  //读取月数
			temp=temp+1;  //月数加1
			up_flag=1;
			if(temp>0x12)
				temp=1;
			break;
		case 7:
			temp=Read1302(DS1302_YEAR);  //读取年数
			temp=temp+1;  //年数加1
			up_flag=1;
			if(temp>0x85)
				temp=0;
			break;
		default:break;
		}

		while(Up==0);

	}
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Downkey()//降序按键
{	    
	Down=1;
	if(Down==0)
	{
		mdelay(8);
		switch(count)
		{case 1:
		if(done==1)
		{
		temp=Read1302(DS1302_SECOND);  //读取秒数
		temp=temp-1;						    //秒数减1
		down_flag=1;       //数据调整后更新标志
		if(temp==0x7f)     //小于0秒,返回59秒
			temp=0x59;
			} else{
			if(TickTime.Second==0)
			{
				TickTime.Second=59;
			} else{
				TickTime.Second=TickTime.Second-1;
				}
		}
		break;
		case 2:
		if(	done==1)
		{
			temp=Read1302(DS1302_MINUTE);  //读取分数
			temp=temp-1;  //分数减1
			down_flag=1;
			if(temp==-1)
				temp=0x59;      //小于0秒,返回59秒
		} else{
			if(TickTime.Minute==0)
			{
				TickTime.Minute=59;
			} else{
				TickTime.Minute=TickTime.Minute-1;
				}

		}
			break;
		case 3:
		if(done==1)
		{
			temp=Read1302(DS1302_HOUR);  //读取小时数
			temp=temp-1;  //小时数减1
			down_flag=1;
			if(temp==-1)
				temp=0x23;
		}else{
			if(TickTime.Hour==0)
			{
				TickTime.Hour=23;
			} else{
				TickTime.Second=TickTime.Second-1;
				}

		}
			break;
		case 4:
			temp=Read1302(DS1302_WEEK);  //读取星期数
			temp=temp-1;  //星期数减1
			down_flag=1;
			if(temp==0)
				temp=0x7;;
			break;
		case 5:
			temp=Read1302(DS1302_DAY);  //读取日数
			temp=temp-1;  //日数减1
			down_flag=1;
			if(temp==0)
				temp=31;
			break;
		case 6:
			temp=Read1302(DS1302_MONTH);  //读取月数
			temp=temp-1;  //月数减1
			down_flag=1;
			if(temp==0)
				temp=12;
			break;
		case 7:
			temp=Read1302(DS1302_YEAR);  //读取年数
			temp=temp-1;  //年数减1
			down_flag=1;
			if(temp==-1)
				temp=0x85;
			break;
		default:break;
		}

		while(Down==0);

	}
}

void Setkey()//模式选择按键
{
	Set=1;
	SetTick=1;
	if(Set==0)
	{
		mdelay(8);
		count=count+1;	 //Setkey按一次,count就加1
		done=1;			 //进入调整模式
		while(Set==0);
	}
	if (SetTick==0)
	{
		mdelay(8);
		count=count+1;	 //Setkey按一次,count就加1
		if(count>3)
		{
			count=1;
		}
		adjusttick=1;		 //进入调整闹钟模式
		while(SetTick==0);

	}

}

void keydone()//按键功能执行
{
	  
		
	
		uchar Second;

		if(flag==0)    //关闭时钟,停止计时
		{ Write1302(0x8e,0x00); //写入允许
		temp=Read1302(0x80);
		Write1302(0x80,temp|0x80);
		Write1302(0x8e,0x80); //禁止写入
		flag=1;
		}
		Setkey();				            //扫描模式切换按键
		switch(count)
		{case 1:do					        //count=1,调整秒
		{
			outkey();			   //扫描跳出按钮
			Upkey();                //扫描加按钮
			Downkey();              //扫描减按钮
			if(up_flag==1||down_flag==1)  //数据更新,重新写入新的数据
			{
				Write1302(0x8e,0x00); //写入允许
				Write1302(0x80,temp|0x80); //写入新的秒数
				Write1302(0x8e,0x80); //禁止写入
				up_flag=0;
				down_flag=0;
			}

			hide_sec++;          //位闪计数
			if(hide_sec>3)		 //corrected
				hide_sec=0;
				if(done==1)
				{
					show_time();         //液晶显示数据
				}else{
					show_tick_time();
				}

		}while(count==2);break;  
		case 2:do					        //count=2,调整分
			   {
				   hide_sec=0;
				   outkey();
				   Upkey();
				   Downkey();
				   if(temp>0x60)
					   temp=0;
				   if(up_flag==1||down_flag==1)
				   {
					   Write1302(0x8e,0x00); //写入允许
					   Write1302(0x82,temp); //写入新的分数
					   Write1302(0x8e,0x80); //禁止写入
					   up_flag=0;
					   down_flag=0;
				   }
				   hide_min++;
				   if(hide_min>3)
					   hide_min=0;
				 if(done==1)
				{
					show_time();         //液晶显示数据
				}else{
					show_tick_time();
				}
			   }while(count==3);break;
		case 3:do					        //count=3,调整小时
			   {
				   hide_min=0; 
				   outkey();
				   Upkey();
				   Downkey();
				   if(up_flag==1||down_flag==1)
				   {
					   Write1302(0x8e,0x00); //写入允许
					   Write1302(0x84,temp); //写入新的小时数
					   Write1302(0x8e,0x80); //禁止写入
					   up_flag=0;
					   down_flag=0;
				   }
				   hide_hour++;
				   if(hide_hour>3)
					   hide_hour=0;
				if(done==1)
				{
					show_time();         //液晶显示数据
				}else{
					show_tick_time();
				}
			   }while(count==4);break;
		case 4:do					        //count=4,调整星期
			   {
				   hide_hour=0; 
				   outkey();
				   Upkey();
				   Downkey();
				   if(up_flag==1||down_flag==1)
				   {
					   Write1302(0x8e,0x00); //写入允许
					   Write1302(0x8a,temp); //写入新的星期数
					   Write1302(0x8e,0x80); //禁止写入
					   up_flag=0;
					   down_flag=0;
				   }
				   hide_week++;
				   if(hide_week>3)
					   hide_week=0;
				   show_time();
			   }while(count==5);break;
		case 5:do					        //count=5,调整日
			   {
				   hide_week=0; 
				   outkey();
				   Upkey();
				   Downkey();
				   if(up_flag==1||down_flag==1)
				   {
					   Write1302(0x8e,0x00); //写入允许
					   Write1302(0x86,temp); //写入新的日数
					   Write1302(0x8e,0x80); //禁止写入
					   up_flag=0;
					   down_flag=0;
				   }
				   hide_day++;
				   if(hide_day>3)
					   hide_day=0;
				   show_time();
			   }while(count==6);break;
		case 6:do					        //count=6,调整月
			   {
				   hide_day=0; 
				   outkey();
				   Upkey();
				   Downkey();
				   if(up_flag==1||down_flag==1)
				   {
					   Write1302(0x8e,0x00); //写入允许
					   Write1302(0x88,temp); //写入新的月数
					   Write1302(0x8e,0x80); //禁止写入
					   up_flag=0;
					   down_flag=0;
				   }
				   hide_month++;
				   if(hide_month>3)
					   hide_month=0;
				   show_time();
			   }while(count==7);break;
		case 7:do					        //count=7,调整年
			   {
				   hide_month=0; 
				   outkey();
				   Upkey();
				   Downkey();
				   if(up_flag==1||down_flag==1)
				   {
					   Write1302(0x8e,0x00); //写入允许
					   Write1302(0x8c,temp); //写入新的年数
					   Write1302(0x8e,0x80); //禁止写入
					   up_flag=0;
					   down_flag=0;
				   }
				   hide_year++;
				   if(hide_year>3)
					   hide_year=0;
				   show_time();
			   }while(count==8);break;
		case 8: count=0;hide_year=0;  //count8, 跳出调整模式,返回默认显示状态
			Second=Read1302(DS1302_SECOND);
			Write1302(0x8e,0x00); //写入允许
			Write1302(0x80,Second&0x7f);
			Write1302(0x8E,0x80);          //禁止写入
			done=0;
			break; //count=7,开启中断,标志位置0并退出
		default:break;

		}


}


void show_time()   //液晶显示程序
{
	DS1302_GetTime(&CurrentTime);  //获取时钟芯片的时间数据
	TimeToStr(&CurrentTime);       //时间数据转换液晶字符
	DateToStr(&CurrentTime);       //日期数据转换液晶字符
	ReadTemp();                    //开启温度采集程序
	temp_to_str();                 //温度数据转换成液晶字符
	GotoXY(12,1);                  //液晶字符显示位置
	Print(TempBuffer);             //显示温度
	GotoXY(0,1);
	Print(CurrentTime.TimeString); //显示时间
	GotoXY(0,0);
	Print(CurrentTime.DateString); //显示日期
	GotoXY(15,0);
	Print(week_value);             //显示星期
	GotoXY(11,0);
	Print("Week");	//在液晶上显示 字母 week
	Delay1ms(400);                 //扫描延时
}
void show_tick_time()
{
	TimeToStr(&TickTime);
	GotoXY(0,1);
	Print(TickTime.TimeString); //显示时间

	Delay1ms(400);                 //扫描延时

}



main()
{
	flag=1;           //时钟停止标志
	LCD_Initial();    //液晶初始化
	Init_DS18B20( ) ;      //DS18B20初始化
	Initial_DS1302(); //时钟芯片初始化
	up_flag=0;
	down_flag=0;
	done=0;           //进入默认液晶显示
	while(1)
	{
		
		Setkey();  
		while(done==1)
		{
			keydone();    //进入调整模式
		}
		
		while(adjusttick==1&&done==0)
		{
			keydone(); //进入调整闹钟模式
			show_tick_time();
			}
		while(done==0&&adjusttick==0)
		{  
			show_time();                //液晶显示数据
			flag=0;                  
			Setkey();				 //扫描各功能键
		}	
	
	}
}




⌨️ 快捷键说明

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