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

📄 pcf8563.c

📁 时钟芯片PCF8563 C51程序
💻 C
字号:
/*
*  文件名 : PCF8563.C
*  作  者 : li.yao
*  日  期 : 2005年 02月 28日,星期一 
*  描  述 : PCF8563实时时钟芯片的驱动程序。
*/

#include "I2C.H"

/*配置参数*/

#define  WADDR    0xA2
#define  RADDR    0xA3
#define  BYEAR    0x1900

/*
*  函数名 : unsigned char GetPCF8563(unsigned char addr);
*  参数表 : addr: 要读的数据地址。
*  返回值 : 读取的数据字节。
*  功  能 : 读取指定地址的数据内容。
*/

unsigned char    GetPCF8563(unsigned char addr)
{
    unsigned char    ch;
    I2cStart();
    I2cSend(WADDR);
    WaitAck();
    I2cSend(addr);
    WaitAck();
    
    I2cStart();
    I2cSend(RADDR);
    WaitAck();
    ch = I2cRead();
    SendNotAck();
    I2cStop();

    return  ch;
}

/*
*  函数名 : void SetPCF8563(unsigned char addr, unsigned char ch);
*  参数表 : addr: 要写的数据地址。ch: 写入的数据字节。
*  返回值 : none
*  功  能 : 写入指定地址的数据内容。
*/

void    SetPCF8563(unsigned char addr, unsigned char ch)
{
    I2cStart();
    I2cSend(WADDR);
    WaitAck();
    I2cSend(addr);
    WaitAck();
    I2cSend(ch);
    WaitAck();
    I2cStop();
}

/*
*  函数名 : unsigned char SetClock(TIME *time);
*  参数表 : time: 设置时间的数据指针。
*           sec, min, hour, day, week, month, year.
*  返回值 : 是否超时错误。
*  功  能 : 设置时间和日期。
*/

unsigned char    SetClock(TIME *time)
{
    unsigned char    i = 0;
    unsigned char    err;
    
          time->year  -= BYEAR;
          if (time->year < 0x100)
              time->month |= 0x80;
          else
              time->month &= 0x7F;

    I2cStart();
    I2cSend(WADDR);
    err = WaitAck();
    I2cSend(0x02);
    err = WaitAck();    
    while (i < 7)
    {
        I2cSend(((unsigned char *)time)[i++]);
        err = WaitAck(); 
    }
    I2cStop();    

    return  err;              
}

/*
*  函数名 : unsigned char GetClock(TIME *time);
*  参数表 : time: 读取时间的数据指针。
*           sec, min, hour, day, week, month, year.
*  返回值 : 是否超时错误。
*  功  能 : 读取时间和日期。
*/

unsigned char    GetClock(TIME *time)
{
    unsigned char    i = 0;
    unsigned char    err;
    
    I2cStart();
    I2cSend(WADDR);
    err = WaitAck();
    I2cSend(0x02);
    err = WaitAck();
    
    I2cStart();
    I2cSend(RADDR);
    err = WaitAck();
    while (1)
    {
        ((unsigned char *)time)[i++] = I2cRead();
        if (i < 7)
        { 
            SendAck();
        } else {
            SendNotAck();
            break;
        }
    }
    I2cStop();
    
    if (time->month & 0x80)
        ((unsigned char *)time)[i] = 0x19;
    else
        ((unsigned char *)time)[i] = 0x20;
    time->month &= 0x7F;
    
    return  err;        
}

//  文件结束

⌨️ 快捷键说明

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