📄 iic_soft.h
字号:
#ifndef IIC_SOFT_H
#define IIC_SOFT_H
#include "mdefine.h"
//I2C定义位
sbit SDA=P2^0; //模拟I2C数据传送位
sbit SCL=P2^1; //模拟I2C时钟控制位
bit bdata ack; //应答标志位
/********************************************
内部函数,I2C开始
********************************************/
void IIC_Delay_10us()
{
char i=10;
while(i--);
}
void IIC_Start()
{
EA=0;
IIC_Delay_10us();
SDA=1;
IIC_Delay_10us();
SCL=1;
IIC_Delay_10us();
SDA=0;
IIC_Delay_10us();
SCL=0;
IIC_Delay_10us();
}
/********************************************
内部函数,I2C结束
********************************************/
void IIC_Stop()
{
IIC_Delay_10us();
SDA=0;
IIC_Delay_10us();
SCL=0;
IIC_Delay_10us();
SCL=1;
IIC_Delay_10us();
SDA=1;
IIC_Delay_10us();
EA=1;
IIC_Delay_10us();
}
/********************************************
内部函数,输出ACK ,每个字节传输完成,输出ack=0,结束读书据,ack=1;
********************************************/
void IIC_WriteAck(bit ack)
{
SDA=ack;
IIC_Delay_10us();
SCL=1;
IIC_Delay_10us();
SCL=0;
}
/********************************************
内部函数,等待ACK
********************************************/
void IIC_WaitACK()
{
uchar errtime=200;
SDA=1;
IIC_Delay_10us();
SCL=1;
IIC_Delay_10us();
while(SDA)
{
errtime--;
if(!errtime)
IIC_Stop();
}
SCL=0;
IIC_Delay_10us();
}
/********************************************
内部函数.输出数据字节
入口:B=数据
********************************************/
void IIC_WriteByte(uchar wdata)
{
uchar i;
for(i=0;i<8;i++)
{
if((wdata<<i)&0x80) SDA=1;
else SDA=0;
SCL=1;
IIC_Delay_10us();
SCL=0;
}
IIC_Delay_10us();
SDA=1; //8位发送完后释放数据线,准备接收应答位
IIC_Delay_10us();
SCL=1;
IIC_Delay_10us();
if(SDA==1)ack=0;
else ack=1; //判断是否接收到应答信号
SCL=0;
IIC_Delay_10us();
}
/********************************************
内部函数.输入数据
出口:B
********************************************/
uchar IIC_ReadByte()
{
uchar i,bytedata;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
bytedata<<=1;
bytedata|=SDA;
SCL=0;
IIC_Delay_10us();
}
return(bytedata);
}
/********************************************
读取数据<-pcf8574
********************************************/
bit IIC_ReadByte_8574(uchar sla,uchar *c)
{
IIC_Start(); //启动总线
IIC_WriteByte(sla+1); //发送器件地址
if(ack==0)return(0);
*c=IIC_ReadByte(); //读取数据
IIC_WriteAck(1); //发送非就答位
IIC_Stop(); //结束总线
return(1);
}
/********************************************
输出数据->pcf8563
********************************************/
void IIC_WriteData(uchar com,uchar address,uchar mdata)
{
IIC_Start();
IIC_WriteByte(com); /*写命令*/
IIC_WriteByte(address); /*写地址*/
IIC_WriteByte(mdata); /*写数据*/
IIC_Stop();
}
/********************************************
输入数据<-pcf8563
********************************************/
uchar IIC_ReadData(uchar com,uchar address) /*单字节*/
{ uchar rdata;
IIC_Start();
IIC_WriteByte(com); /*写命令*/
IIC_WriteByte(address); /*写地址*/
IIC_Start();
IIC_WriteByte(com + 1); /*读命令*/
rdata=IIC_ReadByte();
IIC_WriteAck(1);
IIC_Stop();
return(rdata);
}
//读多字节 内容
void IIC_Read_Muti_Data(uchar com,uchar address,uchar count,uchar * buff) /*多字节*/
{
uchar i;
IIC_Start();
IIC_WriteByte(com); /*写命令*/
IIC_WriteByte(address); /*写地址*/
IIC_Start();
IIC_WriteByte(com + 1); /*读命令*/
for(i=0;i<count;i++)
{
buff[i]=IIC_ReadByte();
if(i<count-1) IIC_WriteAck(0);
}
IIC_WriteAck(1);
IIC_Stop();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -