⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1307.c

📁 ds1307 for avr (interrupt)
💻 C
字号:
#include "ds1307.h"


volatile uint8_t cur_datetime[7];
volatile uint8_t set_datetime[3];
volatile uint8_t i2c_status;


uint8_t dec2bcd (uint8_t dec)
{
	uint8_t i;
	uint8_t bcd=0;
	for(i=0;i<8;i++) {
		if ((bcd & 0x0F) >= 0x05) bcd += 0x03;
		if ((bcd & 0xFF) >= 0x50) bcd += 0x30;
		bcd <<= 1;
		if ((dec & 0x80)==0x80) bcd |= 0x01;
		dec <<= 1;
	}
	return bcd;
}


uint8_t bcd2dec (uint8_t bcd)
{
	return (bcd & 0xf) + ((bcd>>4) & 0xf)*10;
}


void ds1307_read_datetime()
{
	while(i2c_status & I2C_BUSY){};
	i2c_status = I2C_BUSY | I2C_READ;
	TWCR = I2C_SET_STARTI;
}


void ds1307_get_datetime(uint8_t* datetime)
{
	uint8_t i;
	cli();
	for(i=0; i<3; i++) {
		datetime[i]   = bcd2dec(cur_datetime[i]);
		datetime[i+3] = bcd2dec(cur_datetime[i+4]);
	}
	sei();
}


void ds1307_set_date(uint8_t* date)
{
	set_datetime[0] = dec2bcd(date[0]);
	set_datetime[1] = dec2bcd(date[1]);
	set_datetime[2] = dec2bcd(date[2]);
	while(i2c_status & I2C_BUSY){};
	i2c_status = I2C_BUSY | I2C_WRITE | DS1307_DATE;
	TWCR = I2C_SET_STARTI;
}


void ds1307_set_time(uint8_t* time)
{
	set_datetime[2] = dec2bcd(time[0]);
	set_datetime[1] = dec2bcd(time[1]);
	set_datetime[0] = dec2bcd(time[2]);
	while(i2c_status & I2C_BUSY){};
	i2c_status = I2C_BUSY | I2C_WRITE;
	TWCR = I2C_SET_STARTI;
}


void ds1307_init()
{
	set_datetime[0] = 0;
	while(i2c_status & I2C_BUSY){};
	i2c_status = I2C_BUSY | I2C_SETUP;
	TWCR = I2C_SET_STARTI;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -