📄 iic-24c64.c
字号:
#include<reg51.h>
#include<intrins.h>
sbit sda=P2^7;
sbit scl=P2^6;
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;
extern void delay1(unsigned int i);
extern void delay0();
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(unsigned char ch);/*写发送移位*/
unsigned char i2c_readbyte(void); /*读移位*/
bit i2c_read(unsigned int address,unsigned char fb[],unsigned char su);
bit i2c_write(unsigned int address,unsigned char fb[],unsigned char su);
bit i2c_writea(unsigned int address,unsigned char fb);
unsigned char i2c_reada(unsigned int address);
void wirte_24c64a(unsigned int address,unsigned char fb);
void wirte_24c64(unsigned int address,unsigned char fb[],unsigned char su);
void read_24c64(unsigned int address,unsigned char fb[],unsigned char su);//多字节读
void i2c_start(void)
{
scl=1;
sda=1;
delay0();
scl=1;
delay0();
sda=0;
delay0();
scl=0;
delay0();
}
void i2c_stop(void)
{
scl=0;
_nop_();
sda=0;
delay0();
scl=1;
delay0();
sda=1;
delay0();
scl=0;
sda=0;
}
bit wait_ack(void)
{
unsigned char i;
scl=0;
_nop_();
_nop_();
sda=1;
delay0();
scl=1;
delay0();
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;
delay0();
scl=1;
delay0();
scl=0;
}
void sendnot_ack(void)
{
sda=1;
delay0();
scl=1;
delay0();
scl=0;
}
void i2c_sendbyte(unsigned char ch)
{
ACC=ch;
sda=ac7;_nop_();scl=1;delay0();scl=0;delay0();
sda=ac6;_nop_();scl=1;delay0();scl=0;delay0();
sda=ac5;_nop_();scl=1;delay0();scl=0;delay0();
sda=ac4;_nop_();scl=1;delay0();scl=0;delay0();
sda=ac3;_nop_();scl=1;delay0();scl=0;delay0();
sda=ac2;_nop_();scl=1;delay0();scl=0;delay0();
sda=ac1;_nop_();scl=1;delay0();scl=0;delay0();
sda=ac0;_nop_();scl=1;delay0();scl=0;delay0();
}
unsigned char i2c_readbyte(void)
{
unsigned char sf;
sda=1;_nop_();_nop_();
scl=1;delay0();ac7=sda;scl=0;delay0();
scl=1;delay0();ac6=sda;scl=0;delay0();
scl=1;delay0();ac5=sda;scl=0;delay0();
scl=1;delay0();ac4=sda;scl=0;delay0();
scl=1;delay0();ac3=sda;scl=0;delay0();
scl=1;delay0();ac2=sda;scl=0;delay0();
scl=1;delay0();ac1=sda;scl=0;delay0();
scl=1;delay0();ac0=sda;scl=0;delay0();
sf=ACC;
return(sf);
}
bit i2c_read(unsigned int address,unsigned char fb[],unsigned char su)//多字节读
{
unsigned char i;
unsigned char dd=0xa0;
unsigned char dc=0xa1;
unsigned char s;
unsigned char c;
s=address;
c=address>>8;
delay1(2000);
i2c_start();
i2c_sendbyte(dd);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(c);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(s);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_stop();
delay1(300);
i2c_start();
i2c_sendbyte(dc);
if(wait_ack())
{
i2c_stop();
return(0);
}
for(i=0;i<=su;i++)
{
fb[i]=i2c_readbyte();
send_ack();
}
fb[i]=i2c_readbyte();
sendnot_ack();
i2c_stop();
return(1);
}
bit i2c_write(unsigned int address,unsigned char fb[],unsigned char su)//多字节写
{
unsigned char i;
unsigned char dd=0xa0;
unsigned char s;
unsigned char c;
s=address;
c=address>>8;
delay1(600);
i2c_start();
i2c_sendbyte(dd);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(c);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(s);
if(wait_ack())
{
i2c_stop();
return(0);
}
if(su>32)
{
for(i=0;i<32;i++)
{
i2c_sendbyte(fb[i]);
if(wait_ack())
{
i2c_stop();
return(0);
}
}
i2c_stop();
delay1(600);
address=address+32;
s=address;
c=address>>8;
i2c_start();
i2c_sendbyte(dd);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(c);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(s);
if(wait_ack())
{
i2c_stop();
return(0);
}
for(i=32;i<su;i++)
{
i2c_sendbyte(fb[i]);
if(wait_ack())
{
i2c_stop();
return(0);
}
}
i2c_stop();
return(1);
}
else {
for(i=0;i<su;i++)
{
i2c_sendbyte(fb[i]);
if(wait_ack())
{
i2c_stop();
return(0);
}
}
i2c_stop();
return(1);
}
}
unsigned char i2c_reada(unsigned int address)//单字节读
{
unsigned char dd=0xa0;
unsigned char dc=0xa1;
unsigned char s;
unsigned char c;
s=address;
c=address>>8;
delay1(2000);
i2c_start();
i2c_sendbyte(dd);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(c);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(s);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_stop();
delay1(300);
i2c_start();
i2c_sendbyte(dc);
if(wait_ack())
{
i2c_stop();
return(0);
}
s=i2c_readbyte();
sendnot_ack();
i2c_stop();
return(s);
}
bit i2c_writea(unsigned int address,unsigned char fb)//单字节写
{
unsigned char dd=0xa0;
unsigned char ae;
unsigned char ar;
ae=address;
ar=address>>8;
delay1(600);
i2c_start();
i2c_sendbyte(dd);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(ar);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(ae);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(fb);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_stop();
return(1);
}
void wirte_24c64(unsigned int address,unsigned char fb[],unsigned char su)
{
unsigned char i;
for(i=0;i<4;i++)
{
if(i2c_write(address,fb,su))
return;
}
}
void wirte_24c64a(unsigned int address,unsigned char fb)
{
unsigned char i;
for(i=0;i<4;i++)
{
if(i2c_writea(address,fb))
return;
}
}
void read_24c64(unsigned int address,unsigned char fb[],unsigned char su)//多字节读
{
unsigned char i;
for(i=0;i<4;i++)
{
if(i2c_read(address,fb,su))
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -