?? 1302驅動.c
字號:
void RTCInByte(INT8U ucDa)
{
INT8U i;
RTC_DIO = 0;
RTC_SCK= 0;
for(i=8; i>0; i--)
{
if(ucDa&0x01)
RTC_DIO = 1;
else
RTC_DIO = 0;
RTC_SCK = 1;
RTC_SCK = 0;
ucDa>>= 1;
}
}
/********************************************************************
* 功能: 從DS1302讀取1Byte數(shù)據
***********************************************************************/
INT8U RTCOutByte(void)
{
INT8U i,temp = 0;
RTC_DIO = 1;
for(i=0;i<2;i++);
for(i=8; i>0; i--)
{
temp >>= 1;
if(RTC_DIO)
temp |= B1000_0000;
else
temp &= B0111_1111;
RTC_SCK = 1;
RTC_SCK = 0;
}
return(temp);
}
/********************************************************************
* 說明: 先寫地址,后寫命令/數(shù)據
* 功能: 往DS1302寫入數(shù)據
* 調用: RTCInByte()
* 輸入: ucAddr: DS1302地址, ucDa: 要寫的數(shù)據
***********************************************************************/
void WriteRtc(INT8U ucAddr, INT8U ucDa)
{
RTC_SCK = 0;
iRTC_RST = 1; CTL_CK0 = iCTL_CK0;
RTCInByte(ucAddr); /* 地址,命令 */
// ucDa&=0x7f;
RTCInByte(ucDa); /* 寫1Byte數(shù)據*/
iRTC_RST = 0; CTL_CK0 = iCTL_CK0;
}
/********************************************************************
* 功能: 讀取DS1302某地址的數(shù)據
* 調用: RTCInByte() , RTCOutByte()
* 輸入: ucAddr: DS1302地址
* 返回值: ucDa :讀取的數(shù)據
***********************************************************************/
INT8U ReadRtc(INT8U ucAddr)
{
INT8U ucDa;
RTC_SCK = 0;
iRTC_RST = 1; CTL_CK0 = iCTL_CK0;
RTCInByte(ucAddr); /* 地址,命令 */
ucDa = RTCOutByte(); /* 讀1Byte數(shù)據 */
iRTC_RST = 0; CTL_CK0 = iCTL_CK0;
return(ucDa);
}
/***********************************************************************
*功能:讀寫DS1302RAM
*入參:讀寫標志,起始地址,數(shù)據長度,緩沖區(qū)首址
地址:0x00-0x1e 共31字節(jié)
*************************************************************************/
void fnRtcRam(bit rdwr,INT8U addr,INT8U len,INT8U *pdat)
{
INT8U i,tempadr;
iIC_EN = 0; iSAM_EN = 0; CTL_CK0 = iCTL_CK0; //禁止IC卡
if(rdwr)
{
WriteRtc(0x8e,0x00); /* 控制命令,WP=0,寫操作*/
tempadr = (addr*2)|0xc0;
for(i=0;i<len;i++)
{
WriteRtc(tempadr,*pdat);
tempadr+=2; pdat+=1;
}
WriteRtc(0x8e,0x80); /* 控制命令,WP=1,寫保護*/
}
else{
tempadr = (addr*2)|0xc1;
for(i=0;i<len;i++)
{
*pdat = ReadRtc(tempadr);
pdat+=1; tempadr+=2;
}
}
}
/********************************************************************
* 說明: 先寫地址,后寫數(shù)據(寄存器多字節(jié)方式)
* 功能: 往DS1302寄存器數(shù)寫入數(shù)據(多字節(jié)方式)
* 調用: RTCInByte()
* 輸入: pReDa: 寄存器數(shù)據地址
* 返回值: 無
***********************************************************************/
void WriteRtcReg(INT8U *pReDa,INT8U len)
{
INT8U i;
WriteRtc(0x8e,0x00); /* 控制命令,WP=0,寫操作*/
RTC_SCK = 0;
iRTC_RST = 1; CTL_CK0 = iCTL_CK0;
RTCInByte(0xfe); /* 0xbe:RAM多字節(jié)寫命令 */
for (i=len;i>0;i--) /*31Byte 寄存器數(shù)據 */
{
RTCInByte(*pReDa); /* 寫1Byte數(shù)據*/
pReDa++;
}
iRTC_RST = 0; CTL_CK0 = iCTL_CK0;
WriteRtc(0x8e,0x80); /* 控制命令,WP=1,寫保護*/
}
/********************************************************************
* 說明: 先寫地址,后讀命令/數(shù)據(寄存器多字節(jié)方式)
* 功能: 讀取DS1302寄存器數(shù)據
* 調用: RTCInByte() , RTCOutByte()
* 輸入: pReDa: 寄存器數(shù)據地址
* 返回值: 無
***********************************************************************/
void ReadRtcReg(INT8U *pReDa,INT8U len)
{
INT8U i;
RTC_SCK = 0;
iRTC_RST = 1; CTL_CK0 = iCTL_CK0;
RTCInByte(0xff); /* 0xff:多字節(jié)讀命令 */
for (i=len; i>0; i--) /*31Byte 寄存器數(shù)據 */
{
*pReDa = RTCOutByte(); /* 讀1Byte數(shù)據 */
pReDa++;
}
iRTC_RST = 0; CTL_CK0 = iCTL_CK0;
}
/*************************************************************************************
設置日期
入口: 儲存日期的BCD碼數(shù)組首址;
返回: TRUE--設置成功; FALSE--設置不成功;
數(shù)據格式: 日期以3個字節(jié)的壓縮BCD碼表示, 年在前. 例如2003年4月15日, 表示成030415
*****************************************************************************************/
void fnSetDate(BCD *pDate)
{
INT8U i;
INT8U ucAddr = 0x8c;
iIC_EN = 0; iSAM_EN = 0;CTL_CK0 = iCTL_CK0; //禁止IC卡
WriteRtc(0x8e,0x00); /* 控制命令,WP=0,寫操作*/
*pDate&=0x7f;
WriteRtc(ucAddr,*pDate);
pDate++;
ucAddr -=4;
for(i =2;i>0;i--)
{
*pDate&=0x7f;
WriteRtc(ucAddr,*pDate);
pDate++;
ucAddr -=2;
}
WriteRtc(0x8e,0x80); /* 控制命令,WP=1,寫保護*/
}
/*****************************************************************************************
設置時間
入口: 儲存時間的BCD碼數(shù)組首址;
返回: TRUE--設置成功; FALSE--設置不成功;
數(shù)據格式: 時間以3個字節(jié)的壓縮BCD碼表示, 24小時制, 小時在前. 例如14點23分56秒, 表示成142356.
***********************************************************************************************/
void fnSetTime(BCD *pTime)
{
INT8U i;
INT8U ucAddr = 0x84;
iIC_EN = 0; iSAM_EN = 0; CTL_CK0 = iCTL_CK0; //禁止IC卡
WriteRtc(0x8e,0x00); /* 控制命令,WP=0,寫操作*/
for(i =3;i>0;i--)
{
*pTime&=0x7f;
WriteRtc(ucAddr,*pTime);
pTime++;
ucAddr -=2;
}
WriteRtc(0x8e,0x80); /* 控制命令,WP=1,寫保護*/
}
/**********************************************************************************************
讀取日期和時間
入口: 儲存日期和時間的BCD碼數(shù)組首址;
返回: TRUE--讀取成功; FALSE--讀取不成功;
數(shù)據格式: 時間以6個字節(jié)的壓縮BCD碼表示, 24小時制, 年在前. 例如2003年4月15日14點23分56秒, 表示成030415142356.
*******************************************************************************************/
void fnGetDateTime(BCD *pDataTime)
{
INT8U i,ucAddr = 0x8d;
iIC_EN = 0; iSAM_EN = 0; CTL_CK0 = iCTL_CK0; //禁止IC卡
*pDataTime = ReadRtc(ucAddr);
ucAddr -= 4;
pDataTime+=1;
for (i=0;i<5;i++)
{
*pDataTime = ReadRtc(ucAddr);
ucAddr -= 2;
pDataTime+=1;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -