📄 ds1302.c
字号:
#include <f:\yyjapp\yymk\software\main.h>
#include <f:\yyjapp\yymk\software\ds1302.h>
#include <iom128v.h>
#include <macros.h>
unsigned char code[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/********************************************************************
函 数 名:W_Byte()
功 能:实时时钟写入一字节
说 明:往DS1302写入1Byte数据
入口参数:Data 写入的数据
返 回 值:无
***********************************************************************/
void W_Byte(unsigned char Data)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(Data&0x01) //相当于汇编的RRC命令
SET_IO();
else
CLEAR_IO();
Data>>=1;
CLOCK();
}
}
/********************************************************************
函 数 名:R_Byte()
功 能:实时时钟读取一字节
说 明:从DS1302读取1Byte数据
入口参数:无
返 回 值:data
***********************************************************************/
unsigned char R_Byte(void)
{
unsigned char i,data=0;
for(i=0;i<8;i++)
{
if(PINE&0x20)
data|=code[i];
CLOCK();
}
return data;
}
/********************************************************************
函 数 名:W_1302()
功 能:往DS1302写入数据
说 明:先写地址,后写命令/数据
调 用:W_Byte() , R_Byte()
入口参数:Addr: DS1302地址, Data: 要写的数据
返 回 值:无
***********************************************************************/
void W_1302(unsigned char Addr, unsigned char Data)
{
CLEAR_RST();
CLEAR_CLK();
SET_RST();
SET_IO();
W_Byte(Addr); /* 地址,命令 */
W_Byte(Data); /* 写1Byte数据*/
SET_CLK();
CLEAR_RST();
}
/********************************************************************
函 数 名:R_1302()
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据
调 用:W_Byte() , R_Byte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据
***********************************************************************/
unsigned char R_1302(unsigned char Addr)
{
unsigned char Data1;
CLEAR_RST();
CLEAR_CLK();
SET_RST();
W_Byte(Addr); /* 地址,命令 */
Data1 = R_Byte(); /* 读1Byte数据 */
SET_CLK();
CLEAR_RST();
return Data1;
}
/********************************************************************
函 数 名:BurstW1302T()
功 能:往DS1302写入时钟数据(多字节方式)
说 明:先写地址,后写命令/数据
调 用:W_Byte()
入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B
返 回 值:无
***********************************************************************/
void BurstW1302T(unsigned char *Cdata)
{
unsigned char i;
W_1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
CLEAR_RST();
CLEAR_CLK();
SET_RST();
W_Byte(0xbe); /* 0xbe:时钟多字节写命令 */
for (i=0;i<8;i++) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
{
W_Byte(*Cdata); /* 写1Byte数据*/
Cdata++;
}
SET_CLK();
CLEAR_RST();
}
/********************************************************************
函 数 名:BurstR1302T()
功 能:读取DS1302时钟数据
说 明:先写地址/命令,后读数据(时钟多字节方式)
调 用:W_Byte() , R_Byte()
入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
***********************************************************************/
void BurstR1302T(unsigned char *Cdata)
{
unsigned char i;
CLEAR_RST();
CLEAR_CLK();
SET_RST();
W_Byte(0xbf); /* 0xbf:时钟多字节读命令 */
for (i=0;i<8;i++)
{
*Cdata = R_Byte(); /* 读1Byte数据 */
Cdata++;
}
SET_CLK();
CLEAR_RST();
}
/********************************************************************
函 数 名:BurstW1302R()
功 能:往DS1302寄存器数写入数据(多字节方式)
说 明:先写地址,后写数据(寄存器多字节方式)
调 用:W_Byte()
入口参数:pWReg: 寄存器数据地址
返 回 值:无
***********************************************************************/
void BurstW1302R(unsigned char *Cdata)
{
unsigned char i;
W_1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
CLEAR_RST();
CLEAR_CLK();
SET_RST();
W_Byte(0xfe); /* 0xbe:时钟多字节写命令 */
for (i=31; i>0; i--) /* 31Byte 寄存器数据 */
{
W_Byte(*Cdata); /* 写1Byte数据*/
Cdata++;
}
SET_CLK();
CLEAR_RST();
}
/********************************************************************
函 数 名:BurstR1302R()
功 能:读取DS1302寄存器数据
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:W_Byte() , R_Byte()
入口参数:pRReg: 寄存器数据地址
返 回 值:无
***********************************************************************/
void BurstR1302R(unsigned char *Cdata)
{
unsigned char i;
CLEAR_RST();
CLEAR_CLK();
SET_RST();
W_Byte(0xff); /* 0xff:时钟多字节读命令 */
for (i=31; i>0; i--) /*31Byte 寄存器数据 */
{
*Cdata = R_Byte(); /* 读1Byte数据 */
Cdata++;
}
SET_CLK();
CLEAR_RST();
}
/********************************************************************
函 数 名:Set_1302()
功 能:设置初始时间
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:W1302()
入口参数:pClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
返 回 值:无
***********************************************************************/
void Set_1302(unsigned char *pClock)
{
unsigned char i;
unsigned char Addr = 0x80;
W_1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i=0;i<7;i++)
{
W_1302(Addr,*pClock); /* 秒 分 时 日 月 星期 年 */
pClock++;
Addr +=2;
}
W_1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************
函 数 名:Get_1302()
功 能:读取DS1302当前时间
说 明:
调 用:R1302()
入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
返 回 值:无
***********************************************************************/
void Get_1302(unsigned char *Pclock)
{
unsigned char i;
unsigned char Addr = 0x81;
for (i=0; i<7; i++)
{
*Pclock++ = R_1302(Addr);/*格式为: 秒 分 时 日 月 星期 年 */
Addr += 2;
}
}
void Set_charge(void)
{
unsigned char Addr=0x90;
W_1302(Addr,0xA6); //10100110 diode is one resistor is 4K
}
void delay_1(void)
{
unsigned char i;
for(i=0;i<5;i++);
}
void CLOCK(void)
{
SET_CLK();
delay_1();
CLEAR_CLK();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -