uf = dat_buf 《《 1;/* 將數據的最高位移入到PSW中的CY位中 */
I2C_SCL = 0;
delay_5us();
I2C_SDA = CY; /* 將CY里的數據發送到sda數據線上 */
delay_5us();
I2C_SCL = 1; /* 在scl為高電平時,不允許sda上的數據變化,使數據穩定 */
delay_5us();
I2C_SCL = 0; /* 允許sda數據線的數據變化,等待下一個數據的傳輸 */
delay_5us();
}
/* wait ack */
I2C_SCL = 0; /* 允許SDA變化 */
delay_5us();
I2C_SCL = 1;
delay_5us(); /* SDA拉高等待應答,當SDA = 0時,表示從機的應答 */
}
uchar I2C_receiveByte(void)
{
bit bit_buf = 0;
uchar cnt = 0;
uchar dat = 0;
I2C_SCL = 0; /* 讀之前允許SDA變化 */
delay_5us();
for(cnt = 0;cnt 《 8;cnt++)
{
I2C_SCL = 1; /* 拉高SCL禁止SDA變化 */
delay_5us();
bit_buf = I2C_SDA; /* 讀出SDA上的數據 */
dat = (dat 《《 1)|bit_buf;
I2C_SCL = 0; /* 允許SDA變化等待下次數據的到來 */
delay_5us();
}
return dat;
}
void I2C_Init(void)
{
I2C_SDA = 1;
delay_5us();
I2C_SCL = 1;
delay_5us();
}
void DS1307_writeByte(uchar addr,uchar dat) /* 讀取單字節 */
{
I2C_Start();
I2C_sendByte(DS1307_WRITE);
I2C_Ack();
I2C_sendByte(addr); /* addr為目標地址 */
I2C_Ack();
I2C_sendByte(dat);
I2C_Ack();
I2C_Stop();
}
void DS1307_writeData(uchar addr_st,uchar dat[],uint num) /* num為要傳入的字節數 */
{
uchar cnt = 0;
I2C_Start();
I2C_sendByte(DS1307_WRITE);
I2C_Ack();
I2C_sendByte(addr_st); /* addr_st為起始地址 */
I2C_Ack();
for(cnt = 0;cnt 《 num;cnt++)
{
I2C_sendByte(dat[cnt]);
I2C_Ack();
}
I2C_Stop();
}
uchar DS1307_readByte(uchar addr)
{
uchar dat_buf = 0;
I2C_Start();
I2C_sendByte(DS1307_WRITE);
I2C_Ack();
I2C_sendByte(addr);
I2C_Ack();
I2C_Start(); /* 再次啟動I2C傳送數據 */
I2C_sendByte(DS1307_READ);
I2C_Ack();
dat_buf = I2C_receiveByte();
I2C_noAck();
I2C_Stop();
return dat_buf;
}
void DS1307_setTime(struct tm setValue)
{
DS1307_writeByte(ADDR_SEC,setValue.tm_sec);
DS1307_writeByte(ADDR_MIN,setValue.tm_min);
DS1307_writeByte(ADDR_HOUR,setValue.tm_hour);
DS1307_writeByte(ADDR_DAY,setValue.tm_wday);
DS1307_writeByte(ADDR_MONTH,setValue.tm_mon);
DS1307_writeByte(ADDR_YEAR,setValue.tm_year);
}
void DS1307_setEnableStatus(uchar setValue)
{
uchar buf = 0;
buf = DS1307_readByte(ADDR_SEC);
if(setValue == DS1307_ENABLE)
{
buf = buf&DS1307_ENABLE;
DS1307_writeByte(ADDR_SEC,buf);
}
else if(setValue == DS1307_DISABLE)
{
buf = buf|DS1307_DISABLE;
DS1307_writeByte(ADDR_SEC,buf);
}
else
buf = 0;
}
void DS1307_setHourMode(uchar setValue)
{
uchar buf = 0;
buf = DS
評論
查看更多