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

📄 rtc.c

📁 一个电表的程序
💻 C
字号:
/***********************************************************************/
/*                                                                     */
/*  FILE        :rtc.c                                         		   */
/*  DESCRIPTION :RTC			                                       */
/*  CPU TYPE    :H8/38104F                                             */
/*                                                                     */
/*  This file is generated by Renesas Project Generator (Ver.3.1).     */
/*                                                                     */
/***********************************************************************/
/* 宁波三星科技有限公司 												*/
/* 文件名:rtc.C 														*/
/* 作者: 叶孟军 														*/
/* 开始日期:2005年7月22日 												*/
/* 模块功能: 该程序是完成时钟模块的输出							 	*/
/* 模块性能: 该程序需完成星期、闰年判断								*/
/* 模块输入项:秒信号:flg_1s											*/
/* 模块输出项:日期 RDtWk_Dtr, 时间RTm_Dtr[3];
/************************************************************************/
#include <machine.h>
#include	"extern.h"
/************************************************************************/
const unsigned   char  Month_Day[12]={0x31,0x28,0x31,0x30,0x31,0x30,0x31,0x31,0x30,0x31,0x30,0x31};
 
unsigned int HEX2BCD(unsigned char hex_data)			//十六进制到十进制的转变
{
	unsigned int bcd_data;
  	unsigned char temp;
  	temp=hex_data%100;
  	bcd_data=((unsigned int)hex_data)/100<<8;
  	bcd_data=bcd_data|temp/10<<4;
  	bcd_data=bcd_data|temp%10;
  	return bcd_data;
}


unsigned char	Judge_BCD1(unsigned char data)
{
   if(((data & 0xf0) > 0x90) || ((data & 0x0f) > 0x09))
    {    
        return 1;
      }          
   else
    {
	    return 0;
     }
 }

unsigned char	Data_BcdAdd(unsigned char data)
{
    ++data;
	if((data & 0x0f) > 9)
	 {
	    data = data + 0x06;
	  }
	if((data & 0xf0) > 0x90)
	 {
	    data = 0x00;
      }
    return data;
 }


void	Rtc_Add(void)
{
   unsigned char i;
	    RTm_Dtr[0] = Data_BcdAdd(RTm_Dtr[0]) ;			//秒寄存器
	    if(RTm_Dtr[0] == 0x60)						
	     {
		    RTm_Dtr[1] = Data_BcdAdd(RTm_Dtr[1]);		//分钟寄存器
		    RTm_Dtr[0] = 0x00;
			if(RTm_Dtr[1] == 0x60)						//分钟寄存器数据为60min
			 {
			    RTm_Dtr[2] = Data_BcdAdd(RTm_Dtr[2]);		//小时寄存器
				RTm_Dtr[1] = 0x00;							//分钟寄存器数据清零
				if(RTm_Dtr[2] == 0x24)
				 {
				    RTm_Dtr[2] = 0x00;						//小时寄存器数据清零
					RDtWk_Dtr[0]++;							//星期寄存器数据加1
					if(RDtWk_Dtr[0] >= 0x07)
			 		 {
			    		RDtWk_Dtr[0] = 0x00;
              		   }
				    RDtWk_Dtr[1] = Data_BcdAdd(RDtWk_Dtr[1]);
					if(((RDtWk_Dtr[3] % 4) == 0x00) &&  (RDtWk_Dtr[2] == 0x02))		//为闰年闰月
					 {
					    if(RDtWk_Dtr[1] > 0x29)
						 {
						     RDtWk_Dtr[1] = 0x01;
		   	    			 RDtWk_Dtr[2] = Data_BcdAdd(RDtWk_Dtr[2] );			//月寄存器数据加1
							 if(RDtWk_Dtr[2] > 0x12)			//大于12月
							  {
							     RDtWk_Dtr[2] = 0x01;
							     RDtWk_Dtr[3] = Data_BcdAdd(RDtWk_Dtr[3]);
								}
                          }
					
					  }
					else
					 {
					    if(RDtWk_Dtr[1] >   Month_Day[Bcd_hex(RDtWk_Dtr[2]) -1])		//当日期寄存器数据大于表格中数据
						 {
						    RDtWk_Dtr[1] = 0x01;
		   	    			RDtWk_Dtr[2] = Data_BcdAdd(RDtWk_Dtr[2] );			//月寄存器数据加1
							if(RDtWk_Dtr[2] > 0x12)			//大于12月
							 {
							     RDtWk_Dtr[2] = 0x01;
							     RDtWk_Dtr[3] = Data_BcdAdd(RDtWk_Dtr[3]);
							   }
                           }
                       }

				  }
            }
        }
 }




void	Rtc_Judge(void)
{
   unsigned  char i;
   unsigned char Min_Flg = 0x00;
   if(Power_Flg.BYTE != 0x01)	//电源正常模式
    {
       if((RTm_Dtr[0] > 0x60) || (RTm_Dtr[1] >0x60) || (RTm_Dtr[2] > 0x24) ||(RDtWk_Dtr[1] > 0x31) || (RDtWk_Dtr[2] > 0x12) || (RDtWk_Dtr[3] > 0x99)
        || (Judge_BCD1(RTm_Dtr[0])) || (Judge_BCD1(RTm_Dtr[1])) || (Judge_BCD1(RTm_Dtr[1])) || (Judge_BCD1(RDtWk_Dtr[1])) || (Judge_BCD1(RDtWk_Dtr[2])) || (Judge_BCD1(RDtWk_Dtr[3])))
	    {
	        F_BlckRead_Eeprm(Rtc_Time,RTm_Dtr,0x03);					//从E2P中读取时间
	        F_BlckRead_Eeprm(Rtc_Time,RDtWk_Dtr,0x04);					//从E2P中读取日期
         }
     }

   if((RTm_Dtr[0] == 0x00) && (RTm_Dtr[1] == 0x00) && (RTm_Dtr[2] == 0x00) && (Min_Flg != 0x68 ))		//当时间为零点零分零秒时,当前时钟保存到E2P中
	{
	    Min_Flg = 0x68;
		F_BlckWrt_Eeprm(Rtc_Time,RTm_Dtr,0x03);					//时间写到E2P中
		F_BlckWrt_Eeprm(Rtc_Time+3,RDtWk_Dtr,0x04);					//日期写到E2P中
      }
   if(RTm_Dtr[0] != 0x00)		//当当前时钟已过1秒
    {
	    Min_Flg = 0x00;
     }

 }

	     	

⌨️ 快捷键说明

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