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

📄 r_w_pcf8563.c

📁 PCF8563驱动程序
💻 C
字号:
/**--------------------
 〖说明〗I2C总线驱动程序(用两个普通IO模拟I2C总线)
 包括100Khz(T=10us)的标准模式(慢速模式)选择,
 和400Khz(T=2.5us)的快速模式选择,
 默认11.0592Mhz的晶振。

 ---------------------*/
 #include <reg52.h>
 #include<INTRINS.H>

 sbit SDA = P2^6;
 sbit SCL = P2^7;

 #define Uchar unsigned char
 #define uint unsigned int
 #define Byte unsigned char
 #define Word unsigned int
 #define bool bit
 #define true 1
 #define false 0
 
 extern Uchar SystemError;

#define SomeNOP(); _nop_();_nop_();_nop_();_nop_();

/*----------I2C相关函数列表---------*/
void I2CStart(void);	/*发送I2C起始信号*/
void I2CStop(void);	/*发送I2C终止信号*/
bool WaitAck(void);	/*I2C等待回应*/
void SendAck(void); /*I2C发送回应*/
void SendNotAck(void); /*I2C不发送回应*/
void I2CSendByte(Byte ch); /*I2C发送一个字节*/
Byte I2CReceiveByte(void); /*I2C接收一个字节*/
/*-------PCF8563T驱动程序列表----------*/
void GetPCF8563(Uchar firsttype,Uchar count,Uchar *buff);  /*从PCF8563读取*/
void SetPCF8563(Uchar timetype,Uchar value);  /*对PCF8563写入数据*/
void SetAlarm(Uchar alarmtype,Uchar count);  /*对PCF8563设置闹铃*/ 
void CleanAlarm(void);  /*对PCF8563清除闹铃*/ 

//---------------------------------------------------------------------
//开始PCF8563T驱动程序
/**--------------------------------------------------------------------------------
调用方式:void GetPCF8563(Uchar firsttype,Uchar count,Uchar *buff)
函数说明:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype,
并设置读取的字节数,则会一次把时间读取到buff中。顺序是:
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
---------------------------------------------------------------------------------*/
void GetPCF8563(Uchar firsttype,Uchar count,Uchar *buff)
{
 Uchar i;
 I2CStart();   /*I2C起始位*/
 I2CSendByte(0xA2);	/*发送PCF8563写地址*/
 WaitAck();	   /*等待应答*/
 I2CSendByte(firsttype);	/*发送第一个时间类型firsttype*/
 WaitAck();	   /*等待应答*/
 I2CStart();   /*I2C起始位*/
 I2CSendByte(0xA3);	 /*发送PCF8563读地址*/
 WaitAck();	   /*等待应答*/

 for (i=0;i<count;i++)
  {
   buff[i]=I2CReceiveByte();
   if (i!=count-1) SendAck();/*除最后一个字节外,其他都要从MASTER发应答。*/
  }

 SendNotAck();
 I2CStop();
}


/**--------------------------------------------------------------------------------
调用方式:void SetPCF8563(Uchar timetype,Uchar value)
函数说明:调整时钟。timetype是要改的时间类型,value是新设置的时间值(BCD格式)。
0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
 ---------------------------------------------------------------------------------*/
void SetPCF8563(Uchar timetype,Uchar value)
{
 I2CStart();
 I2CSendByte(0xA2);
 WaitAck();
 I2CSendByte(timetype);
 WaitAck();
 I2CSendByte(value);
 WaitAck();
 I2CStop();
}
/**--------------------------------------------------------------------------------
调用方式:void SetAlarmHour(Uchar count)
函数说明:设置报警闹钟在一天的第count点报警。例如:count=23,则在晚上11点报警。
---------------------------------------------------------------------------------*/
void SetAlarm(Uchar alarmtype,Uchar count)
{
 SetPCF8563(0x01,0x02);
 SetPCF8563(alarmtype,count);
}
/**--------------------------------------------------------------------------------
调用方式:void CleanAlarm(void) ﹫2001/08/0 7
函数说明:清除所有报警设置。
---------------------------------------------------------------------------------*/
void CleanAlarm(void)
{
 SetPCF8563(0x01,0x00);
 SetPCF8563(0x09,0x80);
 SetPCF8563(0x0A,0x80);
 SetPCF8563(0x0B,0x80);
 SetPCF8563(0x0C,0x80);
 // SetPCF8563(0x0D,0x00);
 // SetPCF8563(0x0E,0x03);
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/*********************I2C相关函数**********************/ 
/**--------------------------------------------------------------------------------
调用方式:void I2CStart(void)  函数说明:私有函数,I2C专用,I2C起始
---------------------------------------------------------------------*/
void I2CStart(void)
{
 EA=0;
 SDA=1; SCL=1; SomeNOP();//INI
 SDA=0; SomeNOP(); //START
 SCL=0;
 }

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

/**--------------------------------------------------------------------------------
调用方式:bit I2CAck(void)
函数说明:私有函数,I2C专用,等待从器件接收方的应答
---------------------------------------------------------------------------------*/
bool WaitAck(void)
{
 Uchar errtime=255; /*因故障接收方无ACK,超时值为255。*/
 SDA=1;SomeNOP();
 SCL=1;SomeNOP();
 while(SDA) 
  {
   errtime--; 
   if (!errtime)
     {
	  I2CStop();
	  SystemError=0x11;
      return false;
	 }
  }
 SCL=0;
 return true;
 }
/**--------------------------------------------------------------------------------
调用方式:void SendAck(void)
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
 SDA=0; SomeNOP();
 SCL=1; SomeNOP();
 SCL=0;
 }

/**--------------------------------------------------------------------------------
调用方式:void SendAck(void)
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
-------------------------------------------------------------------------------*/
void SendNotAck(void)
{
 SDA=1; SomeNOP();
 SCL=1; SomeNOP();
 SCL=0;
}
 /**--------------------------------------------------------------------------------
调用方式:void I2CSend(Uchar ch)
函数说明:私有函数,I2C专用,发送一个字节。
---------------------------------------------------------------------------------*/
void I2CSendByte(Byte ch)
{
 Uchar i=8;
 while (i--)
  {
   SCL=0; _nop_();
   SDA=(bit)(ch&0x80);
   ch<<=1; SomeNOP();
   SCL=1; SomeNOP();
  }
 SCL=0;
}

/**----------------------------------------------------------------
调用方式:Uchar I2CReceive(void) ﹫2001/07/0 5
函数说明:私有函数,I2C专用,接收一个字节
---------------------------------------------------------------------------------*/
Byte I2CReceiveByte(void)
{
  Uchar i=8;
  Byte ddata=0;
  SDA=1;
  while (i--)
   {
    ddata<<=1;
    SCL=0;SomeNOP();
    SCL=1;SomeNOP();
    ddata|=SDA;
   }
  SCL=0;
  return ddata;
}

⌨️ 快捷键说明

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