📄 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数据
***********************************************************************/
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);
}
/********************************************************************
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: RTCInByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
***********************************************************************/
void WriteRtc(INT8U ucAddr, INT8U ucDa)
{
RTC_SCK = 0;
iRTC_RST = 1; CTL_CK0 = iCTL_CK0;
RTCInByte(ucAddr); /* 地址,命令 */
// ucDa&=0x7f;
RTCInByte(ucDa); /* 写1Byte数据*/
iRTC_RST = 0; CTL_CK0 = iCTL_CK0;
}
/********************************************************************
* 功能: 读取DS1302某地址的数据
* 调用: RTCInByte() , RTCOutByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
INT8U ReadRtc(INT8U ucAddr)
{
INT8U ucDa;
RTC_SCK = 0;
iRTC_RST = 1; CTL_CK0 = iCTL_CK0;
RTCInByte(ucAddr); /* 地址,命令 */
ucDa = RTCOutByte(); /* 读1Byte数据 */
iRTC_RST = 0; CTL_CK0 = iCTL_CK0;
return(ucDa);
}
/***********************************************************************
*功能:读写DS1302RAM
*入参:读写标志,起始地址,数据长度,缓冲区首址
地址:0x00-0x1e 共31字节
*************************************************************************/
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;
}
}
}
/********************************************************************
* 说明: 先写地址,后写数据(寄存器多字节方式)
* 功能: 往DS1302寄存器数写入数据(多字节方式)
* 调用: RTCInByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
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多字节写命令 */
for (i=len;i>0;i--) /*31Byte 寄存器数据 */
{
RTCInByte(*pReDa); /* 写1Byte数据*/
pReDa++;
}
iRTC_RST = 0; CTL_CK0 = iCTL_CK0;
WriteRtc(0x8e,0x80); /* 控制命令,WP=1,写保护*/
}
/********************************************************************
* 说明: 先写地址,后读命令/数据(寄存器多字节方式)
* 功能: 读取DS1302寄存器数据
* 调用: RTCInByte() , RTCOutByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void ReadRtcReg(INT8U *pReDa,INT8U len)
{
INT8U i;
RTC_SCK = 0;
iRTC_RST = 1; CTL_CK0 = iCTL_CK0;
RTCInByte(0xff); /* 0xff:多字节读命令 */
for (i=len; i>0; i--) /*31Byte 寄存器数据 */
{
*pReDa = RTCOutByte(); /* 读1Byte数据 */
pReDa++;
}
iRTC_RST = 0; CTL_CK0 = iCTL_CK0;
}
/*************************************************************************************
设置日期
入口: 储存日期的BCD码数组首址;
返回: TRUE--设置成功; FALSE--设置不成功;
数据格式: 日期以3个字节的压缩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码数组首址;
返回: TRUE--设置成功; FALSE--设置不成功;
数据格式: 时间以3个字节的压缩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码数组首址;
返回: TRUE--读取成功; FALSE--读取不成功;
数据格式: 时间以6个字节的压缩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 + -