📄 iic.c
字号:
#include <reg52.h> /*头文件的包含*/
#include <intrins.h>
/*********************************************/
#define uchar unsigned char /*宏定义*/
#define uint unsigned int
/*********************************************/
/* 常,变量定义区 */
/*端口位定义*/
sbit SDA=P1^7; /*模拟I2C数据传送位*/
sbit SCL=P1^6; /*模拟I2C时钟控制位*/
/*状态标志*/
bit ACK; /*应答标志位*/
/*********************************************/
void start_IIC(void); /*启动总线*/
void stop_IIC(void); /*关闭总线*/
void cack(void); /*检查应答位子程序*/
void mack(void); /*发送应答信号子程序*/
void mnack(void); /*发送非应答信号*/
void wrbyte(uint); /*发送字节子程序*/
void rdbyte(uint); /*读取字节子程序*//***************关闭总线*********************/
void stop_IIC()
{
zdata=0; /*p1.5=0,接ZLG7290的20脚SDA*/
_nop_();
clk=1; /*发送结束条件的时钟信号*p1.4=1,接ZLG7290的19脚SCL*/
_nop_(); /*结束总线时间大于4us*/
_nop_();
_nop_();
_nop_();
_nop_();
/////////////////////////
zdata=1; /*结束总线*p1.5=1,接ZLG7290的20脚SDA*/
_nop_(); /*保证一个终止信号和起始信号的空闲时间大于4.7us*/
_nop_();
_nop_();
_nop_();
_nop_();
}
/***************启动总线********************/
void start_IIC()
{
zdata=1; /*p1.5=1,接ZLG7290的20脚SDA*/
_nop_();
clk=1; /*p1.4=1,接ZLG7290的19脚SCL*/
_nop_(); /*起始条件建立时间大于4.7us*/
_nop_();
_nop_();
_nop_();
_nop_();
//////////////////////////////
zdata=0; /*p1.5=0,接ZLG7290的20脚SDA*/
_nop_(); /*起始条件锁定时大于4us*/
_nop_();
_nop_();
_nop_();
_nop_();
clk=0; /*钳住总线,准备发数据,p1.4=0,接ZLG7290的19脚SCL*/
_nop_();
}
/***************读取字节子程序*****************/
void rdbyte(x)
{
}
/****************发送字节子程序**********************/
void wrbyte(data1)
{
uint i;
ACC=data1;
for(i=8;i>0;i--)
{
ACC<<=1;
switch(CY)
{
case 0:zdata=0;_nop_();clk=1;_nop_();_nop_();_nop_();_nop_();_nop_();clk=0;break; /*发送0*/
case 1:zdata=1;_nop_();clk=1;_nop_();_nop_();_nop_();_nop_();_nop_();clk=0;break; /*发送1*/
default :break;
}
}
}
/***************发送非应答信号*******************/
void mnack()
{
zdata=1; /*p1.5=1,接ZLG7290的20脚SDA*/
_nop_();
_nop_();
clk=1; /*p1.4=1,接ZLG7290的19脚SCL*/
_nop_(); /*保持数据时间,即clk为高时间大于4.7us*/
_nop_();
_nop_();
_nop_();
_nop_();
/////////////////////////////
clk=0;
_nop_();
_nop_();
}
/**************发送应答信号子程序**************/
void mack()
{
zdata=0; /*p1.5=0,接ZLG7290的20脚SDA*/
_nop_();
_nop_();
clk=1; /*p1.4=1,接ZLG7290的19脚SCL*/
_nop_(); /*保持数据时间,即clk为高时间大于4.7us*/
_nop_();
_nop_();
_nop_();
_nop_();
/////////////////////////////
clk=0;
_nop_();
_nop_();
}
/*************检查应答位子程序******************/
void cack() /*ACK=1时表示有应答*/
{
zdata=1; /*p1.5=1,接ZLG7290的20脚SDA*/
_nop_();
_nop_();
clk=1; /*p1.4=1,接ZLG7290的19脚SCL*/
ACK=0;
_nop_();
_nop_();
if(zdata==0)
{
ACK=1; /*判断应答位*/
}
_nop_();
clk=0;
_nop_();
}
/*************向器件指定子地址写N字节数据*****************/
void iwrnbyte()
{
f_4=1;
f_5=1;
while(f_4==1||f_5==1)
{
f_4=0;
f_5=0;
start_IIC(); /*启动总线*/
wrbyte(SLA); /*发送器件从地址*/
cack(); /*检查应答位子程序*/
if(ACK==1)
{
wrbyte(SUBA);
cack();
while((NUMBYTE-->0)&&(f_5==0))
{
wrbyte(data_1[NUMBYTE]);
cack();/*检查应答位子程序*/
if(ACK==0)
{
f_5=1;
}
else
{
i++;
}
}
}
else
{
stop_IIC(); /*关闭总线*/
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -