www.pudn.com > LED-dianzheng.zip > timeset.h, change:2012-11-15,size:10181b


sbit SET=P3^0;	//DS1302设置模式选择位 
sbit ADD=P3^1;	//增加 
sbit RED=P3^2;	//减小 
sbit CANL=P3^3; //取消 
sbit beep=P1^4; 
int mode=0,a0; 
void delay1ms(int i)//1毫秒延时 
{ 
   int j,k; 
   while(i--) 
   for(j=76;j>1;j--); 
   for(k=29;k>1;k--);					 
 } 
void hourset()		//调时 
{ 
	unsigned char timevalue; 
	int hour; 
	delay1ms(500);	//防止多次触发 
	WriteSet1302(0x8e,0x00);//将写保护去掉,确保能正常将调整后的数值写入DS1302 
	timevalue=ReadSet1302(0x85); //读取此时小时寄存器当中的数值 
	hour=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));//因为DS1302中的数值是以BCD码的形式存在,所以要将其转换为十进制 
	while(1) 
	{ 
				if(ADD==0)//如果“增加”按钮被按下 
				{ 
					delay1ms(50);//消抖 
					if(ADD==0)//再次确认如果“增加”按钮被按下 
					{ 
						hour++;//小时自增 
						if(hour>=24)//如果小时大于23 
						{ 
							hour=0;//小时置0 
						} 
						while(ADD==0);//等待该按钮被释放 
					} 
				} 
 
				if(RED==0)//如果“减小”按钮被按下 
				{ 
					delay1ms(50);//消抖 
					if(RED==0)//再次确认如果“减小”按钮被按下 
					{ 
						hour--;//小时自减 
						if(hour<=-1)//如果小时小于0  
						{ 
							hour=23;//小时的个位置9 
						} 
						while(RED==0);//等待该按钮被释放 
					} 
				} 
			timevalue=(((hour)/10)<<4|(hour%10));//此时真实的时间值为调试过后的值,将其转换为十六进制 
			WriteSet1302(0x84,timevalue);//将此时被调试后的值写入小时寄存器当中去 
			display_h(hour); 
			if(CANL==0)  
			{ 
				mode=0; 
				break; 
			} 
		if(SET==0) break; 
	} 
	WriteSet1302(0x8e,0x80);//打开写保护 
} 
 
 
void minuteset() 
{ 
	unsigned char timevalue; 
	int minute; 
	delay1ms(500);	//防止多次触发 
	WriteSet1302(0x8e,0x00);//将写保护去掉,确保能正常将调整后的数值写入DS1302 
	timevalue=ReadSet1302(0x83); //读取此时分钟寄存器当中的数值 
	minute=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));//因为DS1302中的数值是以BCD码的形式存在,所以要将其转换为十进制 
	while(1) 
	{ 
			if(ADD==0)//如果“增加”按钮被按下 
				{ 
					delay1ms(50);//消抖 
					if(ADD==0)//再次确认如果“增加”按钮被按下 
					{			 
						delay1ms(100);//适当延时 
						minute++;//秒钟自增 
						if(minute>=60)//如果秒钟大于等于60 
						{ 
							minute=0;//秒钟置0 
						} 
						while(ADD==0);//等待该按钮被释放 
					} 
				} 
 
			if(RED==0)//如果“减小”按钮被按下 
				{ 
					delay1ms(50);//消抖 
					if(RED==0)//再次确认如果“减小”按钮被按下 
					{ 
						delay1ms(100);//适当延时 
						minute--;//秒钟自减 
						if(minute<=-1)//如果秒钟小于0 
						{ 
							minute=59;//秒钟置59 
						} 
						while(ADD==0);//等待该按钮被释放 
					} 
				} 
 
			timevalue=(((minute)/10)<<4|(minute%10));//此时真实的时间值为调试过后的值,将其转换为十六进制 
			WriteSet1302(0x82,timevalue);//将此时被调试后的值写入分钟寄存器当中去 
			display_m(minute); 
			if(CANL==0)  
			{ 
				mode=0; 
				break; 
			} 
		if(SET==0) break;	 
	} 
	WriteSet1302(0x8e,0x80);//打开写保护 
} 
 
void secondset() 
{ 
	unsigned char timevalue; 
	int second; 
	delay1ms(500);	//防止多次触发 
	WriteSet1302(0x8e,0x00);//将写保护去掉,确保能正常将调整后的数值写入DS1302 
	timevalue=ReadSet1302(0x81); //读取此时秒钟寄存器当中的数值 
	second=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));//因为DS1302中的数值是以BCD码的形式存在,所以要将其转换为十进制 
	while(1) 
	{ 
			if(ADD==0)//如果“增加”按钮被按下 
				{ 
					delay1ms(50);//消抖 
					if(ADD==0)//再次确认如果“增加”按钮被按下 
					{			 
						delay1ms(100);//适当延时 
						second++;//秒钟自增 
						if(second>=60)//如果秒钟大于等于60 
						{ 
							second=0;//秒钟置0 
						} 
						while(ADD==0);//等待该按钮被释放 
					} 
				} 
 
			if(RED==0)//如果“减小”按钮被按下 
				{ 
					delay1ms(50);//消抖 
					if(RED==0)//再次确认如果“减小”按钮被按下 
					{ 
						delay1ms(100);//适当延时 
						second--;//秒钟自减 
						if(second<=-1)//如果秒钟小于0 
						{ 
							second=59;//秒钟置59 
						} 
						while(ADD==0);//等待该按钮被释放 
					} 
				} 
 
			timevalue=(((second)/10)<<4|(second%10));//此时真实的时间值为调试过后的值,将其转换为十六进制 
			WriteSet1302(0x80,timevalue);//将此时被调试后的值写入秒钟寄存器当中去 
			display_s(second); 
			if(CANL==0)  
			{ 
				mode=0; 
				break; 
			} 
		if(SET==0) break;	 
	} 
	WriteSet1302(0x8e,0x80);//打开写保护 
} 
 
/* 
void yearset() 
{ 
	unsigned char timevalue; 
	int year; 
	delay1ms(500);	//防止多次触发 
	WriteSet1302(0x8e,0x00);//将写保护去掉,确保能正常将调整后的数值写入DS1302 
	timevalue=ReadSet1302(0x8d); //读取此时年份寄存器当中的数值 
	year=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));//因为DS1302中的数值是以BCD码的形式存在,所以要将其转换为十进制 
	while(1) 
	{ 
			if(ADD==0)//如果“增加”按钮被按下 
				{ 
					delay1ms(50);//消抖 
					if(ADD==0)//再次确认如果“增加”按钮被按下 
					{			 
						delay1ms(100);//适当延时 
						year++;//年份自增 
						if(year>=100)//如果年份大于等于100 
						{ 
							year=0;//年份置0 
						} 
						while(ADD==0);//等待该按钮被释放 
					} 
				} 
 
			if(RED==0)//如果“减小”按钮被按下 
				{ 
					delay1ms(50);//消抖 
					if(RED==0)//再次确认如果“减小”按钮被按下 
					{ 
						delay1ms(100);//适当延时 
						year--;//年份自减 
						if(year<=-1)//如果年份小于0 
						{ 
							year=99;//秒钟置59 
						} 
						while(ADD==0);//等待该按钮被释放 
					} 
				} 
 
			timevalue=(((year)/10)<<4|(year%10));//此时真实的时间值为调试过后的值,将其转换为十六进制 
			WriteSet1302(0x8c,timevalue);//将此时被调试后的值写入年份寄存器当中去 
			display_y(year); 
			if(CANL==0)  
			{ 
				mode=0; 
				break; 
			} 
		if(SET==0) break;	 
	} 
	WriteSet1302(0x8e,0x80);//打开写保护 
} 
*/ 
void monthset() 
{ 
	unsigned char timevalue; 
	int month; 
	delay1ms(500);	//防止多次触发 
	WriteSet1302(0x8e,0x00);//将写保护去掉,确保能正常将调整后的数值写入DS1302 
	timevalue=ReadSet1302(0x89); //读取此时月份寄存器当中的数值 
	month=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));//因为DS1302中的数值是以BCD码的形式存在,所以要将其转换为十进制 
	while(1) 
	{ 
			if(ADD==0)//如果“增加”按钮被按下 
				{ 
					delay1ms(50);//消抖 
					if(ADD==0)//再次确认如果“增加”按钮被按下 
					{			 
						delay1ms(100);//适当延时 
						month++;//月份自增 
						if(month>=13)//如果月份大于等于13 
						{ 
							month=1;//月份置1 
						} 
						while(ADD==0);//等待该按钮被释放 
					} 
				} 
 
			if(RED==0)//如果“减小”按钮被按下 
				{ 
					delay1ms(50);//消抖 
					if(RED==0)//再次确认如果“减小”按钮被按下 
					{ 
						delay1ms(100);//适当延时 
						month--;//月份自减 
						if(month<=0)//如果月份小于0 
						{ 
							month=12;//月份置12 
						} 
						while(ADD==0);//等待该按钮被释放 
					} 
				} 
 
			timevalue=(((month)/10)<<4|(month%10));//此时真实的时间值为调试过后的值,将其转换为十六进制 
			WriteSet1302(0x88,timevalue);//将此时被调试后的值写入年份寄存器当中去 
			display_month(month); 
			if(CANL==0)  
			{ 
				mode=0; 
				break; 
			} 
		if(SET==0) break;	 
	} 
	WriteSet1302(0x8e,0x80);//打开写保护 
} 
 
void dateset() 
{ 
	unsigned char timevalue; 
	int date; 
	delay1ms(500);	//防止多次触发 
	WriteSet1302(0x8e,0x00);//将写保护去掉,确保能正常将调整后的数值写入DS1302 
	timevalue=ReadSet1302(0x87); //读取此时日期寄存器当中的数值 
	date=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));//因为DS1302中的数值是以BCD码的形式存在,所以要将其转换为十进制 
	while(1) 
	{ 
			if(ADD==0)//如果“增加”按钮被按下 
				{ 
					delay1ms(50);//消抖 
					if(ADD==0)//再次确认如果“增加”按钮被按下 
					{			 
						delay1ms(100);//适当延时 
						date++;//日期自增 
						if(date>=32)//如果日期大于等于32 
						{ 
							date=1;//日期置1 
						} 
						while(ADD==0);//等待该按钮被释放 
					} 
				} 
 
			if(RED==0)//如果“减小”按钮被按下 
				{ 
					delay1ms(50);//消抖 
					if(RED==0)//再次确认如果“减小”按钮被按下 
					{ 
						delay1ms(100);//适当延时 
						date--;//日期自减 
						if(date<=0)//如果日期小于0 
						{ 
							date=31;//日期置31 
						} 
						while(ADD==0);//等待该按钮被释放 
					} 
				} 
 
			timevalue=(((date)/10)<<4|(date%10));//此时真实的时间值为调试过后的值,将其转换为十六进制 
			WriteSet1302(0x86,timevalue);//将此时被调试后的值写入日期寄存器当中去 
			display_d(date); 
			if(CANL==0)  
			{ 
				mode=0; 
				break; 
			} 
		if(SET==0) break;	 
	} 
	WriteSet1302(0x8e,0x80);//打开写保护 
} 
 
void alarmhourset(void)	 //闹钟小时调整 
{ 
	unsigned char value; 
	value=houra; 
	delay1ms(500);	//防止多次触发 
    while(1) 
    { 
   		if(ADD==0) 
		{ 
			delay1ms(50); 
			if(ADD==0) 
			{ 
				delay1ms(100); 
				value++; 
				if(value>23) value=0; 
				while(ADD==0); 
			} 
		} 
		if(RED==0) 
		{ 
			delay1ms(50); 
			if(RED==0) 
			{ 
				delay1ms(100); 
				value--; 
				if(value==0) value=23; 
				while(RED==0); 
			} 
		} 
		houra=value; 
		display_houra(houra); 
		if(CANL==0)  
			{ 
				mode=0; 
				break; 
			} 
		if(SET==0) break;	 
    } 
} 
void alarmminuteset(void)	//闹钟分钟调整 
{ 
	unsigned char value; 
	value=minutea; 
	delay1ms(500);	//防止多次触发 
    while(1) 
    { 
   		if(ADD==0) 
		{ 
			delay1ms(50); 
			if(ADD==0) 
			{ 
				delay1ms(100); 
				minutea++; 
				if(minutea>59) minutea=0; 
				while(ADD==0) ; 
			} 
		} 
		if(RED==0) 
		{ 
			delay1ms(50); 
			if(RED==0) 
			{ 
				delay1ms(100); 
				minutea--; 
				if(minutea==0) minutea=59; 
				while(RED==0) ; 
			} 
		} 
		display_minutea(minutea); 
		if(CANL==0)  
			{ 
				mode=0; 
				break; 
			} 
		if(SET==0) break;	 
   } 
} 
void alarm() 
{ 
	int i=2,j=2; 
	while(1) 
	{ 
		if((hour==houra)&&(minute==minutea)&&(second==0)) 
		{ 
					 
				while(1) 
				{		 
					display();								 
					if(CANL==0) 
					{	delay1ms(5); 
						while(CANL==0);			 
						delay1ms(5);					 
						break; 
					} 
				} 
		} 
		break; 
	} 
} 
 
void Timeset()	//时间调整函数 
{ 
	if(SET==0) 
	{ 
		delay1ms(10); 
		if(SET==0) 
		{ 
			mode++; 
			switch(mode) 
			{ 
				case(1):  
					   {hourset();} 
						break; 
				case(2):  
						{minuteset();} 
						break; 
				case(3): 
						{secondset();}  
						break; 
				case(4): 
						{monthset();}  
						break; 
				case(5): 
						{dateset();}  
						break;	 
				case(6): 
						{alarmhourset();} 
						break; 
				case(7): 
						{alarmminuteset();} 
						break; 
			} 
			if(mode==8) mode=0; 
		} 
	} 
}