📄 wdi2c.c
字号:
#include <reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit sda= P1^4;
sbit scl= P1^5;
sbit ac0=ACC^0; /*定义ACC的位,利用ACC操作速度最快*/
sbit ac1=ACC^1;
sbit ac2=ACC^2;
sbit ac3=ACC^3;
sbit ac4=ACC^4;
sbit ac5=ACC^5;
sbit ac6=ACC^6;
sbit ac7=ACC^7;
void delay();
void i2c_start(void); /*起始*/
void i2c_stop(void); /*停止*/
bit wait_ack(void); /*等待24c02应答*/
void send_ack(void); /*向24c02发送应答*/
void sendnot_ack(void); /*向24c02发送非应答*/
void i2c_sendbyte(uchar ch);/*写发送移位*/
uint i2c_readbyte(void); /*读移位*/
uint i2c_read(uchar address);
bit i2c_write(uchar address,uint fb);
void i2c_start(void)
{
sda=1;
scl=1;
delay();
sda=0;
delay();
scl=0;
delay();
}
void i2c_stop(void)
{
scl=0;
_nop_();
sda=0;
delay();
scl=1;
delay();
sda=1;
}
bit wait_ack(void)
{
uchar i;
scl=0;
_nop_();
_nop_();
sda=1;
delay();
scl=1;
delay();
while(sda)
{
for(i=0;i<=5;i++)
{
if(!sda)
{
scl=0;
return(0);
}
}
return(1);
}
scl=0;
return(0);
}
void send_ack(void)
{
sda=0;
delay();
scl=1;
delay();
scl=0;
}
void sendnot_ack(void)
{
sda=1;
delay();
scl=1;
delay();
scl=0;
}
void i2c_sendbyte(uchar ch)
{
ACC=ch;
sda=ac7;_nop_();scl=1;delay();scl=0;delay();
sda=ac6;_nop_();scl=1;delay();scl=0;delay();
sda=ac5;_nop_();scl=1;delay();scl=0;delay();
sda=ac4;_nop_();scl=1;delay();scl=0;delay();
sda=ac3;_nop_();scl=1;delay();scl=0;delay();
sda=ac2;_nop_();scl=1;delay();scl=0;delay();
sda=ac1;_nop_();scl=1;delay();scl=0;delay();
sda=ac0;_nop_();scl=1;delay();scl=0;delay();
}
uint i2c_readbyte(void)
{
uint sf;
sda=1;_nop_();_nop_();
scl=1;delay();ac7=sda;scl=0;delay();
scl=1;delay();ac6=sda;scl=0;delay();
scl=1;delay();ac5=sda;scl=0;delay();
scl=1;delay();ac4=sda;scl=0;delay();
scl=1;delay();ac3=sda;scl=0;delay();
scl=1;delay();ac2=sda;scl=0;delay();
scl=1;delay();ac1=sda;scl=0;delay();
scl=1;delay();ac0=sda;scl=0;delay();
sf=ACC;
return(sf);
}
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
uint i2c_read(uchar address)
{
uchar dd=0xa0;
uchar dc=0xa1;
uint ae;
uint ar;
i2c_start();
i2c_sendbyte(dd);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(address);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_stop();
delay();
i2c_start();
i2c_sendbyte(dc);
if(wait_ack())
{
i2c_stop();
return(0);
}
ae=i2c_readbyte();
send_ack();
ar=i2c_readbyte();
sendnot_ack();
i2c_stop();
ar=ar<<8;
return(ar+ae);
}
bit i2c_write(uchar address,uint fb)
{
uchar dd=0xa0;
uchar ae;
uchar ar;
ae=(uchar)fb;
fb=(fb>>8);
ar=(uchar)fb;
i2c_start();
i2c_sendbyte(dd);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(address);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(ae);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(ar);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_stop();
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -