📄 time.c
字号:
#include <time.h>
/********************************************
内部函数,I2C开始
********************************************/
static bit Start(void)
{
SDA=1;
SCL=1;
Delay();
if(!SDA) return false; //SDA线为低电平则总线忙,退出
SDA=0;
Delay();
if(SDA) return false; //SDA线为高电平则总线出错,退出
SCL=0;
Delay();
return true;
}
/********************************************
内部函数,I2C结束
********************************************/
static void Stop()
{
SDA=0;
Delay();
SCL=1;
Delay();
SDA=1;
Delay();
}
/********************************************
内部函数,输出ACK=0
********************************************/
static void SendAck()
{
SDA=0;
Delay();
SCL=1;
Delay();
SCL=0;
Delay();
}
/********************************************
内部函数,输出ACK=1
********************************************/
static void SendNak()
{
SDA=1;
Delay();
SCL=1;
Delay();
SCL=0;
Delay();
}
/********************************************
内部函数,等待ACK
********************************************/
/*********读取ACK信号*********/
static bit WaitAck(void) //返回为:1=有ACK,0=无ACK
{
uchar i=0xff;
SCL=0;
SDA=1;
Delay();
SCL=1;
Delay();
while(SDA)
{
if((i--)==0)
{
SCL = 0;
return false;
}
}
SCL=0;
return true;
}
/********************************************
内部函数.输出数据字节
入口:B=数据
********************************************/
static void WriteByte(uchar Data)
{
uchar i;
for(i=0;i<8;i++)
{
SDA = Data & 0x80;
Data<<=1;
SCL=1;
Delay();
SCL=0;
Delay();
}
}
/********************************************
内部函数.输入数据
出口:B
********************************************/
static uchar ReadByte(void)
{
uchar i,Data=0;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
Data<<=1;
Data|=SDA;
SCL=0;
Delay();
}
return(Data);
}
/********************************************
读时间
********************************************/
/*void ReadDate(void)
{
if(Fhsec) //系统每0.5S读一次时间
{
bit Flag;
Flag = 1;
Fhsec = 0;
while(Flag)
{
if(I2CStart()) //判断开始是否正确
{
I2CSendByte(0x65);
if(I2CWaitAck()) //判断ACK是否正确
{
TimeBuf.Time.Second = I2CReceiveByte()&0x7f; //秒
I2CAck();
TimeBuf.Time.Minute = I2CReceiveByte()&0x7f; //分
I2CAck();
TimeBuf.Time.Hour = I2CReceiveByte()&0x3f; //时
I2CAck();
TimeBuf.Time.Week = I2CReceiveByte()&0x07; //星期
I2CAck();
TimeBuf.Time.Day = I2CReceiveByte()&0x3f; //日
I2CAck();
TimeBuf.Time.Month = I2CReceiveByte()&0x1f; //月
I2CAck();
TimeBuf.Time.Year = I2CReceiveByte(); //年
I2CNoAck(); //最后一个数据不应答
Flag = 0;
}
}
I2CStop();
}
}
}
*/
void ReadDate(void)
{
if(Fhsec)
{
bit Flag = 1;
Fhsec = 0;
while(Flag)
{
if(Start())
{
WriteByte(0xa2);
if(WaitAck())
{
WriteByte(0x02); //设置地址
if(WaitAck())
{
if(Start()) //重启总线
{
WriteByte(0xa3); //发读取命令
if(WaitAck())
{
TimeBuf.Time.Second = ReadByte() & 0x7f; //秒
SendAck();
TimeBuf.Time.Minute = ReadByte() & 0x7f; //分
SendAck();
TimeBuf.Time.Hour = ReadByte() & 0x3f; //时
SendAck();
TimeBuf.Time.Day = ReadByte() & 0x3f; //日
SendAck();
TimeBuf.Time.Week = ReadByte() & 0x07; //星期
SendAck();
TimeBuf.Time.Month = ReadByte() & 0x1f; //月
SendAck();
TimeBuf.Time.Year = ReadByte(); //年
SendNak();
Flag = 0;
}
}
}
}
}
Stop();
}
}
}
/********************************************
写时间
********************************************/
void WriteDate(void)
{
Start();
WriteByte(0xa2);
WaitAck();
WriteByte(0x00);
WaitAck();
WriteByte(0x00);
WaitAck();
WriteByte(0x0c);
WaitAck();
WriteByte(TimeBuf.Time.Second);
WaitAck();
WriteByte(TimeBuf.Time.Minute);
WaitAck();
WriteByte(TimeBuf.Time.Hour);
WaitAck();
WriteByte(TimeBuf.Time.Day);
WaitAck();
WriteByte(TimeBuf.Time.Week);
WaitAck();
WriteByte(TimeBuf.Time.Month);
WaitAck();
WriteByte(TimeBuf.Time.Year);
WaitAck();
Stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -