📄 ds1307.c
字号:
#include "config.h"
#include <intrins.h>
#include "io.h"
#include "ds1307.h"
#include "global.h"
/* RTC读写 */
void RTCStart(void)
{
SDA=1;
_nop_();
SCL=1;
_nop_();
_nop_();
SDA=0;
SCL=0;
}
void RTCStop(void)
{
SCL=0;
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=1;
}
void RTCNoAck(void)
{
SDA=1;
_nop_();
SCL=1;
_nop_();
_nop_();
SCL=0;
}
bit RTCTestAck(void)
{
bit ErrB;
SDA=1;
_nop_();
SCL=1;
_nop_();
ErrB=SDA;
SCL=0;
return(ErrB);
}
bit RTCWrite8Bit(U8 input)
{
U8 i;
for(i=8; i!=0; i--)
{
SDA = (bit)(input&0x80);
SCL = 1;
input = input<<1;
SCL = 0;
}
return (1);
}
U8 RTCRead8Bit(void)
{
U8 i,rbyte;
rbyte = 0;
for(i=8; i!=0; i--)
{
SCL=1;
rbyte = rbyte<<1;
rbyte = rbyte|((U8)(SDA));
SCL=0;
}
return(rbyte);
}
void RTCWrite(U8 RTCAddress,U8 Wdata)
{
RTCStart();
RTCWrite8Bit(RTCWRITEADDRESS);
RTCTestAck();
RTCWrite8Bit(RTCAddress);
RTCTestAck();
RTCWrite8Bit(Wdata);
RTCTestAck();
RTCStop();
delayms(10);
}
U8 RTCRead(U8 RTCAddress)
{
U8 rbyte;
RTCStart();
RTCWrite8Bit(RTCWRITEADDRESS); /* 写RTC SLAVE 地址 */
RTCTestAck();
RTCWrite8Bit(RTCAddress); /* 写RTC具体地址 */
RTCTestAck();
RTCStart();
RTCWrite8Bit(RTCREADADDRESS);
RTCTestAck();
rbyte = RTCRead8Bit();
RTCNoAck();
RTCStop();
return(rbyte);
}
/* end of RTC读写 */
/* RTC操作 */
void initRTC(void)
{
if((RTCRead(RTC_CHK1) != 0x3d) ||
(RTCRead(RTC_CHK2) != 0x6c) ||
(RTCRead(RTC_SECOND) & 0x80))
{ /* RTC第一次使用或掉电后启动 */
RTCWrite(RTC_SECOND,0); // enable the oscillator AND set RTC_SECOND=0
RTCWrite(RTC_MINUTE,0);
RTCWrite(RTC_HOUR,0x12); // 24 hours mode, set RTC_HOUR=12
RTCWrite(RTC_DATE,1);
RTCWrite(RTC_MONTH,1);
RTCWrite(RTC_YEAR,0); // set to "2000.01.01 12:00"
RTCWrite(RTC_DAY,6); // 2000.01.01 IS Saturday
RTCWrite(RTC_CHK1,0x3d);
RTCWrite(RTC_CHK2,0x6c);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -