?? 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 + -