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

📄 sc_ds1302.c

📁 驱动15X20D液晶屏
💻 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 + -