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

📄 pcf8563.c

📁 philip RTC 芯片的驱动程序 8563
💻 C
字号:
#include	<reg52.h>
#include 	<intrins.h>
#include  	"globedef.h"
#include 	"pcf8563.h"
#include	"delay.h"

/**--------------------------------------------------------------------------------
 调用方式:void I2CStart(void) ﹫2001/07/0 4
 函数说明:私有函数,I2C专用
 ---------------------------------------------------------------------------------*/
 void pcf8563_start(void)
 {
 //	EA=0;
 	pcf8563_scl=1; 
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	pcf8563_sda=1; 	
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	pcf8563_sda=0; 
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	pcf8563_scl=0; 
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 }

/**--------------------------------------------------------------------------------
 调用方式:void I2CStop(void) ﹫2001/07/0 4
 函数说明:私有函数,I2C专用
 ---------------------------------------------------------------------------------*/
void pcf8563_stop(void)
{
	pcf8563_scl=1; 
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	pcf8563_sda=0; 
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	pcf8563_sda=1; 
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	pcf8563_scl=0; 
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 //	EA=1;
 }

/**--------------------------------------------------------------------------------
 调用方式:bit I2CAck(void) ﹫2001/07/0 4
 函数说明:私有函数,I2C专用,等待从器件接收方的应答
 ---------------------------------------------------------------------------------*/
void WaitAck(void)
{
//	unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
//	pcf8563_sda = 1;	//写1准备读
//	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	pcf8563_scl = 1;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
//	while(pcf8563_sda) 
//	{
//		errtime--; 
//		if (!errtime) 
//		{
//			pcf8563_stop();
//		//	pcf8563Error=0xaa;			
//		}
//	}
	pcf8563_scl=0;	
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}

/**--------------------------------------------------------------------------------
 调用方式:void SendAck(void) ﹫2001/07/0 4
 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
 ---------------------------------------------------------------------------------*/
void SendAck(void)
{
	pcf8563_sda = 0; _nop_();_nop_();_nop_();// send ack
	//第9位clk
	pcf8563_scl = 1;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();	
	pcf8563_scl = 0;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

}

/**--------------------------------------------------------------------------------
 调用方式:void I2CSend(uchar ch) ﹫2001/07/0 5
 函数说明:私有函数,I2C专用
 ---------------------------------------------------------------------------------*/
void pcf8563_sendbyte(unsigned char ch)
{
	unsigned char i = 8;
	while (i--)
	{
		pcf8563_scl=0;
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		pcf8563_sda=(bit)((ch&0x80) >> 7); 
		ch<<=1; 
		_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		pcf8563_scl=1; 
		_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	}
	pcf8563_scl=0;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

	WaitAck();
}

/**--------------------------------------------------------------------------------
 调用方式:uchar I2CReceive(void) ﹫2001/07/0 5
 函数说明:私有函数,I2C专用
 ---------------------------------------------------------------------------------*/
unsigned char pcf8563_receivebyte(void)
{
	unsigned char i=8;
	unsigned char ddata=0;

	pcf8563_sda = 1;	//写1为读做准备

	while (i--)
	{	
		ddata <<= 1;
		pcf8563_scl = 0;
		_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		pcf8563_scl = 1;
		_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		ddata |= (unsigned char)pcf8563_sda;				
	}
	pcf8563_scl = 0;
	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	SendAck();
	return ddata;
}

/**--------------------------------------------------------------------------------
调用方式:void GetPCF8563(uchar firsttype,uchar count,uchar *buff) ﹫2001/08/0 7
函数说明:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype,并设置读取
的字节数,则会一次把时间读取到buff中。顺序是:
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
---------------------------------------------------------------------------------*/
void set_pcf8563(unsigned char time_type,unsigned char time_value)
{	
	pcf8563_start();

	pcf8563_sendbyte(0xa2);				//器件地址,写	
	pcf8563_sendbyte(time_type);		//发送数据-时间类型
	pcf8563_sendbyte(time_value);       //发送设置时间值	
	pcf8563_stop();	
}

unsigned char get_pcf8563(unsigned char time_type)
{	
	unsigned char time_value;
	
	pcf8563_start();

	pcf8563_sendbyte(0xa2);		
	pcf8563_sendbyte(time_type);	

	pcf8563_start();
	pcf8563_sendbyte(0xa3);				//器件地址,读
	time_value = pcf8563_receivebyte();	
	
	pcf8563_stop();

	return time_value;
}

void init_pcf8563(void)
{
	pcf8563_start();
	pcf8563_sendbyte(0xa2);				//器件地址,写
	pcf8563_sendbyte(0x00);				//地址0为控制状态寄存器
	pcf8563_sendbyte(0x00);				//发送数据-普通模式,开启时钟	
	pcf8563_stop();
}

⌨️ 快捷键说明

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