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

📄 ptf8563.c

📁 51开发板的源程序
💻 C
字号:

#include "c51base.h" 



static void SomeNOP()
{
	uchar idata i=3;
	while(i)
		i--;
}

/**--------------------------------------------------------------------------------
调用方式:void I2CStart(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用
--------------------------------------------------------------------------------*/
static void I2CStart(void)
{
    EA=0;
    SDA=1; SCL=1; SomeNOP();//INI
    SDA=0; SomeNOP(); //START
    SCL=0;
}

/**--------------------------------------------------------------------------------
调用方式:void I2CStop(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
static void I2CStop(void)
{
    SCL=0; SDA=0; SomeNOP(); //INI
    SCL=1; SomeNOP(); SDA=1; //STOP
    EA=1;
}

/**--------------------------------------------------------------------------------
53 调用方式:bit I2CAck(void) ﹫2001/07/0 4
54 函数说明:私有函数,I2C专用,等待从器件接收方的应答
55 ---------------------------------------------------------------------------------*/
static bit WaitAck(void)
{
    uchar idata errtime=255;//因故障接收方无ACK,超时值为255。
    SDA=1;SomeNOP();
    SCL=1;SomeNOP();
    while(SDA) 
    {
        errtime--; 
        if (!errtime) 
        {
            I2CStop();
            return false;
        }
    }
    SCL=0;
    return true;
}

/**--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
static void SendAck(void)
{
    SDA=0; SomeNOP();
    SCL=1; SomeNOP();
    SCL=0;
}

/**--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
-------------------------------------------------------------------------------*/
static void SendNotAck(void)
{
    SDA=1; SomeNOP();
    SCL=1; SomeNOP();
    SCL=0;
}

/**--------------------------------------------------------------------------------
调用方式:void I2CSend(uchar ch) ﹫2001/07/0 5
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
static void I2CSendByte(uchar ch)
{
    uchar idata i=8;
    while (i--)
    {
        SCL=0;
			;
        SDA=(bit)(ch&0x80); ch<<=1; SomeNOP();
        SCL=1; SomeNOP();
    }
    SCL=0;
}

/**--------------------------------------------------------------------------------
调用方式:uchar I2CReceive(void) ﹫2001/07/0 5
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
static uchar I2CReceiveByte(void)
{
    uchar idata i=8;
    uchar idata ddata=0;
    SDA=1;
    while (i--)
    {
        ddata<<=1;
        SCL=0;SomeNOP();
        SCL=1;SomeNOP();
        ddata|=SDA;
    }
    SCL=0;
    return ddata;
}

//---------------------------------------------------------------------------
//开始PCF8563T驱动程序
/**--------------------------------------------------------------------------------
调用方式:void GetPCF8563(uchar firsttype,uchar count,uchar *buff) ﹫2001/08/0 7
函数说明:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype,并设置读取
的字节数,则会一次把时间读取到buff中。顺序是:
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
---------------------------------------------------------------------------------*/
static void GetPCF8563(uchar firsttype,uchar count,uchar *buff)
{
    uchar idata i;
    I2CStart();
    I2CSendByte(0xA2);
    WaitAck();
    I2CSendByte(firsttype);
    WaitAck();
    I2CStart();
    I2CSendByte(0xA3);
    WaitAck();
 
    for (i=0;i<count;i++)
    {
        buff[i]=I2CReceiveByte();
        if (i!=count-1) 
            SendAck();//除最后一个字节外,其他都要从MASTER发应答。
    }
    
    SendNotAck();
    I2CStop();
}

/**--------------------------------------------------------------------------------
调用方式:void SetPCF8563(uchar timetype,uchar value) ﹫2001/08/0 7
函数说明:调整时钟。timetype是要改的时间类型,value是新设置的时间值(BCD格式)。
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
---------------------------------------------------------------------------------*/
static void SetPCF8563(uchar firsttype,uchar count,uchar *buff)
{
	uchar idata i;
    I2CStart();
    I2CSendByte(0xA2);
    WaitAck();
    I2CSendByte(firsttype);
    WaitAck();
	for (i=0;i<count;i++)
    {
        I2CSendByte(buff[i]);
        if (i!=count-1) 
            SendAck();//除最后一个字节外,其他都要从MASTER发应答。
    }  
    WaitAck();
    I2CStop();
}


/*******************************************
时间格式转换:
	由于pcf8563取出来的时间是BCD码,
因此为了在程序中操作方便,把时间转换成HEX格式。
	同时为了在设置时间时以BCD码写入pcf8563,所
以还需要HEX转换成BCD码再写入pcf8563。
*******************************************/
void GetTime(uchar len,uchar *temp)
{
	uchar idata time[7];
	uchar idata i; 
	uchar idata temp_value;
	GetPCF8563(0x02,7,temp);
	temp[0] &= 0x7f;
	temp[1] &= 0x7f;
	temp[2] &= 0x3f;
	temp[3] &= 0x3f;
	temp[4] &= 0x07;
	temp[5] &= 0x1f;
	for(i=0;i<len;i++)
	{
		temp_value = temp[i]>>4;
		time[i] = (temp_value*10)+(temp[i]&0x0f);
	}
	temp[0] = time[6];
	temp[1] = time[5];
	temp[2] = time[3];
	temp[3] = time[4];
	temp[4] = time[2];
	temp[5] = time[1];
	temp[6] = time[0];
}


void SetTime(uchar len,uchar *time)
{
	uchar idata temp[7];
	uchar idata i;
	uchar idata temp_value;
	temp[6] = time[0];
	temp[5] = time[1];
	temp[3] = time[2];
	temp[4] = time[3];
	temp[2] = time[4];
	temp[1] = time[5];
	temp[0] = time[6];
	for(i=0;i<len;i++)
	{
		temp_value = (temp[i]%100)/10;
		time[i] = (temp_value*16)+temp[i]%10;
	}
	SetPCF8563(0x02,7,time);
}

⌨️ 快捷键说明

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