|
发表于 2011-11-23 13:47:52
|
显示全部楼层
#include<reg52.h>
#include<delay.h>
#include<intrins.h>
#include"iic.h"
#include"delay.h"
#define _Nop() _nop_()
bit ack;
void start_I2c();
void stop_I2c();
void sendbyte(uchar c);
uchar rcvbyte();
void ack_I2c(bit a);
/*启动总线函数*/
void start_I2c()
{SDA=1;
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
_Nop();
_Nop();
}
/*结束总线函数*/
void stop_I2c()
{SDA=0;
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1;
_Nop();
_Nop();
_Nop();
_Nop();
}
/*字节数据传送函数*/
void sendbyte(uchar c)
{uchar bitcnt;
for (bitcnt=0;bitcnt<8;bitcnt++)
{if ((c<<bitcnt)&0x80)
SDA=1;
else SDA=0;
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1;
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if (SDA==1)
ack=0;
else
ack=1;
SCL=0;
_Nop();
_Nop();
}
/*字节数据接受函数*/
uchar rcvbyte()
{uchar retc;
uchar bitcnt;
retc=0;
SDA=1;
for (bitcnt=0;bitcnt<8;bitcnt++)
{_Nop();
SCL=0;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
retc=retc<<1;
if (SDA==1) retc=retc+1;
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return (retc);
}
/* 应答函数*/
void ack_I2c(bit a)
{if (a==0)
SDA=0;
else SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
_Nop();
_Nop();
}
/*写N个字节数据
入口地址参数:从地址sla,子地址suba,发送no字节数据是S指向的内容
出口参数:返回1,操作成功,否则有误*/
bit nsend (uchar sla,uchar suba,uchar *s,uchar no)
{ uchar i;
start_I2c();
sendbyte(sla);
if (ack==0)return(0);
sendbyte(suba);
if (ack==0)return(0);
for (i=0;i<no;i++)
{
sendbyte(*s);
if (ack==0)return(0);
s++;
}
stop_I2c();
return(1);
}
/*读N个字节数据
入口地址参数:从地址sla,子地址suba,读出的内容存放到S指向的内容单元
出口参数:返回1,操作成功,否则有误*/
bit nread(uchar sla,uchar suba,uchar *s,uchar no)
{ uchar i;
start_I2c();
sendbyte(sla);
if (ack==0)return(0);
sendbyte(suba);
if (ack==0)return(0);
start_I2c();
sendbyte(sla+1);
if (ack==0) return (0);
for (i=0;i<no-1;i++)
{*s=rcvbyte();
ack_I2c(0);
s++;
}
*s=rcvbyte();
ack_I2c(1);
stop_I2c();
return (1);
} |
|