📄 pcf8563.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 + -