📄 ds1302.c
字号:
#include "reg51.h"
#include "typedef.h"
#include "lcd.h"
#include "ds1302.h"
#include "key.h"
void reset_3w();
void wbyte_3w(uchar);
uchar rbyte_3w();
void write_byte(uchar Clock_Add,uchar Clock_Data);
uchar read_byte(uchar);
void write_clock_burst();
void ds1302_init();
void ds1302_task();
void reset_3w() /* ----- reset and enable the 3-wire interface ------ */
{
SCLK = 0;
RST = 0;
RST = 1;
}
void wbyte_3w(uchar W_Byte) /* ------ write one byte to the device ------- */
{
uchar i;
for(i = 0; i < 8; ++i)
{
IO = 0;
if(W_Byte & 0x01)
{
IO = 1; /* set port pin high to read data */
}
SCLK = 0;
SCLK = 1;
W_Byte >>= 1;
}
}
uchar rbyte_3w() //read one byte from the device
{
uchar i;
uchar R_Byte;
uchar TmpByte;
R_Byte = 0x00;
IO = 1;
for(i = 0; i < 8; i++)
{
SCLK = 1;
SCLK = 0;
TmpByte = (uchar)IO;
TmpByte <<= 7;
R_Byte >>= 1;
R_Byte |= TmpByte;
}
return R_Byte;
}
void write_byte(uchar Clock_Add,uchar Clock_Data) //write one byte using values entered by user
{
reset_3w();
wbyte_3w(Clock_Add);
wbyte_3w(Clock_Data);
reset_3w();
}
void write_clock_burst()
{
reset_3w();
wbyte_3w(CLOCK_BURST_ADD); /* clock burst write (eight registers) */
wbyte_3w(hex2bcd[sec]);
wbyte_3w(hex2bcd[min]);
wbyte_3w(hex2bcd[hour]);
wbyte_3w(hex2bcd[date]);
wbyte_3w(hex2bcd[month]);
wbyte_3w(hex2bcd[day_of_week]);
wbyte_3w(hex2bcd[year]);
wbyte_3w(0); /* must write control register in burst mode */
reset_3w();
}
uchar read_byte(uchar Clock_Add) // Read one byte from DS1302
{
uchar Clock_Data;
reset_3w();
wbyte_3w(Clock_Add);
Clock_Data = rbyte_3w();
reset_3w();
return(Clock_Data);
}
void ds1302_init() /* --- initialize time & date for default value --- */
/* Note: NO error checking is done on the user entries! */
{
reset_3w();
wbyte_3w(0x8e); // control register
wbyte_3w(0); // disable write protect
reset_3w();
wbyte_3w(0x90); // trickle charger register
wbyte_3w(0xa4); //enable, 2 diodes, 8K resistor
write_clock_burst(); //写入初始化时间
}
void ds1302_task()
{
//if(!key_enable)
//{
sec = bcd2hex[read_byte(READ_SEC_ADD)]; //读DS1302 sec
min = bcd2hex[read_byte(READ_MIN_ADD)]; //读DS1302 min
hour = bcd2hex[read_byte(READ_HOUR_ADD)]; //读DS1302 hour
date = bcd2hex[read_byte(READ_DATE_ADD)]; //读DS1302 day和day_of_week
//day_of_week = bcd2hex[read_byte(READ_DOW_ADD)];
month = bcd2hex[read_byte(READ_MONTH_ADD)]; //读DS1302 month
year = bcd2hex[read_byte(READ_YEAR_ADD)]; //读DS1302 year
//}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -