📄 kw_rtc.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 + -