📄 ds1302._c
字号:
/*********************************************************************************
*移植时一定要注意函数 void Ds1302buf_Write(uchar cmd, uchar data),中的方向和,读PIN引脚
*********************************************************************************/
#include <iom64v.h>
#include <macros.h>
#include "./ds1302.h"
#define uchar unsigned char
#define uint unsigned int
#define nop NOP(); \
NOP(); \
NOP(); \
NOP(); \
NOP()
#define sei() SEI()
#define cli() CLI()
#define DSCL(x) PORTE = (PORTE & ~(1<<2))|(x<<2)
#define DSDA(x) PORTE = (PORTE & ~(1<<3))|(x<<3)
#define DRST(x) PORTE = (PORTE & ~(1<<4))|(x<<4)
#define SEC_W 0x80 /*Ds1302buf命令字*/
#define SEC_R 0x81
#define MIN_W 0x82
#define MIN_R 0x83
#define hour_W 0x84
#define hour_R 0x85
#define DATE_W 0x86
#define DATE_R 0x87
#define MONTH_W 0x88
#define MONTH_R 0x89
#define WEEK_W 0x8a
#define WEEK_R 0x8b
#define YEAR_W 0x8c
#define YEAR_R 0x8d
#define WP_W 0x8E
#define POWER_W 0X90
extern struct time_now timebuf;
#define Ds1302buf timebuf
#define PRINTF_COM 1
void ds1302_init(void)
{
DDRE |= (1<<2)|(1<<3)|(1<<4);
PORTE |= (1<<2)|(1<<3)|(1<<4);
}
/*********************************************************************************************************************************************
写一个字节到Ds1302buf,参数分别为命令、数据
*********************************************************************************************************************************************/
void Ds1302buf_Write(uchar cmd, uchar data)
{uchar i;
DSCL(0);
DRST(0);
nop;
DRST(1);
nop;
for(i=0; i<8; i++)/*发送内部地址*/
{
DSCL(0);
nop;
if(cmd & (1<<i)) DSDA(1);
else DSDA(0);
DSCL(1);
nop;
}
for(i=0; i<8; i++)/*发送数据*/
{
DSCL(0);
nop;
if(data & (1<<i)) DSDA(1);
else DSDA(0);
DSCL(1);
nop;
}
DRST(0);
}
/*********************************************************************************************************************************************
从Ds1302buf读一个字节数据返回,参数只有命令,返回数据
*******************************************************************************************************************************************/
uchar Ds1302buf_Read(uchar cmd)
{
uchar i;
uchar data;
DSCL(0);
DRST(0);
nop;
DRST(1);
nop;
for(i=0; i<8; i++)/*发送内部地址*/
{
DSCL(0);
nop;
if(cmd & (1<<i)) DSDA(1);
else DSDA(0);
DSCL(1);
nop;
}
DDRE &= ~(1<<3);
DSDA(0);
DSCL(0);
nop;
if(PINE & (1<<3)) data |=0x80;
else data &= 0x7f;
for(i=0; i<7; i++)/*读数据*/
{ data >>=1;
DSCL(1);
nop;
DSCL(0);
nop;
if(PINE & (1<<3)) {data |=0x80;}
else {data &= 0x7f;}
}
DDRE |= 1<<3;
DRST(0);
return data;
}
/*********************************************************************************************************************************************
从Ds1302buf中读取时钟日历信息
*********************************************************************************************************************************************/
void Read_InfoDs1302buf(void)
{cli();
Ds1302buf.sec = Ds1302buf_Read(SEC_R) & 0x7f;
Ds1302buf.min = Ds1302buf_Read(MIN_R) & 0x7f;
Ds1302buf.hour = Ds1302buf_Read(hour_R) & 0x3f;
Ds1302buf.date = Ds1302buf_Read(DATE_R)& 0x3f;
Ds1302buf.month = Ds1302buf_Read(MONTH_R) & 0x1f;
Ds1302buf.week = Ds1302buf_Read(WEEK_R) & 0x07;
Ds1302buf.year = Ds1302buf_Read(YEAR_R);
sei();
}
/*********************************************************************************************************************************************
将时钟日历信息存储到Ds1302buf中
*********************************************************************************************************************************************/
void Write_InfoDs1302buf(void)
{cli();
Ds1302buf_Write(WP_W, 0x00);
Ds1302buf_Write(SEC_W, Ds1302buf.sec);
Ds1302buf_Write(MIN_W, Ds1302buf.min);
Ds1302buf_Write(hour_W, Ds1302buf.hour);
Ds1302buf_Write(DATE_W, Ds1302buf.date);
Ds1302buf_Write(MONTH_W, Ds1302buf.month);
Ds1302buf_Write(WEEK_W, Ds1302buf.week);
Ds1302buf_Write(YEAR_W, Ds1302buf.year);
Ds1302buf_Write(POWER_W, 0x16);
Ds1302buf_Write(WP_W, 0x80);
sei();
}
/****************************************************************************************************************************************
*****************************************************************************************************************************************
*************************************以上的部分很重要不可以轻易更改!*********************************************************************
*****************************************************************************************************************************************
****************************************************************************************************************************************/
/*********************************************************************************************************************************************
设置时间日期
*********************************************************************************************************************************************/
void Set_time(void)
{
Ds1302buf.sec = 0x10;
Ds1302buf.min = 0x34;
Ds1302buf.hour = 0x14;
Ds1302buf.date = 0x19;
Ds1302buf.month = 0x10;
Ds1302buf.week = 0x04;
Ds1302buf.year = 0x06;
Write_InfoDs1302buf();
}
/*********************************************************************************************************************************************
打印时间日期到超级终端
*********************************************************************************************************************************************/
void Printf_time(void)
{
#ifdef PRINTF_COM
uchar temp;
Read_InfoDs1302buf();
Print_str("当前时间:");
temp = Ds1302buf.hour;
temp >>= 4;
temp &= 0x0f;
USART_Transmit(temp+'0');
temp = Ds1302buf.hour;
temp &= 0x0f;
USART_Transmit(temp+'0');
Print_str(":");
temp = Ds1302buf.min;
temp >>= 4;
temp &= 0x0f;
USART_Transmit(temp+'0');
temp = Ds1302buf.min;
temp &= 0x0f;
USART_Transmit(temp+'0');
Print_str(":");
temp = Ds1302buf.sec;
temp >>= 4;
temp &= 0x0f;
USART_Transmit(temp+'0');
temp = Ds1302buf.sec;
temp &= 0x0f;
USART_Transmit(temp+'0');
Print_str("\r\n");
Print_str("当前日期:");
temp = Ds1302buf.year;
temp >>= 4;
temp &= 0x0f;
USART_Transmit(temp+'0');
temp = Ds1302buf.year;
temp &= 0x0f;
USART_Transmit(temp+'0');
Print_str("年");
temp = Ds1302buf.month;
temp >>= 4;
temp &= 0x0f;
USART_Transmit(temp+'0');
temp = Ds1302buf.month;
temp &= 0x0f;
USART_Transmit(temp+'0');
Print_str("月");
temp = Ds1302buf.date;
temp >>= 4;
temp &= 0x0f;
USART_Transmit(temp+'0');
temp = Ds1302buf.date;
temp &= 0x0f;
USART_Transmit(temp+'0');
Print_str("日 :");
Print_str(" 星期:");
temp = Ds1302buf.week;
temp >>= 4;
temp &= 0x0f;
USART_Transmit(temp+'0');
temp = Ds1302buf.week;
temp &= 0x0f;
USART_Transmit(temp+'0');
Print_str("\r\n");
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -