本帖最后由 shumivan 于 2021-4-30 13:37 编辑
RX8010SJ.c的关键代码如下:
CLK_Time calendar;
/**************时钟芯片初始化************/
void RX8010_Init(void)
{
CLK_IIC_Init();
}
/**************向时钟写入时间************/
void RX8010_Write_Time(CLK_Time SetRtc)
{
u8 buf[7];
buf[0] = SetRtc.second;
RX8010_Write_Bytes(0x10,buf,1);
buf[0] = SetRtc.minute;
RX8010_Write_Bytes(0x11,buf,1);
buf[0] = SetRtc.hour;
RX8010_Write_Bytes(0x12,buf,1);
buf[0] = RX8010_Week_Translate(WriteWeek ,CLK_Get_Week(2000 + BCD_To_Dec(SetRtc.year) ,BCD_To_Dec(SetRtc.month) ,BCD_To_Dec(SetRtc.day)));
printf("W:%d\r\n",RX8010_Week_Translate(WriteWeek ,CLK_Get_Week(2000 + BCD_To_Dec(SetRtc.year) ,BCD_To_Dec(SetRtc.month) ,BCD_To_Dec(SetRtc.day))));
RX8010_Write_Bytes(0x13,buf,1);
buf[0] = SetRtc.day;
RX8010_Write_Bytes(0x14,buf,1);
buf[0] = SetRtc.month;
RX8010_Write_Bytes(0x15,buf,1);
buf[0] = SetRtc.year;
RX8010_Write_Bytes(0x16,buf,1);
buf[0] = 0x00;
RX8010_Write_Bytes(0x1F,buf,1);
}
/**************从时钟读出时间************/
void RX8010_Read_Time (CLK_Time *GetRtc)
{
u8 i;
u8 buf[7];
RX8010_Read_Bytes(0x10,buf,7);//读出温度值(器件地址,子地址,数据储存器,字节数)
GetRtc->second = buf[0]&0x7f; //秒,低七位有效
GetRtc->minute = buf[1]&0x7f; //分,低七位有效
GetRtc->hour = buf[2]&0x3f; //时,低六位有效
GetRtc->week = RX8010_Week_Translate(ReadWeek,buf[3]&0x7f); //周,低七位有效
GetRtc->day = buf[4]&0x3f; //日,低六位有效
GetRtc->month = buf[5]&0x1f; //月,低五位有效
GetRtc->year = buf[6]&0xff; //年,低八位有效
}
/**************向RAM指定地址写入数据************/
//slv_addr 器件地址
//sub_addr 内部寄存器地址
void RX8010_Read_Bytes(unsigned int sub_addr,unsigned char *s,unsigned char no)
{
u8 i;
CLK_IIC_Start(); //*发送启动信号*/
if(CLK_IIC_Send_Byte(RX8010_WRITE) == 1)//*发送SLA+W*///0x64
{
CLK_IIC_Stop();
return;
}
if(CLK_IIC_Send_Byte(sub_addr) == 1)//*发送SLA+W*///0x64
{
CLK_IIC_Stop();
return;
}
CLK_IIC_Start();
if(CLK_IIC_Send_Byte(RX8010_READ) == 1)
{
CLK_IIC_Stop();
return;
}
for(i=0;i<no-1;i++)
{
*(s + i) = CLK_IIC_Read_Byte(1);
}
*(s + no-1) = CLK_IIC_Read_Byte(0);
CLK_IIC_Stop();
}
/**************从RAM指定地址读出数据************/
//slv_addr 器件地址
//sub_addr 内部寄存器地址
void RX8010_Write_Bytes(unsigned int sub_addr,unsigned char *s,unsigned char no)
{
u8 i;
CLK_IIC_Start();
if(CLK_IIC_Send_Byte(RX8010_WRITE) == 1)
{
CLK_IIC_Stop();
return;
}
if(CLK_IIC_Send_Byte(sub_addr) == 1)
{
CLK_IIC_Stop();
return;
}
for(i=0;i<no;i++)
{
if(CLK_IIC_Send_Byte(*(s + i)) == 1)
{
CLK_IIC_Stop();
return;
}
*s=CLK_IIC_Read_Byte(1);
s++;
}
}
/**************获得现在是星期几************/
//设置时钟
//把输入的时钟转换为秒钟
//以1970年1月1日为基准
//1970~2099年为合法年份
//返回值:0,成功;其他:错误代码.
//月份数据表
u8 const Table_Week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表
//获得现在是星期几
//功能描述:输入公历日期得到星期(只允许1901-2099年)
//输入参数:公历年月日
//返回值:星期号
u8 CLK_Get_Week(u16 year,u8 month,u8 day)
{
u16 temp2;
u8 yearH,yearL;
yearH=year/100; yearL=year%100;
// 如果为21世纪,年份数加100
if (yearH>19)yearL+=100;
// 所过闰年数只算1900年之后的
temp2=yearL+yearL/4;
temp2=temp2%7;
temp2=temp2+day+Table_Week[month-1];
if (yearL%4==0&&month<3)temp2--;
return(temp2%7);
}
RX8010SJ.h的关键代码如下:
#define RX8010_READ 0x65
#define RX8010_WRITE 0x64
// register address , for RX-8010SJ
#define RX8010_ADDR_SECOND ( 0x10 )
#define RX8010_ADDR_MINUTE ( 0x11 )
#define RX8010_ADDR_HOUR ( 0x12 )
#define RX8010_ADDR_WEEK ( 0x13 )
#define RX8010_ADDR_DATE ( 0x14 )
#define RX8010_ADDR_MONTH ( 0x15 )
#define RX8010_ADDR_YEAR ( 0x16 )
#define RX8010_ADDR_RSV17 ( 0x17 )
#define RX8010_ADDR_ALM_MINUTE ( 0x18 )
#define RX8010_ADDR_ALM_HOUR ( 0x19 )
#define RX8010_ADDR_ALM_WEEK ( 0x1A )
#define RX8010_ADDR_ALM_DATE ( 0x1A )
#define RX8010_ADDR_TMR_CNT0 ( 0x1B )
#define RX8010_ADDR_TMR_CNT1 ( 0x1C )
#define RX8010_ADDR_EXT_REG ( 0x1D )
#define RX8010_ADDR_FLAG_REG ( 0x1E )
#define RX8010_ADDR_CTRL_REG ( 0x1F )
|