📄 iic_pca8574.c
字号:
#include<reg51.h>
#include"Config.h"
#include"IOCfg.c"
#include"TimeDLY.h"
#include"IIC_PCA8574.h"
//IC起始信号:
void StartIIC(void)
{
IIC_SDA = 1;
nNop(20);
IIC_SCL = 1;
nNop(20);
IIC_SDA = 0;
nNop(20);
IIC_SCL = 0;
//nNop(50);
}
//IIC停止信号:
void StopIIC(void)
{
IIC_SDA = 0;
nNop(20);
IIC_SCL = 1;
nNop(20);
IIC_SDA = 1;
nNop(50);
}
//读取从机应答信号函数:
bit GetACK(void)
{
bit ack;
IIC_SDA = 1;
IIC_SCL = 1;
nNop(50);
ack = IIC_SDA;
IIC_SCL = 0;
nNop(50);
return(ack);
}
//向IIC总线发出应答信号函数:
void PutACK(bit ack)
{
IIC_SDA = ack;
IIC_SCL = 1;
nNop(50);
IIC_SCL = 0;
nNop(50);
}
//初始化IIC总线函数:
void InitIIC(void)
{
IIC_SCL = 1;
nNop(10);
IIC_SDA = 1;
nNop(50);
}
//功能向IIC总线写一字节数据函数:
void IIC_WriteByte(INT8U temp)
{
INT8U i;
for(i=0;i<8;i++)
{
IIC_SDA = (bit)(temp & 0x80);
temp = temp << 1;
nNop(20);
IIC_SCL = 1;
nNop(20);
IIC_SCL = 0;
//nNop(50);
}
}
//从IIC总线读一字节数据函数:
INT8U IIC_ReadByte(void)
{
INT8U i;
INT8U temp;
IIC_SDA = 1;
for(i=0;i<8;i++)
{
temp = temp << 1;
IIC_SCL = 1;
while(IIC_SDA) temp++;
IIC_SCL = 0;
nNop(20);
}
return(temp);
}
//向PCA8574写一字节数据函数:
bit PCA8574_PutOne(INT8U SlaveAddr,INT8U dat)
{
//确保从机地址最低位是0
SlaveAddr &= 0xfe;
//启动I2C总线
StartIIC();
//发送数据
IIC_WriteByte(dat);
if ( GetACK() )
{
StopIIC();
return 1;
}
//发送完毕,停止I2C总线,返回
StopIIC();
return 0;
}
//从PCA8574读一字节数据函数:
bit PCA8574_GetOne(INT8U SlaveAddr,INT8U dat)
{
while(IIC_INT!=0);
SlaveAddr |= 0x01;
//启动I2C总线
StartIIC();
//发送从机地址
IIC_WriteByte(SlaveAddr);
if ( GetACK() )
{
StopIIC();
return 1;
}
//接收数据
dat = IIC_ReadByte();
PutACK(1);
//接收完毕,停止I2C总线,返回
StopIIC();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -