找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3506|回复: 0
收起左侧

RX8010SJ驱动的关键代码,自己编写资源,与君共享

[复制链接]
ID:81196 发表于 2021-4-30 11:51 | 显示全部楼层 |阅读模式
本帖最后由 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 )





评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表