51单片机可调时钟

通过按键实现设置时钟时间

void main()
{
	
	LCD_Init();
	DS1302_Init();
	Timer0Init();
	LCD_ShowString(1,1,"  -  -  ");//静态字符初始化显示
	LCD_ShowString(2,1,"  :  :  ");
	
	DS1302_SetTime();//设置时间
	while(1)
	{
		  KeyNum=Key();//读取键码
			if(KeyNum==1)//按键1用来 来回切换模式
			{
				if(MODE==0){MODE=1;TimeSetSelect=0;}//功能切换
				else if(MODE==1){MODE=0;DS1302_SetTime();}
			}
			switch(MODE)//根据不同的功能执行不同的函数
			{
				case 0:TimeShow();break;
				case 1:TimeSet();break;
			}
	}
}

首先进行一系列的初始化,按键1按下用来切换模式执行不同的功能,MODE是全局变量,初始化为0,即上电执行TimeShow()函数,将时间显示在LCD1602上;当按键1按下,切换模式,并且令TimeSetSelect=0,进入时间设置功能:

若没有按键2、3、4按下,程序会执行LCD的更新显示,通过定时器0,定时500ms对TimeSetFlashFlag按位取反,控制选择项的闪烁功能;

当按键2按下时间设置位开始选择,按下一次选择一位,通过按键3、4进行加减操作

按键3和4是对时间进行加减操作,包含闰年闰月的判断

void TimeSet(void)//时间设置功能
{
	if(KeyNum==2)//按键2按下
	{
		TimeSetSelect++;//设置选择位加1
		TimeSetSelect%=6;//越界清0
//			TimeSetSelect++%=6;
	}
	if(KeyNum==3)//按键3按下
	{
		DS1302_Time[TimeSetSelect]++;//时间设置位数值加1
		if(DS1302_Time[0]>99){DS1302_Time[0]=0;}//年越界判断
		if(DS1302_Time[1]>12){DS1302_Time[1]=1;}//月越界判断
		if(DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 ||DS1302_Time[1]==7 ||
			 DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断
		{
		if(DS1302_Time[2]>31){DS1302_Time[2]=1;}//大月
		}
		else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 ||DS1302_Time[1]==11)
		{
		if(DS1302_Time[2]>30){DS1302_Time[2]=1;}//小月
		}
		else if(DS1302_Time[1]==2)
		{
			   if(DS1302_Time[0]%4==0)
			   {
                 if(DS1302_Time[2]>29){DS1302_Time[2]=1;}//闰年2月
				 }
				 else
				 {
                 if(DS1302_Time[2]>28){DS1302_Time[2]=1;}//平年2月
			   }
		}
		if(DS1302_Time[3]>23){DS1302_Time[3]=0;}//时越界判断
		if(DS1302_Time[4]>59){DS1302_Time[4]=0;}//分越界判断
		if(DS1302_Time[5]>59){DS1302_Time[5]=0;}//秒越界判断

	}
	if(KeyNum==4)//按键3按下
	{
		DS1302_Time[TimeSetSelect]--;//时间设置位数值减1
		if(DS1302_Time[0]<0){DS1302_Time[0]=99;}//年越界判断
		if(DS1302_Time[1]<1){DS1302_Time[1]=12;}//月越界判断
		if(DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 ||DS1302_Time[1]==7 ||
			 DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断
		{
		     if(DS1302_Time[2]<1){DS1302_Time[2]=31;}//大月
			 if(DS1302_Time[2]>31){DS1302_Time[2]=1;}

		}
		else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 ||DS1302_Time[1]==11)
		{
		     if(DS1302_Time[2]<1){DS1302_Time[2]=30;}//小月
		     if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
		}
		else if(DS1302_Time[1]==2)
		{
			   if(DS1302_Time[0]%4==0)
			   {
                  if(DS1302_Time[2]<1){DS1302_Time[2]=29;}//闰年2月
                  if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
			   }
			   else
			   {
                  if(DS1302_Time[2]<1){DS1302_Time[2]=28;}//平年2月
                  if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
			   }
		}
		if(DS1302_Time[3]<0){DS1302_Time[3]=23;}//时越界判断
		if(DS1302_Time[4]<0){DS1302_Time[4]=59;}//分越界判断
		if(DS1302_Time[5]<0){DS1302_Time[5]=59;}//秒越界判断
	}

	//更新显示,根据TimeSetSelect和TimeSetFlashFlag判断可完成闪烁功能
		if(TimeSetSelect==0 && TimeSetFlashFlag==1){LCD_ShowString(1,1,"  ");}
		else {LCD_ShowNum(1,1,DS1302_Time[0],2);}//显示年
		if(TimeSetSelect==1 && TimeSetFlashFlag==1){LCD_ShowString(1,4,"  ");}
		else {LCD_ShowNum(1,4,DS1302_Time[1],2);}//显示月
		if(TimeSetSelect==2 && TimeSetFlashFlag==1){LCD_ShowString(1,7,"  ");}
		else {LCD_ShowNum(1,7,DS1302_Time[2],2);}//显示日
		if(TimeSetSelect==3 && TimeSetFlashFlag==1){LCD_ShowString(2,1,"  ");}
		else {LCD_ShowNum(2,1,DS1302_Time[3],2);}//显示时
		if(TimeSetSelect==4 && TimeSetFlashFlag==1){LCD_ShowString(2,4,"  ");}
		else {LCD_ShowNum(2,4,DS1302_Time[4],2);}//显示分
		if(TimeSetSelect==5 && TimeSetFlashFlag==1){LCD_ShowString(2,7,"  ");}
		else {LCD_ShowNum(2,7,DS1302_Time[5],2);}//显示秒		
//		LCD_ShowNum(2,10,TimeSetSelect,2);
//	  LCD_ShowNum(2,13,TimeSetFlashFlag,2);
}

  • 0
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值