각 함수에 대한 설명은 스크롤을 아래로 내리시면 볼수있습니다.


 void I2C_start(void)

{

I2C_DIR=SDIROUT;

sda(1);

scl(1);I2C_delay();

sda(0);I2C_delay();

}

 

 

void I2C_stop(void)

{

I2C_DIR=SDIROUT;

scl(1);I2C_delay();

sda(0);I2C_delay();

sda(0);I2C_delay();

sda(1);I2C_delay();

}

 

void init_ds1307(void){

I2C_start();

I2C_write(ADDRTC);

I2C_write(0x00);

I2C_write(0x00);

I2C_stop();

I2C_start();

I2C_write(ADDRTC);

I2C_write(0x00);

I2C_write(sec);

I2C_write(min);

I2C_write(hr);

I2C_write(dy);

I2C_write(dt);

I2C_write(mn);

I2C_write(yr);

I2C_write(0x10); // sqwe:enable 1Hz output

I2C_stop();

}

 

 

 

 

 

 

void writebyte(unsigned char addr, unsigned char data)

{

I2C_start();

I2C_write(ADDRTC);

 

I2C_DIR=SDIROUT;

I2C_write(addr);

I2C_write(data);

I2C_stop();

}

 

 

unsigned char readbyte(unsigned char addr)

{

unsigned char byte;

I2C_start();

I2C_write(ADDRTC);

I2C_write(addr);

I2C_start();

I2C_write(ADDRTC|1);

byte = I2C_read(NACK);

I2C_stop();

return byte;

}

 

unsigned char I2C_read(unsigned char b)

{

unsigned char data, i;

sda(1);I2C_delay();I2C_delay();I2C_delay();

scl(0);I2C_delay();I2C_delay();

for(i=1;i<=8;i++)

{

scl(1);I2C_delay();

I2C_DIR=SDIRIN;

data=data<<1;

data = data | ((I2C_IN>>1)&0x01);

I2C_DIR=SDIROUT;

scl(0);I2C_delay();

}

sda(b);I2C_delay();

scl(0);I2C_delay();

scl(1);I2C_delay();

if(b==NACK)

sda(1);I2C_delay();

scl(0);I2C_delay();

sda(1);I2C_delay();

return data;

}

 

 

 

void I2C_write(unsigned char data)

{

unsigned char i;

I2C_DIR=SDIROUT;

scl(0);I2C_delay();

for(i=1;i<=8;i++)

{

sda(data>>7);I2C_delay();

scl(1);I2C_delay();

data=data<<1;

scl(0);I2C_delay();

}

 

sda(0);I2C_delay();

scl(0);I2C_delay();

scl(1);I2C_delay();

scl(0);I2C_delay();

sda(1);I2C_delay();

}

 

 

void main(void)

{

unsigned char i;

init_devices();

init_ds1307();

writebyte(0x00,0x00); // 00번지()0 값을 쓴다.

 

while(1)

{

Display();

FourDigit=readbyte(0); // 초값을 읽어온다.

}

}

 

 

 

 

------------------함수의 설명-------------------

I2C_start();

SDA 출력 방향을 AVR이 출력하는 것으로 함

SCL, SDA : High

SDA : Low로 떨굼

 

 

I2C_stop();

SDA 출력 방향을 AVR이 출력하는 것으로 함

SCLHigh

SDALow

SDAHigh

 

 

init_ds1307();

I2C_start(); 를 실행한다.

DS1307 칩을 초기화 한다.

시간, , 초 등을 초기 값으로 초기화 한다.

동작 확인용 LED를 달기 위하여,

1Hz를 사용 가능하도록 설정한다.

 

 

void writebyte(unsigned char addr, unsigned char data);

writebyte(어드레스, 데이터)

설명 : 어드레스에 데이터를 쓴다.

SDA 출력을 AVR에서 출력하는 것으로 한다.

1.SCLLow로 떨군다.

2.최상위 비트부터 한 비트 쓴다.

3.SCLHigh로 올린다.

4.담 비트 준비

1,2,3,48번 반복한다.

Ack를 체크한다.(그냥 무시하고 지나가고 있다.)

 

 

nsigned char readbyte(unsigned char addr);

데이터 = readbyte(어드레스)

설명 : 어드레스에서 데이터를 읽는다.

SDA핀을 AVR에서 입력 받는 것으로 한다.

1. SCLHigh로 올린다.(I2C에서 데이터 수신 받을 때 안

정적인 쪽은 클럭이 High일 때이므로)

2. 최상위비트부터 한 비트 받는다.

3. SCLLow로 떨군다.

4. 담 비트 받을 준비한다.

1,2,3,48번 반복한다.

Ackn을 받는다.

 

unsigned char I2C_read(unsigned char b);

데이터 = I2C_read();

현재 번지에서 데이터를 읽어 온다.

ACK를 굳이 읽을 이유가 없어서, ACK는 강제로 1로 주고

있다.

 

void I2C_write(unsigned char data);

I2C_write

현재의 어드레스에 데이터를 쓴다.

ACK0을 실어준다.

 

 

+ Recent posts