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

📄 ds1302.c

📁 时钟心片 DS1302的控制原码程序
💻 C
字号:

#include"DS1302.h"
#include"Port.h"
#include "Lcd.h"
#include "Variable.h"
#include "AD_key.h"
#include "LC75883.h"

#define TESTWB 0

void     vDS1302_SendByte(UCHAR Command,UCHAR XmtDat)
{
	UCHAR i;
 	Timer_CE=0;
 	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
 	Timer_CLK=0;
 	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
 	Timer_CE=1;
 	for(i=0;i<8;i++)
 	{
 		Timer_Data_OUT= (Command&0x01);
 		Command = Command >> 1;
  		Timer_CLK=1; 
  		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
  		Timer_CLK=0; 
		asm("nop");
		asm("nop");
		asm("nop");
  	}     
	for(i=0;i<8;i++)
 	{
 		Timer_Data_OUT= (XmtDat&0x01);
  		XmtDat = XmtDat >> 1;
  		Timer_CLK=1; 
  		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
  		Timer_CLK=0; 
		asm("nop");
		asm("nop");
		asm("nop");
  	}
 	Timer_CE=0;     
}

/*;接收数据程序;
//;名称:Receive_Byte
//;描述:从被控器DS1302 接收1个字节数据
//;命令字节地址在Command 中
//;接收的数据在RcvDat 缓冲区中
//;*************************************************************/

UCHAR ucDS1302_ReceiveByte(UCHAR Command)
{
	UCHAR i, RcvDat=0;
 	Timer_CE=0;
 	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
 	Timer_CLK=0;
 	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
 	Timer_CE=1;
 	for(i=0;i<8;i++)
 	{
 		Timer_Data_OUT= (Command&0x01);
  		Command = Command >> 1;
  		Timer_CLK=1; 
  		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
  		Timer_CLK=0; 
		asm("nop");
		asm("nop");
		asm("nop");
  	} 
  	Timer_Data_Mode = IN;    
	for(i=0;i<7;i++)
 	{
  		if(Timer_Data_IN/*DS1302_IO*/)
			RcvDat|=0x80;
  		RcvDat= RcvDat >> 1;
  		Timer_CLK=1;
  		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
  		Timer_CLK=0; 
		asm("nop");
		asm("nop");
		asm("nop");
  	}
 	/*if(IO_DATA)RcvDat|=0x80;*/
 	Timer_CE=0;
	Timer_Data_Mode = OUT;
	return      RcvDat;
}
/*允许数据写入寄存器*/
void vDS1302_WriteEnable(void)
{
	vDS1302_SendByte(ds_com,00);
}
/*禁止数据写入寄存器*/
void vDS1302_WriteDisable(void)
{
	vDS1302_SendByte(ds_com,0x80);
}
/*起动时钟操作*/
void vDS1302_OscEnable(void)
{
	vDS1302_SendByte(ds_sec,0x00);
}
/*钟停止位操作*/
void vDS1302_OscDisable(void)
{
	vDS1302_SendByte(ds_sec,0x80);
}

void  vDS1302_limit(void)
{
	vRead_Time();
	vDS1302_WriteEnable();
	/*chu0524Lost clock setting by rapid recycling power*/
	Time.ucMin = (Time.ucMin/10)<<4 | Time.ucMin%10;
	vDS1302_Write(1,Time.ucMin);
	Time.ucSecond=((Time.ucSecond/10*16)|(Time.ucSecond%10));
	Time.ucSecond&= 0x7f;
	vDS1302_SendByte(ds_sec,Time.ucSecond);
	vDS1302_SendByte(0x90,0xa5);	/*使用涓流充电,TCS 1010,DS 01,RS 10*/	
}

UCHAR ucDS1302_Read(UCHAR address)
{
	UCHAR dat;
	vDS1302_WriteEnable();
	 switch(address)
	 {
	 	case 0:dat=ucDS1302_ReceiveByte(ds_sec+1);break;
   		case 1:dat=ucDS1302_ReceiveByte(ds_min+1);break;
	   	case 2:dat=ucDS1302_ReceiveByte(ds_hour+1);break;
   		case 3:dat=ucDS1302_ReceiveByte(ds_day+1);break;
   		case 4:dat=ucDS1302_ReceiveByte(ds_week+1);break;
   		case 5:dat=ucDS1302_ReceiveByte(ds_month+1);break;
   		case 6:dat=ucDS1302_ReceiveByte(ds_year+1);break;
		case 7:dat=ucDS1302_ReceiveByte(ds_time_second +1);break;
		case 8:dat=ucDS1302_ReceiveByte(ds_time_hour + 1);break;
   	}
	vDS1302_WriteDisable();
	return(dat);

}

void vDS1302_Write(UCHAR address,UCHAR dat)
{ 
	vDS1302_WriteEnable();
 	switch(address)
  	{
  		case 0:vDS1302_SendByte(ds_sec,dat);break;
   		case 1:vDS1302_SendByte(ds_min,dat);break;
   		case 2:vDS1302_SendByte(ds_hour,dat);break;
   		case 3:vDS1302_SendByte(ds_day,dat);break;
   		case 4:vDS1302_SendByte(ds_week,dat);break;
   		case 5:vDS1302_SendByte(ds_month,dat);break;
   		case 6:vDS1302_SendByte(ds_year,dat);break;
		case 7:vDS1302_SendByte(ds_time_second,dat);break;
		case 8:vDS1302_SendByte(ds_time_hour,dat);break;
    }
  vDS1302_WriteDisable();
}
 UCHAR ucSencond;
void vRead_Time(void)
{
	if(Time_Set_Flag)
	{
		if(uiTime_Flash_Num > 500)
		{
			uiTime_Flash_Num = 0;
			Time_Flash_Flag =! Time_Flash_Flag;
		}
		ucSencond = Time.ucSecond; 
		if(ucKeyq)
		{
			Time_Flash_Flag = 0;
			uiExit_num = 0;
			uiTime_Flash_Num = 0; 
		}
		if(!Disp_Flag)
			Time_Set_Flag = 0;
		if(uiExit_num > 5000)		/* 10S */
		{
			Time_Set_Flag = 0;
			Disp_Flag = 0;
			Time_Flash_Flag = 0;
			vDS1302_Write(0,0);	/* ? */
			if(ucModeKey == RADIO)
				Reflash_radio_disp_register();
		}
		if(ucKeyq == ADVANCE  && !ucPSflash)  
		{
			Time.ucMin ++;
			if(Time.ucMin == 60)
				Time.ucMin = 0;
			Time.ucMin = (Time.ucMin/10)<<4 | Time.ucMin%10;
			vDS1302_Write(1,Time.ucMin);
			ucKeyq = 0;
			vDS1302_Write(0,0);
			ucPSflash = T300MS;
		}
		if(ucKeyq == BACK  && !ucPSflash) 
		{
			Time.ucHour ++;
			if(Time.ucHour == 24)
				Time.ucHour = 0;
			Time.ucHour = (Time.ucHour/10)<<4 | Time.ucHour%10;
			vDS1302_Write(2,Time.ucHour);
			ucKeyq = 0;
			ucPSflash = T300MS;
		}
		if(ucKeyq == ADVANCE || ucKeyq == BACK)
	          	ucKeyq = 0;
		
	}
	Time.ucHour = ucDS1302_Read(2);
	Time.ucHour = (Time.ucHour >> 4)*10 + (Time.ucHour & 0x0f);
	if(Time.ucHour >=24)/*chu0409  对时钟读错的时候进行纠错*/
		Time.ucHour = 0;
	Time.ucMin = ucDS1302_Read(1);
	Time.ucMin = (Time.ucMin >> 4)*10 + (Time.ucMin & 0x0f);
	if(Time.ucMin >=60)/*chu0409  对时钟读错的时候进行纠错*/
		Time.ucMin = 0;
	Time.ucSecond = ucDS1302_Read(0);
	Time.ucSecond = (Time.ucSecond >> 4)*10 + (Time.ucSecond & 0x0f);
	if(Time.ucSecond >=60)/*chu0409  对时钟读错的时候进行纠错*/
		Time.ucSecond = 0;
}

#if 1
void DS_main(void)
{
	UCHAR hg,hd,mg,md;
	UCHAR ucTime;
	vRead_Time();
	#if 1
	#if 0
	if(!Time_Set_Flag)
		if(Time.ucSecond== Time_rember)
			return;
	#endif
	if(Audio_Flag || Mute_Flag || Software_Flag ||FJensen_Logo)
		return;
	if(Fpa_in || FLogo || FDoorDet)
		return;
	if(!Time_Set_Flag)
	{
		if(!ucTimeFlash)
		{
			Time_Dot_Flash_Flag =! Time_Dot_Flash_Flag;
			ucTimeFlash = 0xFF;
		}
		else 
			return;
	}
	else
		Time_Dot_Flash_Flag = 1;
	if((XM_Display_Flag || SR_Disp_Flag || FiPod_doulbe_display || FCD_Disp) && Power_Flag)
	{
		/* 070419 dawei : aim to no time display while change mode in double mode  */
		if(ucModeKey != SIRIUS && SR_Disp_Flag)
			SR_Disp_Flag = 0;
		if(FiPod_doulbe_display && ucModeKey != iPOD)
			FiPod_doulbe_display = 0;
		if(FCD_Disp && ucModeKey != CD_MP3)
			FCD_Disp = 0;
		return;	
	}
	#if USE_XM
	/* 061130 : For Diagnostic*/
	if(Fdiagdisplay)
		return;
	#endif
	if(!Clock_Flag &&(Time.ucHour == 0))
		ucTime = 12;
	else if(!Clock_Flag && Time.ucHour > 12)
		ucTime  = Time.ucHour - 12;
	else
		ucTime  = Time.ucHour;
	hg = ucTime/10;
	hd = ucTime %10;
	mg = Time.ucMin/10;
	md = Time.ucMin % 10;
	if(!Power_Flag && FDoorDisp && !FLcdTest && !FPowerLowDisp)
	{
#if  TESTWB
		vUC1608DoubleLine(1,0,' ');
		vUC1608DoubleLine(1,1,gwb.ulGwb_Wbalert_Time/100);
		vUC1608DoubleLine(1,2,gwb.ulGwb_Wbalert_Time%100/10);
		vUC1608DoubleLine(1,3,gwb.ulGwb_Wbalert_Time%100%10);
		vUC1608DoubleLine(1,4,' ');
		vUC1608DoubleLine(1,5,' ');
		vUC1608DoubleLine(1,6,' ');
		vUC1608DoubleLine(1,7,gwb.ucGwb_currnum);

#else
		if(!Clock_Flag)
		{
			if(!Time_Flash_Flag)
			{
				if(FPowerLow)
				{
					vUC1608DoubleLine(1,1,' ');
					vUC1608DoubleLine(1,2,' ');
					vUC1608DoubleLine(1,3,' ');
					vUC1608DoubleLine(1,9,' ');
					vUC1608DoubleLine(1,10,' ');
					vUC1608DoubleLine(1,11,' ');
					vLC75883_WriteChar(0,' ');
					vLC75883_WriteChar(1,' ');
					vLC75883_WriteChar(6,' ');
					vLC75883_WriteChar(7,' ');
				}
				if(ucTime >= 10)
				{
				vUC1608DoubleLine(1,4,hg);
					vLC75883_WriteChar(2,hg);
				}
				else
				{
					vUC1608DoubleLine(1,4,' ');
					vLC75883_WriteChar(2,' ');
				}
				vUC1608DoubleLine(1,5,hd);
				vUC1608DoubleLine(1,7,mg);
				vUC1608DoubleLine(1,8,md);
				vLC75883_WriteChar(0,' ');
				vLC75883_WriteChar(1,' ');
	                    	
				vLC75883_WriteChar(3,hd);
	                     vLC75883_WriteChar(4,mg);
				vLC75883_WriteChar(5,md);
				vLC75883_WriteChar(6,' ');
			}
			else
			{
				vUC1608DoubleLine(1,4,' ');
				vUC1608DoubleLine(1,5,' ');
				vUC1608DoubleLine(1,7,' ');
				vUC1608DoubleLine(1,8,' ');
				vLC75883_WriteChar(2,' ');
				vLC75883_WriteChar(3,' ');
				 vLC75883_WriteChar(4,' ');
				vLC75883_WriteChar(5,' ');
			}
			if(Time_Dot_Flash_Flag)
			{
				vUC1608DoubleLine(1,6,':');
				DOT_P2 = 1;
			}
			if(!Time_Dot_Flash_Flag && !Time_Set_Flag)
			{
				DOT_P2 = 0;
				vUC1608DoubleLine(1,6,' ');
			}
			if(Time.ucHour > 11)
			{
				vUC1608DoubleLine(1,9,'P');
				vLC75883_WriteChar(7,'p');
			}
			else
			{
				vUC1608DoubleLine(1,9,'A');
				vLC75883_WriteChar(7,'a');
			}
			vUC1608DoubleLine(1,10,'M');
		}
		else
		{
			if(!Time_Flash_Flag)
			{
				if(FPowerLow)
				{
					vUC1608DoubleLine(1,1,' ');
					vUC1608DoubleLine(1,2,' ');
					vUC1608DoubleLine(1,3,' ');
					vUC1608DoubleLine(1,9,' ');
					vUC1608DoubleLine(1,10,' ');
					vUC1608DoubleLine(1,11,' ');
					vLC75883_WriteChar(0,' ');
					vLC75883_WriteChar(1,' ');
					vLC75883_WriteChar(6,' ');
					vLC75883_WriteChar(7,' ');
				}
				vUC1608DoubleLine(1,5,hg);
				vUC1608DoubleLine(1,6,hd);
				vUC1608DoubleLine(1,8,mg);
				vUC1608DoubleLine(1,9,md);
                           vLC75883_WriteChar(0,' ');
				vLC75883_WriteChar(1,' ');
                            vLC75883_WriteChar(2,hg);
				vLC75883_WriteChar(3,hd);
				vLC75883_WriteChar(4,mg);
				vLC75883_WriteChar(5,md);
				vLC75883_WriteChar(6,' ');
				vLC75883_WriteChar(7,' ');
			}
			else
			{
				vUC1608DoubleLine(1,5,' ');
				vUC1608DoubleLine(1,6,' ');
				vUC1608DoubleLine(1,8,' ');
				vUC1608DoubleLine(1,9,' ');
				vLC75883_WriteChar(2,' ');
				vLC75883_WriteChar(3,' ');
				vLC75883_WriteChar(4,' ');
				vLC75883_WriteChar(5,' ');
			}
			if(Time_Dot_Flash_Flag)
			{
				vUC1608DoubleLine(1,7,':');
				DOT_P2 = 1;
			}
			if(!Time_Dot_Flash_Flag && !Time_Set_Flag)
			{
				vUC1608DoubleLine(1,7,' ');
				DOT_P2 = 0;
			}
		}
#endif 
	}
	if(Power_Flag && Time_Flag  && FDoorDisp/*&& !Disp_Flag*/)/*when logo display ,time don't display*/
	{
		if(!Clock_Flag)
		{
			/*if(!Time_Flash_Flag)*/
			if(ucTime >= 10)
				vUC1608TopBottom(1,15,hg,1);
			else
				vUC1608TopBottom(1,15,' ',1);
				vUC1608TopBottom(1,16,hd,1);
				vUC1608TopBottom(1,18,mg,1);
				vUC1608TopBottom(1,19,md,1);
			/*else
			{
				vUC1608TopBottom(1,15,' ',1);
				vUC1608TopBottom(1,16,' ',1);
				vUC1608TopBottom(1,18,' ',1);
				vUC1608TopBottom(1,19,' ',1);
			}*/
			if(Time_Dot_Flash_Flag)
				vUC1608TopBottom(1,17,':',1);
			if(!Time_Dot_Flash_Flag/* && !Time_Set_Flag*/)
				vUC1608TopBottom(1,17,' ',1);
			if(Time.ucHour > 11)
				vUC1608TopBottom(1,20,'P',1);
			else
				vUC1608TopBottom(1,20,'A',1);
			/*vUC1608TopBottom(1,31,'M',1);*/
		}
		else
		{
			vUC1608TopBottom(1,15,' ',1);
			vUC1608TopBottom(1,16,' ',1);
			/*if(!Time_Flash_Flag)*/
			{
				vUC1608TopBottom(1,16,hg,1);
				vUC1608TopBottom(1,17,hd,1);
				vUC1608TopBottom(1,19,mg,1);
				vUC1608TopBottom(1,20,md,1);
			}
		/*	else
			{
				vUC1608TopBottom(1,16,' ',1);
				vUC1608TopBottom(1,17,' ',1);
				vUC1608TopBottom(1,19,' ',1);
				vUC1608TopBottom(1,20,' ',1);
			}*/
			if(Time_Dot_Flash_Flag)
				vUC1608TopBottom(1,18,':',1);
			if(!Time_Dot_Flash_Flag/* && !Time_Set_Flag*/)
				vUC1608TopBottom(1,18,' ',1);
		}
	}
	if(FWireTime_Disp && Power_Flag && !FPowerLowDisp)
	{
		vLC75883_WriteChar(0,' ');/*chu0531清除时间显示的时候多余的东西*/
		vLC75883_WriteChar(1,' ');
		vLC75883_WriteChar(6,' ');
		vLC75883_WriteChar(7,' ');
		if(ucTime >= 10)
			 vLC75883_WriteChar(2,hg);
		else
			vLC75883_WriteChar(2,' ');
		vLC75883_WriteChar(3,hd);
		vLC75883_WriteChar(4,mg);
		vLC75883_WriteChar(5,md);
		if(Time_Dot_Flash_Flag)
			DOT_P2 = 1;
		if(!Time_Dot_Flash_Flag && !Time_Set_Flag)
			DOT_P2 = 0;
		if( !Clock_Flag )		/* Jacky @070531 Only display A/P when 12H clock mode */
		{
			if(Time.ucHour > 11)
				vLC75883_WriteChar(7,'p');
			else
				vLC75883_WriteChar(7,'a');
		}
	}
	Time_rember = Time.ucSecond;
	#endif
}
#endif

⌨️ 快捷键说明

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