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

📄 pcf8563.c

📁 完整的项目示例
💻 C
字号:
/*******************************************************

//   I2C总线驱动程序+PCF8563驱动-------PCF8563-Drivers.c

//定义F0为非应答标志位

/*******************************************************
电路连接:
   SDA --> P3.5
   SCL --> P3.4
   ACK --> P3.7
*******************************************************/
//注:当收不到ACK应答时,P3.7为低电平,D4亮

/********************************************************/

#include "compile.h"
#include <W77C32.h>
#include <intrins.h>

#define DELAY5US  _nop_();_nop_();_nop_();_nop_();_nop_();

sbit sda = P1^0;
sbit scl = P1^1;
sbit ACKt = P3^7;

static void I2C_Str( void );
static void I2C_Stop( void );
static void MAck( void );
static void CAck( void );
static void I2C_WrC( uchar dd );
static uchar I2C_RdC( void );

/********************************************************
* 名称:起始位函数
* 形参:无
********************************************************/
void I2C_Str( void )
{
 sda = 1;
 scl = 1; //启动I2C总线
 DELAY5US
 sda = 0; //拉下SDA
 DELAY5US  //I2C总线要求起止建立时间>4us
 scl = 0; //拉下SCL
}

/********************************************************
* 名称:停止位函数
* 形参:无
********************************************************/
void I2C_Stop( void )
{
 sda = 0; //停止I2C总线传送
 scl = 1; //释放SCL
 DELAY5US
 sda = 1; //释放SDA
}

/********************************************************
* 名称:ACK信号发送函数
* 形参:无
* 备注:F0的值会影响发出的应答信号
********************************************************/
void MAck( void ) //发出ACK信号
{
 sda = F0; //由F0决定给应答标志或非应答标志
 scl = 1;
 scl = 0;
 sda = 0;
}

/********************************************************
* 名称:ACK信号检测函数
* 形参:无
* 备注:调用此函数后,影响F0
********************************************************/
void CAck( void ) //检测ACK信号
{
 sda = 1; //释放数据总线
 scl = 1;
 F0 = sda; //将ACK信号存入F0标志位中
 scl = 0;
 sda = 0;
 if( F0 ) ACKt = 0;
}

/********************************************************
* 功能:向总线上写一个字节,并检测ACK
* 形参:所写的内容
********************************************************/
void I2C_WrC( uchar dd )
{
 uchar temp,n=8;
 temp = dd;
 while( n-- )
 {
  if( (temp & 0x80) == 0x80 ) sda = 1;
  else sda = 0;
  scl = 1;
  scl = 0;
  temp = temp << 1;
 }
 CAck();
}

/********************************************************
* 功能:从总线上读取一个字节,同时给出ACK
* 形参:无
* 返回值:读到的字节
********************************************************/
uchar I2C_RdC( void )
{
 uchar temp,n=8;
 sda=1;
 while( n-- )
 {
  temp = temp << 1;
  scl = 1;
  if( sda ) temp = temp | 0x01;
  scl = 0;
 }
 MAck();
 return(temp);
}

/********************************************************
* 功能:从总线上读取若干字节
* 形参:字节地址,数据指针,字节个数
* 返回值:读到的数据由指针返回
********************************************************/
void Rd_time( uchar *p )
{
 uchar n=7;
 I2C_Str();
 I2C_WrC( 0xa2 );
 I2C_WrC( 0x02 );
 I2C_Str(); //重启动
 I2C_WrC( 0xa3 );
 while( n-- )
 {
  if( n ) F0 = 0; //传送完一个字节,发出一个应答信号
  else F0 = 1; //当全部字节传送结束,给出非应答信号
  *p = I2C_RdC();
  p++;
 }
 I2C_Stop();
}

/********************************************************
* 功能:从总线上写字
* 形参:字节地址,数据指针,字节个数
* 返回值:读到的数据由指针返回
********************************************************/

void I2C_WrS(uchar dz,uchar dd)
{
 I2C_Str();
 I2C_WrC( 0xa2 );
 I2C_WrC( dz );
 I2C_WrC( dd );
 I2C_Stop();
}

/********************************************************
* 功能:从总线上写入若干字节
* 形参:字节地址,数据指针,字节个数
* 返回值:读到的数据由指针返回
********************************************************/

void PCF8563_Up(uchar * buf)
{
  uchar i;
  I2C_Str();
  I2C_WrC( 0xa2 );
  for(i=0;i<9;i++)
   {
    I2C_WrC(buf[i]);
   }
}


⌨️ 快捷键说明

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