📄 ds1302.c
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include "bcd.h"
#include "ds1302.h"
void DS1302_Init(void)
{
sbi(DS1302_DDR, DS1302_SCLK);
sbi(DS1302_DDR, DS1302_IO); sbi(DS1302_DDR, DS1302_RST);
}
// 高 12 个机器周期 低 10 个机器周期
unsigned char _DS1302_RD_Byte(void)
{
unsigned char i, result = 0;
for(i = 0; i < 8; i++)
{
result >>= 1;
if (bit_is_set(DS1302_PIN, DS1302_IO))
{
result |= 0x80;
_delay_loop_1(1);
}
else
{
_delay_loop_1(2);
}
sbi(DS1302_PORT, DS1302_SCLK);
_delay_loop_1(4);
cbi(DS1302_PORT, DS1302_SCLK);
}
return (result);
}
// 高 12 个机器周期 低 10 个机器周期
void _DS1302_WR_Byte(unsigned char c)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
if (c & 0x01)
{
sbi(DS1302_PORT, DS1302_IO);
}
else
{
cbi(DS1302_PORT, DS1302_IO);
}
sbi(DS1302_PORT, DS1302_SCLK);
_delay_loop_1(4);
cbi(DS1302_PORT, DS1302_SCLK);
c >>= 1;
}
}
unsigned char DS1302_Read(unsigned char addr)
{
unsigned char result;
cbi(DS1302_PORT, DS1302_RST);
cbi(DS1302_PORT, DS1302_SCLK);
sbi(DS1302_PORT, DS1302_RST);
cli();
_DS1302_WR_Byte(addr);
result = _DS1302_RD_Byte();
sei();
cbi(DS1302_PORT, DS1302_RST);
return result;
}
void DS1302_Write(unsigned char addr, unsigned char value)
{
cbi(DS1302_PORT, DS1302_RST);
cbi(DS1302_PORT, DS1302_SCLK);
sbi(DS1302_PORT, DS1302_RST);
cli();
_DS1302_WR_Byte(addr);
_DS1302_WR_Byte(value);
sei();
cbi(DS1302_PORT, DS1302_RST);
}
void DS1302_Get_Time(unsigned char *hour, unsigned char *min, unsigned char *sec)
{
*hour = bcd2bin(DS1302_Read(DS1302_RD_HOUR));
*min = bcd2bin(DS1302_Read(DS1302_RD_MINUTE));
*sec = bcd2bin(DS1302_Read(DS1302_RD_SECOND));
}
void DS1302_Set_Time(unsigned char hour, unsigned char min, unsigned char sec)
{
DS1302_Write(DS1302_WR_CTRL, 0x00);
DS1302_Write(DS1302_WR_HOUR, bin2bcd(hour));
DS1302_Write(DS1302_WR_CTRL, 0x00);
DS1302_Write(DS1302_WR_MINUTE, bin2bcd(min));
DS1302_Write(DS1302_WR_CTRL, 0x00);
DS1302_Write(DS1302_WR_SECOND, bin2bcd(sec));
}
void DS1302_Get_Date(unsigned char *year, unsigned char *month, unsigned char *day, unsigned char *week)
{
*year = bcd2bin(DS1302_Read(DS1302_RD_YEAR));
*month = bcd2bin(DS1302_Read(DS1302_RD_MONTH));
*day = bcd2bin(DS1302_Read(DS1302_RD_DAY));
*week = bcd2bin(DS1302_Read(DS1302_RD_WEEK));
}
void DS1302_Set_Date(unsigned char year, unsigned char month, unsigned char day, unsigned char week)
{
DS1302_Write(DS1302_WR_CTRL, 0x00);
DS1302_Write(DS1302_WR_YEAR, bin2bcd(year));
DS1302_Write(DS1302_WR_CTRL, 0x00);
DS1302_Write(DS1302_WR_MONTH, bin2bcd(month));
DS1302_Write(DS1302_WR_CTRL, 0x00);
DS1302_Write(DS1302_WR_DAY, bin2bcd(day));
DS1302_Write(DS1302_WR_CTRL, 0x00);
DS1302_Write(DS1302_WR_WEEK, bin2bcd(week));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -