📄 sd2300api.c
字号:
#include "fun.h"
#include "var.h"
//SD2300API.C
/*功能:提供I2C总线工作时序中的起始位*/
void I2C_start(void)
{SCLK=1;
delay(1);
SDAT=0;
delay(1);
SCLK=0;
delay(1);}
/*功能:提供I2C总线工作时序中的停止位*/
void I2C_stop(void)
{SDAT=0;
delay(1);
SCLK=1;
delay(1);
SDAT=1;
delay(1);
SCLK=0;
delay(1);
}
/*功能:I2C总线初始化。在MAIN()函数中应先调用本函数,然后再调用其他函数。*/
void I2C_init(void)
{SCLK=0;
I2C_stop();}
/*功能:提供I2C的时钟信号,并返回在时钟电平为高期间SDAT信号线上状态。
*本函数可用于数据接收。*/
bit I2C_clock(void)
{bit sample;
SCLK=1;
delay(1);
sample=SDAT;
SCLK=0;
delay(1);
return(sample);}
/*功能:向I2C总线发送8位数据,并请求一个应答信号ACK。
*如果收到ACK应答则返回1,否则返回0*/
bit I2C_send(uchar I_data)
{uchar i;
/*发送8位数据*/
for (i=0;i<8;i++)
{SDAT=(bit)(I_data&0x80);
I_data=I_data<<1;
I2C_clock();}
/*请求应答信号ACK*/
SDAT=1;
return(~I2C_clock());}
/*功能:从I2C总线上接收8位数据信号,并将接收到8位数据作为一个
*字节返回,不回送应答信号ACK。主函数在调用本函数之前应保证SDA
*信号线处于浮置状态,即SDA置1。*/
uchar I2C_receive(void)
{uchar I_data=0;
uchar i;
for(i=0;i<8;i++)
{I_data<<=1;
if(I2C_clock())I_data++;}
return(I_data);
}
/*功能:向I2C总线发送一个应答信号ACK,一般用于连续数据读取时。*/
void I2C_Ack(void)
{SDAT=0;
I2C_clock();
SDAT=1;}
/*功能:向SD2300API写入器件地址和一个指定的字节地址*/
bit wr_address(uchar Address)
{I2C_start();
if(I2C_send(I2C_SD2300API_WR))return(I2C_send(Address));
else return(FALSE);
}
//初始化SD2300API
bit init_sd2300api(void)
{I2C_init();
if(wr_address(ADDR_ADJUST)) //从时间调整寄存器地址开始
{//时间调整寄存器
if(!I2C_send(ADJUST)){I2C_stop();return(FALSE);}
//ALARM-A定时:每天18点00分
if(!I2C_send(MINUTE_A)){I2C_stop();return(FALSE);}
if(!I2C_send(HOUR_A)){I2C_stop();return(FALSE);}
if(!I2C_send(WEEK_A)){I2C_stop();return(FALSE);}
//ALARM-B定时:每天18点00分
if(!I2C_send(MINUTE_B)){I2C_stop();return(FALSE);}
if(!I2C_send(HOUR_B)){I2C_stop();return(FALSE);}
if(!I2C_send(WEEK_B)){I2C_stop();return(FALSE);}
//控制寄存器1设置
if(!I2C_send(CONTROL1)){I2C_stop();return(FALSE);}
//控制寄存器2设置
if(!I2C_send(CONTROL2)){I2C_stop();return(FALSE);}
I2C_stop();delay(600); return(TRUE);
}
else {I2C_stop();return(FALSE);}
}
//读时间日期
bit rd_date(void)
{EA=0;
I2C_init();
if(wr_address(ADDR_SECOND))/*发送重复启动信号*/
{I2C_start();
if(I2C_send(I2C_SD2300API_RD))
{bcd1_realtime.second=I2C_receive();I2C_Ack();
bcd1_realtime.minute=I2C_receive();I2C_Ack();
bcd1_realtime.hour =I2C_receive();I2C_Ack();
bcd1_realtime.week =I2C_receive();I2C_Ack();
bcd1_realtime.day =I2C_receive();I2C_Ack();
bcd1_realtime.month =I2C_receive();I2C_Ack();
bcd1_realtime.year =I2C_receive();I2C_Ack();
I2C_stop();EA=1;return(TRUE);
}
else{I2C_stop();EA=1;return(FALSE);}
}
else {I2C_stop();EA=1;return(FALSE);}
EA=1;
}
//写时间日期
bit wr_date(void)
{EA=0;
I2C_init();
if(wr_address(ADDR_SECOND)) //从秒地址开始
{//秒,分,时,周,日,月,年
if(!I2C_send(bcd1_realtime.second)){I2C_stop();EA=1;return(FALSE);}
if(!I2C_send(bcd1_realtime.minute)){I2C_stop();EA=1;return(FALSE);}
if(!I2C_send(bcd1_realtime.hour)) {I2C_stop();EA=1;return(FALSE);}
if(!I2C_send(bcd1_realtime.week)) {I2C_stop();EA=1;return(FALSE);}
if(!I2C_send(bcd1_realtime.day)) {I2C_stop();EA=1;return(FALSE);}
if(!I2C_send(bcd1_realtime.month)) {I2C_stop();EA=1;return(FALSE);}
if(!I2C_send(bcd1_realtime.year)) {I2C_stop();EA=1;return(FALSE);}
//时间调整寄存器
if(!I2C_send(ADJUST)){I2C_stop();EA=1;return(FALSE);}
I2C_stop();delay(600);EA=1;return(TRUE);
}
else {I2C_stop();EA=1;return(FALSE);}
}
/*
//查中断标记,返回
uchar rd_control2(void)
{uchar i;
I2C_init();
if(wr_address(ADDR_CONTROL2))//发送重复启动信号
{I2C_start();
if(I2C_send(I2C_SD2300API_RD))
{i=I2C_receive();
I2C_Ack();
I2C_stop();
return(i);
}
else{I2C_stop();return(FALSE);}
}
else {I2C_stop();return(FALSE);}
} */
//清中断标记
uchar wr_control2(void)
{I2C_init();
if(wr_address(ADDR_CONTROL2))
{//清除中断标记
if(!I2C_send(CONTROL2)){I2C_stop();return(FALSE);}
I2C_stop();delay(600); return(TRUE);
}
else {I2C_stop();return(FALSE);}
}
/********************中断************************/
/*外部中断INT0初始化函数*/
/*
void init_int0(void)
{INT0=1;
PX0=0; //高优先级
IT0=1; //边沿触发
EX0=1;
EA=1;
}
/*外部中断INT0中断函数*/
/*
void interrupt_int0(void) interrupt 0 using 2
{flag_int0=TRUE;
//EX0=1;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -