c文件:
#include "Main_Proc.h"
/*------------------------------------------------*/
// 时间数组: 秒,分,时,星期,日,月,年
unsigned char DS1337_RTC_Time[7]; //时间结构体
// [0]-秒十六进制 [6:4]-十位, [3:0]-个位
// [1]-分十六进制 [6:4]-十位, [3:0]-个位
// [2]-时十六进制 [6]-12/24小时, [5:4]-十位, [3:0]-个位
// [3]-星期 [2:0]-星期,范围1~7
// [4]-日期十六进制 [5:4]-十位, [3:0]-个位
// [5]-月份十六进制 [4]-十位, [3:0]-个位
// [6]-年份十六进制 [7:4]-十位, [3:0]-个位,从2000年开始,即,实际年份为2000+[6]的值
/**************************************************/
// 函数功能: I2C延时,实际延时由外部的EPLD实现
// I2C总线速度小于CPU的主频,需要延时操作
// 输入参数: 无
// 输出参数: 无
/*------------------------------------------------*/
void DS1337_I2C_Delay( void )
{
unsigned char i;
i=10;
while(i--)
_NOP();
}
/**************************************************/
// 函数功能: DS1337 I2C 时序启动子函数
// 输入参数: 无
// 输出参数: 无
/*------------------------------------------------*/
void DS1337_I2C_Start( void )
{
PIN_DS1337_SDA_0; //启动信号
DS1337_I2C_Delay();
PIN_DS1337_SCK_0;
DS1337_I2C_Delay();
}
/**************************************************/
// 函数功能: DS1337 I2C 时序结束子函数
// 输入参数: 无
// 输出参数: 无
/*------------------------------------------------*/
void DS1337_I2C_Stop( void )
{
PIN_DS1337_SCK_1;
DS1337_I2C_Delay();
PIN_DS1337_SDA_1;
DS1337_I2C_Delay();
}
/**************************************************/
// 函数功能: DS1337 I2C ACK结束子函数
// 输入参数: Master=1,表示主设备产生ACK信号,将数据拉低
// 输出参数: 无
/*------------------------------------------------*/
void DS1337_I2C_ACK( void )
{
PIN_DS1337_SDA_0;
DS1337_I2C_Delay();
PIN_DS1337_SCK_1;
DS1337_I2C_Delay();
PIN_DS1337_SCK_0;
DS1337_I2C_Delay();
}
/**************************************************/
// 函数功能: DS1337 I2C 读取1个字节子函数
// 输入参数: 无
// 输出参数: 读取字节的结果数据
/*------------------------------------------------*/
unsigned char DS1337_I2C_Read( void )
{
unsigned char ReadByte, i;
PIN_DS1337_SDA_1; //释放总线,方便读取
PIN_DS1337_SDA_IN_Init;
DS1337_I2C_Delay();
for ( i=0;i<8;i++ )
{
ReadByte <<= 1;
if ( PIN_DS1337_SDA_IN )
ReadByte += 1;
PIN_DS1337_SCK_1;
DS1337_I2C_Delay();
PIN_DS1337_SCK_0;
DS1337_I2C_Delay();
}
PIN_DS1337_SDA_OUT_Init;
return( ReadByte );
}
/**************************************************/
// 函数功能: DS1337 I2C 发送1个字节子函数
// 输入参数: 待发送的字节数据
// 输出参数: 无
/*------------------------------------------------*/
void DS1337_I2C_Send( unsigned char SendData )
{
unsigned char SendByte, i;
SendByte = SendData;
for ( i=0;i<8;i++ )
{
if ( SendByte & 0x80 )
PIN_DS1337_SDA_1;
else
PIN_DS1337_SDA_0;
SendByte <<= 1;
DS1337_I2C_Delay();
PIN_DS1337_SCK_1;
DS1337_I2C_Delay();
PIN_DS1337_SCK_0;
DS1337_I2C_Delay();
}
}
/**************************************************/
// 函数功能: 读取DS1337寄存器
// 输入参数: 地址
// 输出参数: 读取的数据字节,保存在DS1337_RTC_Time中
/*------------------------------------------------*/
void DS1337_Read( unsigned char Addr, unsigned char Number )
{
unsigned char i;
//A.写地址
DS1337_I2C_Start();
DS1337_I2C_Send( 0xD0 );
DS1337_I2C_ACK();
DS1337_I2C_Send( Addr );
DS1337_I2C_ACK();
DS1337_I2C_Stop();
//A.读数据
DS1337_I2C_Start();
DS1337_I2C_Send( 0xD1 );
DS1337_I2C_ACK();
for(i=0;i<Number;i++)
{
DS1337_RTC_Time[i] = DS1337_I2C_Read();
DS1337_I2C_ACK();
}
DS1337_I2C_Stop();
}
/**************************************************/
// 函数功能: 写入DS1337寄存器
// 输入参数: 地址,数据
// 输出参数: 无
/*------------------------------------------------*/
void DS1337_Write( unsigned char Addr, unsigned char Data )
{
DS1337_I2C_Start();
DS1337_I2C_Send( 0xD0 );
DS1337_I2C_ACK();
DS1337_I2C_Send( Addr );
DS1337_I2C_ACK();
DS1337_I2C_Send( Data );
DS1337_I2C_ACK();
DS1337_I2C_Stop();
}
/**************************************************/
// 函数功能: DS1337初始化,
// 如果原寄存器数据正常,则不重新写入
// 输入参数: 无
// 输出参数: 无
/*------------------------------------------------*/
void DS1337_RTC_Init( void )
{
// I2C总线初始化,软件模拟
PIN_DS1337_SDA_1;
PIN_DS1337_SCK_1;
PIN_DS1337_SDA_OUT_Init;
PIN_DS1337_SCK_OUT_Init;
PIN_DS1337_SQW_IN_Init;
// 检测OSC是否震荡
DS1337_Read( 0x0E, 1 ); //读取小时信息,判断是否为24小时制式
if ( DS1337_RTC_Time[0] != 0 )
DS1337_Write( 0x0E, 0 );
}
/**************************************************/
// 函数功能: 读取RTC时间信息
// 输入参数: 无
// 输出参数: 无,内容传递到DS1337_RTC_Time数组中
/*------------------------------------------------*/
void Print_RTC_Time( void ) //打印显示时间
{
const char WEEK_TABLE[][3] = { "", "一", "二", "三", "四", "五", "六", "日" };
// 读取时间
DS1337_Read(0, 7);
// 打印时间
S_Printf("20%1d%1d年", (DS1337_RTC_Time[6]>>4)&0x0F, DS1337_RTC_Time[6]&0x0F);
S_Printf("%1d%1d月", (DS1337_RTC_Time[5]>>4)&0x01, DS1337_RTC_Time[5]&0x0F);
S_Printf("%1d%1d日, ", (DS1337_RTC_Time[4]>>4)&0x03, DS1337_RTC_Time[4]&0x0F);
S_Printf("%1d%1d:", (DS1337_RTC_Time[2]>>4)&0x03, DS1337_RTC_Time[2]&0x0F);
S_Printf("%1d%1d:", (DS1337_RTC_Time[1]>>4)&0x07, DS1337_RTC_Time[1]&0x0F);
S_Printf("%1d%1d, 星期", (DS1337_RTC_Time[0]>>4)&0x07, DS1337_RTC_Time[0]&0x0F);
S_Printf("%s\r\n", WEEK_TABLE[DS1337_RTC_Time[3]&0x07]);
}
h文件:
#ifndef __DS1337_RTC_H__
#define __DS1337_RTC_H__
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// DS1337 I2C
#define PIN_DS1337_SDA BIT5 // P3.5
#define PIN_DS1337_SDA_OUT_Init P3DIR |= PIN_DS1337_SDA // 设置为输出
#define PIN_DS1337_SDA_IN_Init P3DIR &= ~PIN_DS1337_SDA // 设置为输入
#define PIN_DS1337_SDA_0 P3OUT &= ~PIN_DS1337_SDA // 低电平
#define PIN_DS1337_SDA_1 P3OUT |= PIN_DS1337_SDA // 高电平
#define PIN_DS1337_SDA_IN P3IN & PIN_DS1337_SDA // 输入
#define PIN_DS1337_SCK BIT6 // P3.6
#define PIN_DS1337_SCK_OUT_Init P3DIR |= PIN_DS1337_SCK // 设置为输出
#define PIN_DS1337_SCK_0 P3OUT &= ~PIN_DS1337_SCK // 低电平
#define PIN_DS1337_SCK_1 P3OUT |= PIN_DS1337_SCK // 高电平
#define PIN_DS1337_SQW BIT7 // P3.7
#define PIN_DS1337_SQW_IN_Init P3DIR &= ~PIN_DS1337_SQW // 设置为输入
#define PIN_DS1337_SQW_IN P3IN & PIN_DS1337_SQW // 输入
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// 函数声明
void DS1337_RTC_Init( void ); // DS1337初始化,如果原寄存器数据正常,则不重新写入
void Print_RTC_Time( void ); // 打印显示时间
void DS1337_Write( unsigned char Addr, unsigned char Data ); // 写入DS1337寄存器
#endif |