📄 ds1302.c
字号:
/*********************************************************************************************************
* DS1302 drivers
* QZhao,2007
* All Rights Reserved
* File : ds1302.c
* By : QZhao
* Contact : zq1987731@163.com
*********************************************************************************************************/
/*★★★可调用函数:v_Set1302()->初始时间设定 v_Get1302()->时间读取
DIS_D_Z()->时间类型数据转ASC存入缓冲区*/
/*********************************************************************************************************
*
* DS1302数据写入子函数
* 入口参数: dat 写入的数据
* 返回值:成功则返回TRUE
* 功能: 往DS1302 写入1Byte 数据
*
*********************************************************************************************************/
static bool v_RTInputByte(uchar ucdat)
{
uchar i;
for(i=8;i>0;i--)
{
DS1302_IO=(bit)(ucdat & 0x01); //RRC
DS1302_SCLK=1;
_nop_();
DS1302_SCLK=0;
ucdat>>=1;
}
return TRUE;
}
/*********************************************************************************************************
*
* DS1302数据读取子函数
* 入口参数:无
* 返回值:成功则返回TRUE
* 功能:从DS1302读取1Byte 数据
*
*********************************************************************************************************/
static uchar uc_RTOutputByte(void)
{
uchar i;
uchar ucdat=0;
for(i=8;i>0;i--)
{
DS1302_IO=1;
ucdat>>=1; //RRC
if(DS1302_IO)ucdat|=0x80;
DS1302_SCLK = 1;
_nop_();
DS1302_SCLK = 0;
}
return ucdat;
}
/*********************************************************************************************************
*
* DS1302数据按地址写子函数
* 入口参数:(address: DS1302地址, dat: 要写的数据)
* 返回值:成功则返回TRUE
* 功能:往DS1302 写入数据
*
*********************************************************************************************************/
static bool v_W1302(uchar address,uchar ucdat)
{
W_8255(0x02,1); //PC1置0
DS1302_SCLK=0;
W_8255(0x03,1); //PC1置1
v_RTInputByte(address); /* 地址,命令 */
v_RTInputByte(ucdat); /* 写1Byte 数据*/
DS1302_SCLK=1;
W_8255(0x02,1);
return TRUE;
}
/*********************************************************************************************************
*
* DS1302数据按地址读子函数
* 入口参数:相关地址
* 返回值:成功则返回TRUE
* 功能:从DS1302 读出数据
*
*********************************************************************************************************/
static uchar uc_R1302(uchar address)
{
uchar ucdat;
W_8255(0x02,1); //PC1置0
DS1302_SCLK=0;
W_8255(0x03,1); //PC1置1
v_RTInputByte(address); /* 地址,命令 */
ucdat = uc_RTOutputByte(); /* 读1Byte 数据 */
DS1302_SCLK=1;
W_8255(0x02,1);
return ucdat;
}
/*********************************************************************************************************
*
* DS1302初始时间设定子函数
* 入口参数:(初始时间设定)
* 返回值:成功则返回TRUE
* 功能:DS1302初始时间设定(BCD)
*
*********************************************************************************************************/
bool v_Set1302(void)
{
v_W1302(DS1302_CON_WR,0x00); // 控制命令,WP=0,写操作
v_W1302(DS1302_SEC_WR, TIME.SEC ); // 秒 分 时 日 月 星期 年
v_W1302(DS1302_MIN_WR, TIME.MIN );
v_W1302(DS1302_HR_WR, TIME.HR );
v_W1302(DS1302_DATE_WR, TIME.DATE );
v_W1302(DS1302_MONTH_WR,TIME.MONTH );
v_W1302(DS1302_DAY_WR, TIME.DAY );
v_W1302(DS1302_YEAR_WR, TIME.YEAR );
v_W1302(DS1302_CON_WR,0x80); /* 控制命令,WP=1,写保护*/
return TRUE;
}
/*********************************************************************************************************
*
* DS1302当前时间读取子函数
* 入口参数:(用于时间存放的结构体变量)
* 返回值:将读取到的时间存入给定的存放单元中
* 功能:读取DS1302当前时间并存入指定结构体变量内(BCD)
*
*********************************************************************************************************/
bool v_Get1302(void)
{
TIME.SEC = uc_R1302(DS1302_SEC_RD );
TIME.MIN = uc_R1302(DS1302_MIN_RD );
TIME.HR = uc_R1302(DS1302_HR_RD );
TIME.DATE = uc_R1302(DS1302_DATE_RD );
TIME.MONTH = uc_R1302(DS1302_MONTH_RD );
TIME.DAY = uc_R1302(DS1302_DAY_RD );
TIME.YEAR = uc_R1302(DS1302_YEAR_RD );
return TRUE;
}
/*********************************************************************************************************
*
* 初始化 DS1302
*
*********************************************************************************************************/
bool DS1302_initial(void)
{
DS1302_SCLK=0;
W_8255(0x02,1);
v_W1302(DS1302_CON_WR,0x00);
v_W1302(0x90,0x00);
return TRUE;
}
/*********************************************************************************************************
*
* 结构体成员-数值转换
*
*********************************************************************************************************/
bool DIS_D_Z(void)
{
uchar a,b;
a=TIME.YEAR>>4;
b=TIME.YEAR&0x0F;
DIS_BUF_D[0][0]=a+0x30;
DIS_BUF_D[0][1]=b+0x30;
a=TIME.MONTH>>4;
b=TIME.MONTH&0x0F;
DIS_BUF_D[1][0]=a+0x30;
DIS_BUF_D[1][1]=b+0x30;
a=TIME.DATE>>4;
b=TIME.DATE&0x0F;
DIS_BUF_D[2][0]=a+0x30;
DIS_BUF_D[2][1]=b+0x30;
a=TIME.DAY>>4;
b=TIME.DAY&0x0F;
DIS_BUF_D[3][0]=a+0x30;
DIS_BUF_D[3][1]=b+0x30;
a=TIME.HR>>4;
b=TIME.HR&0x0F;
DIS_BUF_D[4][0]=a+0x30;
DIS_BUF_D[4][1]=b+0x30;
a=TIME.MIN>>4;
b=TIME.MIN&0x0F;
DIS_BUF_D[5][0]=a+0x30;
DIS_BUF_D[5][1]=b+0x30;
a=TIME.SEC>>4;
b=TIME.SEC&0x0F;
DIS_BUF_D[6][0]=a+0x30;
DIS_BUF_D[6][1]=b+0x30;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -