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

📄 kw_rtc.c

📁 linux下数据下载器的设计与实现
💻 C
字号:
/************************************************************************************** 
 Copyright (C), 1988-1999, Xi'an Keyway Control & Measurement Technology Co., Ltd
 FileName: kw_rtc.c 
 Description     :rtc 接口模块。      
 Version         :1.0 
 Function List   :    
 History:         // 历史修改记录 
      <author>      <time>        <version >       <desc> 
      LigangWang    07/08/08       1.0             build this moudle   
*************************************************************************************/

#include "globals.h"

#define 	SCLK_S		IOE |= 1<<4								// 设时钟信号高 
#define 	SCLK_C		IOE &= ~(1<<4)							// 设时钟信号低
#define     IO1302_S  	IOE |= 1<<3                     		// 设io信号高
#define     IO1302_C  	IOE &= ~(1<<3)                     		// 设io信号低
#define 	RST1302_S   IOE |= 1<<2                     		// 设复位信号高
#define 	RST1302_C   IOE &= ~(1<<2) 							// 设复位信号低
#define		IO1302_D	((IOE >> 3)&1)							// 获取io信号电平

BYTE xdata RM_Curtime[8]; 										// 用于保存RTC时间

#define BCD2Byte(a)		(((((a)&0xf0)>>4) * 10) + ((a)&0x0f))	// 转换BCD数到16进制


/************************************************************************************* 
  Function:       Delay_1us
  Description:    简单延时程序,延时不准确
  Called By:      
  Input:          Count @ BYTE,延时数
  Output:         N/A
  Return:         void
  Others:         
*************************************************************************************/
void Delay_1us(BYTE Count)
{
	BYTE	i;
	for(;Count>0;Count--)
		for(i=14;i>0;i--);
}

/************************************************************************************* 
  Function:       Delay
  Description:    简单延时程序,延时不准确
  Called By:      
  Input:          i @ BYTE,延时数
  Output:         N/A
  Return:         void
  Others:         
*************************************************************************************/
void Delay(BYTE i)
{
	while(i--);
}

/************************************************************************************* 
  Function:       RM_WriteDS1302
  Description:    DS1302写函数,用于写字节到指定地址
  Called By:      
  Input:          ADD @ BYTE: 地址
  				  DAT @ BYTE: 数据
  Output:         N/A
  Return:         void
  Others:  
             _________________________________________________________________
  RST   ____|                                                                 |______
              _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _ 
  CLK   _____| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_________
  
  DAT   -----R---a---a---a---a---a---C---2---d---d---d---d---d---d---d---d-------------
*************************************************************************************/
void RM_WriteDS1302(BYTE ADD,BYTE DAT)
{
	BYTE	i;

	RST1302_C;						// 复位信号清零
	_nop_();			
	SCLK_C;							// 时钟信号清零
	_nop_();
	RST1302_S;						// 复位信号置高
	Delay_1us(4);
	for(i=0;i<8;i++)				// 发送8位地址
	{
    	SCLK_C;						
		Delay_1us(1);
		if(ADD&0X01)				// 发送一位到io信号线
			IO1302_S;
		else
			IO1302_C;
		ADD	>>= 1;					// 准备下一位
		Delay(10);
		SCLK_S;						// 时钟上升沿,数据被发出
		Delay_1us(1);
	}

	Delay_1us(1);
	for(i=0;i<8;i++)				// 发送8位数据,原理同地址
	{
      	SCLK_C;
		Delay_1us(1);
		if(DAT&0X01)
			IO1302_S;
		else
			IO1302_C;
		DAT	>>=1;
		Delay(10);
		SCLK_S;
		Delay_1us(1);
	}
	RST1302_C;						// 清复位
	Delay_1us(4);
	SCLK_C;							// 清时钟
}

/************************************************************************************* 
  Function:       RM_ReadDS1302
  Description:    DS1302读函数,用于从指定地址读取数据
  Called By:      
  Input:          ADD @ BYTE: 地址
  Output:         N/A
  Return:         BYTE 数据
  Others:         
            _________________________________________________________________
  RST  ____|                                                                 |______
              _   _   _   _   _   _   _   _   _   _   _   _   _   _   _   _ 
  CLK   _____| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_________
  
  DAT   -----R---a---a---a---a---a---C---2-d---d---d---d---d---d---d---d-------------
*************************************************************************************/
BYTE RM_ReadDS1302(BYTE ADD)
{
   BYTE	i,temp;

   temp=0;
   RST1302_C;
   _nop_();
   SCLK_C;
   _nop_();
   RST1302_S;
   Delay_1us(1);
   for(i=0;i<8;i++)				//循环发送1位,共8位地址
   {
      	SCLK_C;
		Delay_1us(1);
		if(ADD&0X01)
			IO1302_S;
		else
			IO1302_C;
		ADD >>=1;
		Delay(10);
		SCLK_S;
		Delay_1us(1);
   }
   OEE = 0xf7;
   Delay_1us(1);

   for(i=0;i<8;i++)				//循环读取1位,共8位数据
   {
      	SCLK_C;
		Delay_1us(1);
		temp >>=1;
		if(IO1302_D)
		{
			temp|=0x80;	
		}		
		Delay(10);
		SCLK_S;
		Delay_1us(1);
   }
   RST1302_C;
   Delay_1us(4);
   SCLK_C;
   OEE = 0xff;
   return(temp);
}

/************************************************************************************* 
  Function:       RM_InitDS1302
  Description:    DS1302初始化函数
  Called By:      
  Input:          N/A
  Output:         N/A
  Return:         void
  Others:         
*************************************************************************************/
void RM_InitDS1302()
{
	BYTE Temp;

	RM_WriteDS1302(0x8E, 0x00);									// 关闭写保护
	RM_WriteDS1302(0x90, 0xAB);									// 设置充电电阻
	Temp=RM_ReadDS1302(0x81);									// 设置CH位
	Temp&=0x7F;
	RM_WriteDS1302(0x80, Temp);
	RM_WriteDS1302(0x8E, 0x80);									// 打开写保护
}

/************************************************************************************* 
  Function:       RM_SetRTCTime
  Description:    设置RTC时间,时间值保存于配置参数CM_ConfigParameter。
  Called By:      
  Input:          N/A
  Output:         N/A
  Return:         void
  Others:         调用该模块时,须先对CM_ConfigParameter进行初始化
*************************************************************************************/
void RM_SetRTCTime(void)
{
	RM_WriteDS1302(0x8E,0x00);
	RM_WriteDS1302(0x8C,CM_ConfigParameter.RTC_Time[0]);		//year
	RM_WriteDS1302(0x88,CM_ConfigParameter.RTC_Time[1]);		//month
	RM_WriteDS1302(0x86,CM_ConfigParameter.RTC_Time[2]);		//date
	RM_WriteDS1302(0x84,CM_ConfigParameter.RTC_Time[3]);		//hour
	RM_WriteDS1302(0x82,CM_ConfigParameter.RTC_Time[4]);		//min.
	RM_WriteDS1302(0x80,CM_ConfigParameter.RTC_Time[5]);		//sec.
	RM_WriteDS1302(0X8E,0X80);
}

/************************************************************************************* 
  Function:       RM_ReadRTCTime
  Description:    读取RTC时间,时间值保存于RM_Curtime。
  Called By:      
  Input:          N/A
  Output:         N/A
  Return:         void
  Others:         
*************************************************************************************/
void RM_ReadRTCTime(void)
{
	RM_Curtime[0]=RM_ReadDS1302(0x8D);							//year
	RM_Curtime[1]=RM_ReadDS1302(0x89);							//month
	RM_Curtime[2]=RM_ReadDS1302(0x87);							//date
	RM_Curtime[3]=RM_ReadDS1302(0x85);							//hour
	RM_Curtime[4]=RM_ReadDS1302(0x83);							//min.
	RM_Curtime[5]=RM_ReadDS1302(0x81);							//sec.
}

/************************************************************************************* 
  Function:       RM_GetDateForFAT
  Description:    蒋保存于RM_Curtime 中的日期转换成用FAT的整型值,
  Called By:      
  Input:          N/A
  Output:         N/A
  Return:         WORD 转换结果
  Others:         计算方法 FAT_Date = (Year-1980)*512 + Month*32 + Date
*************************************************************************************/
WORD RM_GetDateForFAT()
{
	BYTE xdata day,year,month;
	year = BCD2Byte(RM_Curtime[0]) + 2000;
	month = BCD2Byte(RM_Curtime[1]);
	day = BCD2Byte(RM_Curtime[2]);
	return ((year-1980)*512+month*32+day);
}

/************************************************************************************* 
  Function:       RM_GetTimeForFAT
  Description:    蒋保存于RM_Curtime 中的时间转换成用FAT的整型值,
  Called By:      
  Input:          N/A
  Output:         N/A
  Return:         WORD 转换结果
  Others:         计算方法 FAT_Time = Hour*2048 + Min.*32 + Sec. + 2
*************************************************************************************/
WORD RM_GetTimeForFAT()
{
	BYTE xdata hour,min,sec;
	hour = BCD2Byte(RM_Curtime[3]);
	min = BCD2Byte(RM_Curtime[4]);
	sec = BCD2Byte(RM_Curtime[5]);
	return (hour*2048 + min*32 + sec + 2);
}		

⌨️ 快捷键说明

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