📄 sd2000.c
字号:
#include <intrins.h>
#include"sd2000.h"
unsigned char date[7]; //日期数组
/*date[0]=year,date[1]=month,date[2]=day,date[3]=week,
date[4]=hour,date[5]=minute,date[6]=second*/
/*********I2C延时***********/
void I2CWait(void)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();
}
/********开启SD2000的I2C总线********/
bit I2CStart(void)
{
SDA=1;
SCL=1;
I2CWait();
if(!SDA)return false;//SDA线为低电平则总线忙,退出
SDA=0;
I2CWait();
while(SDA)return false;//SDA线为高电平则总线出错,退出
SCL=0;
I2CWait();
return true;
}
/********关闭SD2000的I2C总线*******/
void I2CStop(void)
{
SDA=0;
SCL=0;
I2CWait();
SCL=1;
I2CWait();
SDA=1;
}
/*********发送 ACK*********/
void I2CAck(void)
{
SDA=0;
SCL=0;
I2CWait();
SCL=1;
I2CWait();
SCL=0;
}
/*********发送NO ACK*********/
void I2CNoAck(void)
{
SDA=1;
SCL=0;
I2CWait();
SCL=1;
I2CWait();
SCL=0;
}
/*********读取ACK信号*********/
bit I2CWaitAck(void) //返回为:1=有ACK,0=无ACK
{
uchar errtime=255;
SCL=0;
SDA=1;
I2CWait();
SCL=1;
I2CWait();
while(SDA)
{
errtime--;
if(!errtime)
SCL=0;
return false;
}
SCL=0;
return true;
}
/************从SD2000发送一个字节*************/
void I2CSendByte(uchar demand,bit order) //order=1,H_L;order=0,L_H
{
uchar i=8; //order=1,从HI-->LO发送8bit数据
//order=0,从LO-->HI发送8bit数据
if(order)
{
while(i--)
{
SCL=0;
_nop_();
_nop_();
SDA=(bit)(demand&0x80);
demand<<=1;
I2CWait();
SCL=1;
I2CWait();
}
SCL=0;
}
else
{
while(i--)
{
SCL=0;
_nop_();
_nop_();
SDA=(bit)(demand&0x01);
demand>>=1;
I2CWait();
SCL=1;
I2CWait();
}
SCL=0;
}
}
/*********MCU从SD2000读入一字节*********/
uchar I2CReceiveByte(void)
{
uchar i=8;
uchar ddata=0;
SDA=1;
while(i--)
{
ddata>>=1; //数据从低位开始读取
SCL=0;
I2CWait();
SCL=1;
I2CWait(); //从低位开始 ddata|=SDA;ddata>>=1
if(SDA)
{
ddata|=0x80;
}
}
SCL=0;
return ddata;
}
/******读SD2000实时数据寄存器******/
void I2CReadDate(void)
{
uchar n;
I2CStart();
I2CSendByte(0x65,1); //从年开始读取数据
I2CWaitAck();
for(n=0;n<7;n++)
{
date[n]=I2CReceiveByte();
if (n!=6) //最后一个数据不应答
{
I2CAck();
}
}
I2CNoAck();
I2CStop();
}
/*写SD2000状态寄存器命令*/
void I2CWriteStatus(void)
{
I2CStart();
I2CSendByte(0x62,1); //发送SD2000状态寄存器命令,
I2CWaitAck();
I2CSendByte(0x7f,0); //24小时制,开所有中断
I2CWaitAck();
I2CStop();
}
/*写SD2000时间寄存器命令*/
void I2CWriteTime(void)
{
uchar n;
date[0]=0x06;//year;06/11/15/06/13/14/50
date[1]=0x12;//month
date[2]=0x15;//day
date[3]=0x05;//week
date[4]=0x09;//hour
date[5]=0x19;//minute
date[6]=0x00;//second
I2CStart();
I2CSendByte(0x64,1); //发送SD2000写时间寄存器命令,
I2CWaitAck();
for(n=0;n<7;n++)
{
I2CSendByte(date[n],0);
I2CWaitAck();
}
I2CStop();
}
/*********延时子程序*********
void Delay(uint nn)
{
while(nn--);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -