//-------- S3530A STATUS REG -----------
#define S3530_REG_INT2FE_BIT 0x01 //INT2 level interrupt set
#define S3530_REG_INT1FE_BIT 0x02 //INT1 level interrupt set
#define S3530_REG_INT2ME_BIT 0x04 //INT2 edge interrupt
#define S3530_REG_INT1ME_BIT 0x08 //INT2 edge interrupt
#define S3530_REG_INT2AE_BIT 0x10 //INT2 interrupt output enable(1), disabled(0).
#define S3530_REG_INT1AE_BIT 0x20 //INT1 interrupt output enable(1), disabled(0).
#define S3530_REG_1224_BIT 0x40 //12(0), 24(1) time mode set
#define S3530_REG_POWER_BIT 0x80 //Power Status, Normal(1), Fail(0)
typedef struct{
_uchar your;
_uchar mon;
_uchar day;
_uchar day_week;
_uchar time;
_uchar min;
_uchar sec;
_uchar reg;
}_rtc;
xdata _rtc rtc_temp; //data를 읽은 원본,data를 저장할때 쓰는 버퍼
xdata _rtc rtc;
void rtc_time_read()
{
i2c_start();
i2c_write(0x65); //access 1 mode
rtc_temp.your = i2c_read(YES);
rtc_temp.mon = i2c_read(YES);
rtc_temp.day = i2c_read(YES);
rtc_temp.day_week = i2c_read(YES);
rtc_temp.time = i2c_read(YES);
rtc_temp.min = i2c_read(YES);
rtc_temp.sec = i2c_read(NO);
i2c_stop();
//data 가공
rtc_temp.your = by_byte(rtc_temp.your);
rtc_temp.mon = by_byte(rtc_temp.mon);
rtc_temp.day = by_byte(rtc_temp.day);
rtc_temp.day_week = by_byte(rtc_temp.day_week);
rtc_temp.time = by_byte(rtc_temp.time);
if(rtc_temp.time & 0x80) //상위 bit 1이면 12시간 제의 오후
{
rtc_temp.time = rtc_temp.time & 0x7F;
//rtc_temp.time = rtc_temp.time + 11; //24시간 형태로 변경
}
rtc_temp.min = by_byte(rtc_temp.min); //Control register
rtc_temp.sec = by_byte(rtc_temp.sec) & 0x7F; //Control register
//data 버퍼에 복사
rtc.your= rtc_temp.your;
rtc.mon= rtc_temp.mon;
rtc.day= rtc_temp.day;
// //p_sts.rtc_time[3] = rtc.day_week = rtc_temp.day_week;
rtc.time = rtc_temp.time;
rtc.min = rtc_temp.min; //Control register
rtc.sec = rtc_temp.sec; //Control register
}
/*
* 레지스터 내용
* bit 7 : 1(전원 들어옴) ,read only
* bit 6 : 0(12시간제) , 1(24시간제)
* bit 5 : /INT1 동작, 0(동작안함), 1(동작함)
* bit 4 : /INT2 동작, 0(동작안함), 1(동작함)
* bit 3 : 인터럽트 동작 설정 찾아서 해보길
* bit 2 :
* bit 1 :
* bit 0 :
*/
void rtc_reg_read()
{
i2c_start();
i2c_write(0x65); //access 1 mode
_nop_ ();
rtc_temp.reg = i2c_read(NO);
_nop_ ();
i2c_stop();
rtc.reg = by_byte(rtc_temp.reg); //Control register
}
//RTC 데이터 쓰기.....
void rtc_time_write()
{
rtc_temp.your = by_byte(rtc_temp.your);
rtc_temp.mon = by_byte(rtc_temp.mon);
rtc_temp.day = by_byte(rtc_temp.day);
//rtc_temp.day_week = by_byte(rtc_temp.day_week);
rtc_temp.time = by_byte(rtc_temp.time);
rtc_temp.min = by_byte(rtc_temp.min);
rtc_temp.sec = by_byte(rtc_temp.sec);
i2c_start();
i2c_write(0x64); //access 1 mode
_nop_ ();
_nop_ ();
i2c_write(rtc_temp.your);
_nop_ ();
_nop_ ();
i2c_write(rtc_temp.mon);
_nop_ ();
_nop_ ();
i2c_write(rtc_temp.day);
_nop_ ();
_nop_ ();
i2c_write(rtc_temp.day_week); //주의 어떻게 될지 모름
_nop_ ();
_nop_ ();
i2c_write(rtc_temp.time);
_nop_ ();
_nop_ ();
i2c_write(rtc_temp.min);
_nop_ ();
_nop_ ();
i2c_write(rtc_temp.sec);
_nop_ ();
_nop_ ();
i2c_stop();
}
// RTC초기화 부분.. 상태register 에 쓰는부분....
void rtc_reg_write()
{
rtc_temp.reg = by_byte(rtc_temp.reg);
i2c_start();
i2c_write(0x62); //access 1 mode
_nop_ ();
_nop_ ();
i2c_write(rtc_temp.reg);
_nop_ ();
_nop_ ();
i2c_stop();
}
void rtc_init()
{
rtc_temp.reg = S3530_REG_1224_BIT; //rtc초기화
rtc_reg_write();
}
//상위비트와 하위 비트를 바꾸어 준다.
unsigned char by_byte(unsigned char in_data)
{
unsigned char i,temp_data, out_data = 0;
bit k;
for(i=0 ; i<8 ;i++)
{
k = ((in_data & 0x80) ? 1 : 0); //msb data
in_data <<= 1; // Shift the byte by one bit
temp_data = 0;
temp_data |= k; //lsb data
temp_data <<= i;
out_data |= temp_data;
}
return out_data;
} |