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

📄 time.c

📁 用NXP公司P89LPC9401单片机开发液晶显示,包括开发资料,各功能驱动程序.
💻 C
字号:
//***********************************************************************
//FILE: time.c
//功能:	定义与时间相关的所有变量和相关处理函数
//***********************************************************************
#include"main.h"
#include"spi.h"
#include"key.h"
//***********************************************************************
uchar	HalfSec;					//秒信号量
uchar	Year;						//年低位	
uchar	Month;						//月
uchar	Day;						//日
uchar	Hour;						//小时
uchar	Minute;						//分钟
uchar	Second;						//秒
uchar	AlarmHour;					//闹钟小时
uchar	AlarmMinute;				//闹钟分钟
uchar	Alarm;						//闹钟LED闪烁变量
bit		Ampm;						//AM/PM
bit		AlarmAmpm;					//闹钟AM/PM
bit		BeepAlarm;					//闹钟标志
bit 	RTCflag;
//***********************************************************************
uchar  code  DayTab[]=				//月份天数表
{									//2月除外
	31,28,31,30,31,30,
	31,31,30,31,30,31
};
//***********************************************************************
bit		AddSecond()					//秒加1函数
{	
	if(Second<59)					//秒<59
	{
		Second++;					//秒加1
		return(0);					//返回进位标志为0
	}
	else							//秒>=59
	{
		Second=0;					//秒清零
		return(1);					//返回进位标志为1
	}
}
//***********************************************************************
bit		ModifyMinute(bit b)			//分调整函数
{									//(b=1加1,否则减1)下同
	if(b==1)						//加1操作
	{
		if(Minute<59)				//分<59
		{
			Minute++;				//分加1
			return(0);				//返回进位标志为0	
		}
		else						//分>=59
		{
			Minute=0;				//分清零	
			return(1);				//返回进位标志为1
		}
   	}
	else							//减1操作
	{
		if(Minute>0)				//分>0
			Minute--;				//分减1
		else						//分等于0
			Minute=59;				//分=59	
		return(0);					//返回无进位标志
	 }
}
//***********************************************************************
bit		ModifyHour(bit b)			//小时调整函数
{
	if(b==1)						//加1操作
	{
		if(Hour<12)					//小时<12
		{
			Hour++;					//小时加1
			return(0);				//返回进位标志0
		}
		else						//小时>=12
		{				
			Hour=1;					//小时=1
			Ampm=!Ampm;				//取反AM/PM
			return(!Ampm);			//如果AM为0则返回进位标志1
		}
   	}
	else							//减1操作
	{
		if(Hour>1)					//如果小时>1
			Hour--;					//则小时减1
		else						//否则
		{
			Hour=12;				//小时=12
			Ampm=!Ampm;				//取反AMPM标志
		}
		return(0);					//返回无进位标志
	 }

}
//***********************************************************************
void	ModifyAlarmMinute(bit b)	//闹钟分调整函数
{
	if(b==1)						//加1操作
	{
		if(AlarmMinute<59)			//小于59则加1
			AlarmMinute++;
		else						//否则清零		
			AlarmMinute=0;
	}
	else							//减1操作
	{
		if(AlarmMinute>0)			//大于0则减1
			AlarmMinute--;
		else						//否则设置为59		
			AlarmMinute=59;
	}
}

//***********************************************************************
void	ModifyAlarmHour(bit b)		//闹钟小时调整函数
{
	if(b==1)						//加法操作
	{
		if(AlarmHour<12)			//<12则加1
			AlarmHour++;
		else						//否则闹钟小时置为1
		{
			AlarmHour=1;
			AlarmAmpm=!AlarmAmpm;	//取反闹钟AM/PM
		}
	}
	else							//减1操作
	{
		if(AlarmHour>1)				//如果闹钟小时>1
			AlarmHour--;			//则减1
		else
		{
			AlarmHour=12;			//否则则置为12
			AlarmAmpm=!AlarmAmpm;	//取反闹钟AMPM标志
		}
	}
}

//***********************************************************************
bit		ModifyDay(bit b)			//天调整函数
{
	uchar month2;
	if(b==1)						//天加1操作
	{
		if(Day<DayTab[Month]&&Month!=2)
		{
			Day++;					//如果天<当月最大天数,并且不是2月
			return(0);				//则天加1,并且返回进位标志0
		}
		else if(Month==2)			//如果当前是2月
		{							//取得今年2月的最大天数
			month2=((Year&0x03)==0)?29:28;
			if(Day<month2)			//如果小于最大天数
			{
				Day++;				//则加1
				return(0);			//无进位
			}
			else					//否则
			{
				Day=1;				//天置为1
				return(1);			//有进位标志
			}				
    	}
		else						//大于或等于本月最大天数
		{
			Day=1;					//置天数为1
	    	return(1);				//有进位
		}
	}	
	else							//天减1操作
	{
		if(Day>1)					//如果天大于1
			Day--;					//则天减1
		else if(Month==2)			//否则,如果当前是2月
			Day=((Year&0x03)==0)?29:28;//取今年的2月的最大天数
		else						
			Day=DayTab[Month];		//为其它月,取其对应的最大天数	
		return(0);					//无进位标志
	}
}
//***********************************************************************
bit		ModifyMonth(bit b)			//月调整函数
{
	if(b==1)						//月加1操作
	{
		if(Month<12)				//<12则月加1
		{
			Month++;
			return(0);				//返回进位标志0
		}
		else
		{
			Month=1;				//否则,月置为1
			return(1);				//返回进位标志1
		}
	}
	else							//月减1操作
	{
		if(Month>1)					//月>1,则减1
			Month--;
		else						//否则月置为12
			Month=12;				
		return(0);					//返回无进位标志
	}
}
//***********************************************************************
void	ModifyYear(bit b)			//年调整函数
{
	if(b==1)						//年加1操作
	{
		if(Year<99) 				//年<99则加1
			Year++;
		else						//否则置为0		 
			Year=0;
	}
	else							//年减1操作
	{
		if(Year>0)					//年>0则减1
			Year--;
		else						//否则将年置为99
			Year=99;
	}
}	
//***********************************************************************
void	TimeAdjuest()				//时间调整函数
{
if(AddSecond())						//秒加1,如产生进位标志1,则使分钟加1
	if(ModifyMinute(1))				//分加1,如产生进位标志1,则使小时加1
		if(ModifyHour(1))			//小时加1,如产生进位标志1,则使天加1
			if(ModifyDay(1))		//天加1,如产生进位标志1,则使月加1
				if(ModifyMonth(1))	//月加1,如产生进位标志1,则使年加1
					ModifyYear(1);		 
}
//***********************************************************************
void	TimeBeep()				//时间报警函数
{
	if(AlarmHour==Hour&&AlarmMinute==Minute&&AlarmAmpm==Ampm)
	{							//判断是否与闹钟设置值完全符合
		BEEP=0;					//符合则使BEEP报警
		BeepAlarm=1;			//同时设置闹钟报警标志
		Alarm=~Alarm;			
		SendDatTo595(Alarm);	//使8个LED进行闪烁	
	}
	else	
	{
		SendDatTo595(0xff<<Mode);//将无闹钟报警,则LED指模式	
		BeepAlarm=0;			//否则清除闹钟报警标志
		if(Minute==0&&Second==0)//判断是否是整点
			BEEP=0;				//是,则进行整点提示
		else	BEEP=1;			//不满足任何报警情况,关闭蜂鸣器。
	}

}

//***********************************************************************
void	RTCINT()  interrupt 10	//RTC中断,中断频率为1Hz
{
	RTCCON=0x43;				//清楚RTC中断标志
	RTCflag=1;					//置RTC中断标志
	HalfSec++;					//半秒信号量加1
}
//*********************************END***********************************
		

⌨️ 快捷键说明

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