📄 ds1302.c
字号:
#include<iom16v.h>
#include<macros.h>
#include "ds1302.h"
unsigned char INITDATE[8]={0x55, //55秒
0x59, //59分
0x23, //23时 24小时制
0x31, //21日
0x12, //08月
0x02, //星期2
0x07, //2007年
0x80 //写保护
};
/********************************************************************
函 数 名:RTInputByte()
功 能:实时时钟写入一字节
说 明:往DS1302写入1Byte数据 (内部函数)
入口参数:d 写入的数据
返 回 值:无
***********************************************************************/
void RTInputByte(unsigned char x)
{
unsigned char i,j;
for(i=0; i<8;i++)
{
if(x&(1<<i))
DS1302_PORT|=(1<<DS1302_DATA);
else
DS1302_PORT&=~(1<<DS1302_DATA);
DS1302_PORT|=(1<<DS1302_CLK);
for(j=0; j<5;j++);
DS1302_PORT&=~(1<<DS1302_CLK);
for(j=0; j<5;j++);
}
}
/********************************************************************
函 数 名:RTOutputByte()
功 能:实时时钟读取一字节
说 明:从DS1302读取1Byte数据 (内部函数)
入口参数:无
返 回 值:ACC
***********************************************************************/
unsigned char RTOutputByte(void)
{
unsigned char i,k,data,j;
DS1302_DDR&=~(1<<DS1302_DATA);
for(j=0; j<5;j++);
for(i=0; i<8; i++)
{
k=(DS1302_PIN&(1<<DS1302_DATA)); //读数据,从低位开始
if(k)
data|=(1<<i);
else
data&=~(1<<i);
DS1302_PORT|=(1<<DS1302_CLK);
for(j=0; j<5;j++);
DS1302_PORT&=~(1<<DS1302_CLK);
for(j=0; j<5;j++);
}
DS1302_DDR|=(1<<DS1302_DATA);
return(data);
}
void BCDtoASCII(unsigned char cBCD,unsigned char *pstr)
{
unsigned char i,j;
i=cBCD>>4;
j=cBCD&0x0F;
*pstr++=i+0x30;
*pstr=j+0x30;
}
/********************************************************************
函 数 名:W1302()
功 能:往DS1302写入数据
说 明:先写地址,后写命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData: 要写的数据
返 回 值:无
***********************************************************************/
void W1302(unsigned char ucAddr, unsigned char ucDa)
{
DS1302_PORT&=~(1<<DS1302_RST); // RST to L
DS1302_PORT&=~(1<<DS1302_CLK); // CLK to L
DS1302_PORT|=(1<<DS1302_RST); // RST to H
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 写1Byte数据*/
DS1302_PORT|=(1<<DS1302_CLK); //CLK to H
DS1302_PORT&=~(1<<DS1302_RST); //RST to L
}
/********************************************************************
函 数 名:R1302()
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据
***********************************************************************/
unsigned char R1302(unsigned char ucAddr)
{
unsigned char ucData;
DS1302_PORT&=~(1<<DS1302_RST); // RST to L
DS1302_PORT&=~(1<<DS1302_CLK); // CLK to L
DS1302_PORT|=(1<<DS1302_RST); // RST to H
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 读1Byte数据 */
DS1302_PORT|=(1<<DS1302_CLK); //CLK to H
DS1302_PORT&=~(1<<DS1302_RST); //RST to L
return(ucData);
}
void init_1302()
{
DS1302_DDR|=(1<<DS1302_RST);
DS1302_DDR|=(1<<DS1302_CLK);
DS1302_DDR|=(1<<DS1302_DATA);
W1302(0x8e,0x00); //关闭寄存器写保护
W1302(0x90,0x00); //写充电寄存器
W1302(0x80,0x00); //秒寄存器停止位置0,时钟启动,初值设为0
//设置时间
W1302(0x80,INITDATE[0]);
W1302(0x82,INITDATE[1]);
W1302(0x84,INITDATE[2]);
W1302(0x86,INITDATE[3]);
W1302(0x88,INITDATE[4]);
W1302(0x8a,INITDATE[5]);
W1302(0x8c,INITDATE[6]);
W1302(0x8e,INITDATE[7]);
//设置时间
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -