📄 sc_ds1302.c
字号:
/**************************************************************************
Copyright (c) HUST ESRI 1999. All Rights Reserved.
文件名: SC_DS1302.h
当前版本: V1.0
作者: SeaCow
完成日期: 2004.11.30
取代版本: 无
原作者: 无
完成日期: 无
摘要: 实时时钟芯片DS1302读写模块
DS1302是非标准的I2C总线,通过P2.0-P2.2脚进行通信
Ram的存取未完善,主要问题是存贮禁止时间未规范。
*************************************************************************/
#include "inc\ConstDef.h"
#include "inc\SC_DS1302.h"
/*-------------------------------------------------------------------
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucData:写入的数据
* 返回: 无
* 说明:
-------------------------------------------------------------------*/
void DS1302_WriteByte(uchar ucData)
{
uchar i,ucTmp;
ucTmp=0x01;
for(i=8;i>0;i--)
{
if(ucData&ucTmp)
pin_DS1302_IO=1;
else
pin_DS1302_IO=0;
pin_DS1302_CLK=1;
ucTmp=ucTmp << 1;
pin_DS1302_CLK=0;
}
}
/*-------------------------------------------------------------------
* 功能: 从DS1302读取1Byte数据
* 调用:
* 输入:
* 返回: ucTmp
* 说明:
-------------------------------------------------------------------*/
uchar DS1302_ReadByte(void)
{
uchar i,ucTmp;
ucTmp=0;
for(i=8;i>0;i--)
{
ucTmp=ucTmp >> 1;
if(pin_DS1302_IO)
ucTmp+=0x80;
pin_DS1302_CLK=1;
_nop_();
pin_DS1302_CLK=0;
}
return(ucTmp);
}
/*-------------------------------------------------------------------
* 功能: 往DS1302指定地址写入数据
* 调用: DS1302_WriteByte()
* 输入: ucAddr: DS1302地址, ucDatata: 要写的数据
* 返回: 无
* 说明: 先写地址,后写命令/数据.写时间数据时,应为BCD码
---------------------------------------------------------------------*/
void DS1302_Write(uchar ucAddr, uchar ucData)
{
pin_DS1302_CLK=0;
pin_DS1302_nRST=1;
ucAddr&=0xFE; //保证最低位为写标志(=0)
DS1302_WriteByte(ucAddr); // 地址,命令
DS1302_WriteByte(ucData); // 写1Byte数据
pin_DS1302_nRST =0;
}
/*-------------------------------------------------------------------
* 功能: 读取DS1302某地址的数据
* 调用: DS1302_WriteByte() , DS1302_ReadByte()
* 输入: ucAddr: DS1302地址
* 返回: ucData :读取的数据
* 说明: 先写地址,后读命令/数据。返回的时间数据为BCD码
---------------------------------------------------------------------*/
uchar DS1302_Read(uchar ucAddr)
{
uchar ucData;
pin_DS1302_CLK=0;
pin_DS1302_nRST=1;
ucAddr|=1; //保证最低位为读标志(=1)
DS1302_WriteByte(ucAddr); /* 地址,命令 */
ucData=DS1302_ReadByte(); /* 读1Byte数据 */
pin_DS1302_nRST =0;
return(ucData);
}
/*-------------------------------------------------------------------
* 功能: 往DS1302写入8字节时钟数据(多字节方式)
* 调用: DS1302_WriteByte()
* 输入: pData: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
* 8Byte (HEX码)
* 返回: 无
* 说明: 先写地址,后写数据(时钟多字节方式)
---------------------------------------------------------------------*/
void DS1302_BurstWriteClock(uchar *pData)
{
uchar i;
for(i=8;i>0;i--)
pData[i]=HEX2BCD(pData[i]);
DS1302_Write(DS1302_ADDR_CTRL,0x00); // WP=0,允许写操作
pin_DS1302_CLK=0;
pin_DS1302_nRST=1;
DS1302_WriteByte(DS1302_ADDR_CLK&0xFE); // 0xbe:时钟多字节写命令
for (i=8;i>0;i--) //8Byte=7Byte 时钟数据 + 1Byte 控制
{
DS1302_WriteByte(*pData); // 写1Byte数据
pData++;
}
// pin_DS1302_CLK=1;
pin_DS1302_nRST =0;
DS1302_Write(DS1302_ADDR_CTRL,0x80); // WP=1,禁止写操作
}
/*-------------------------------------------------------------------
* 功能: 读取DS1302时钟数据
* 调用: DS1302_WriteByte() , DS1302_ReadByte()
* 输入: pData: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回: ucData :读取的数据
* 说明: 先写地址,后读命令/数据(时钟多字节方式)
---------------------------------------------------------------------*/
void DS1302_BurstReadClock(uchar *pData)
{
uchar i;
pin_DS1302_CLK=0;
pin_DS1302_nRST=1;
DS1302_WriteByte(DS1302_ADDR_CLK|0x01); // 时钟多字节读命令
for (i=8; i>0; i--)
{
*pData=BCD2HEX(DS1302_ReadByte()); // 读1Byte数据
pData++;
}
// pin_DS1302_CLK=1;
pin_DS1302_nRST =0;
}
/*-------------------------------------------------------------------
* 功能: 往DS1302寄存器数写入数据(多字节方式)
* 调用: DS1302_WriteByte()
* 输入: pData: 寄存器数据地址
* 返回: 无
* 说明: 先写地址,后写数据(寄存器多字节方式).此时会将时钟秒置零
---------------------------------------------------------------------*/
void DS1302_BurstWriteRam(uchar *pData)
{
uchar i;
DS1302_Write(DS1302_ADDR_CTRL,0x00); // WP=0,允许写操作
pin_DS1302_CLK=0;
pin_DS1302_nRST=1;
DS1302_WriteByte(DS1302_COMM_RAM&0xFE); // 多字节Ram,写命令
for (i=31;i>0;i--) //31Byte Ram数据
{
DS1302_WriteByte(*pData); // 写1Byte数据
pData++;
}
pin_DS1302_nRST =0;
DS1302_Write(DS1302_ADDR_CTRL,0x80); // WP=1,禁止写操作
}
/*-------------------------------------------------------------------
* 功能: 读取DS1302寄存器数据
* 调用: DS1302_WriteByte() , DS1302_ReadByte()
* 输入: pData: 寄存器数据地址
* 返回: 无
* 说明: 先写地址,后读命令/数据(寄存器多字节方式)
---------------------------------------------------------------------*/
void DS1302_BurstReadRam(uchar *pData)
{
uchar i;
pin_DS1302_CLK=0;
pin_DS1302_nRST=1;
DS1302_WriteByte(DS1302_COMM_RAM|0x01); // 多字节Ram,读命令
for (i=31; i>0; i--) //31Byte Ram数据
{
*pData=DS1302_ReadByte(); // 读1Byte数据
pData++;
}
pin_DS1302_nRST =0;
}
/*-------------------------------------------------------------------
* 功能: BCD和HEX之间在相互转换
* 调用:
* 输入: bcd_data或hex_data
* 返回: hex_data或bcd_data
* 说明: 只适用于8bit转换,数值应小于100
---------------------------------------------------------------------*/
uchar BCD2HEX(uchar bcd_data)
{
return ((bcd_data>>4)*10)+(bcd_data&0x0f);
}
uchar HEX2BCD(uchar hex_data)
{
return (hex_data/10)<<4|(hex_data%10);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -