📄 wdi2ca.c
字号:
#include<w77e58.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sclk=P1^0;
sbit sda= P3^3; //24c02
sbit scl= P3^4;
extern uchar data e2prom;
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); /*读移位*/
uchar i2c_readbyte1(void);
uint i2c_read_int(uchar address);
//bit i2c_write_int(uchar address,int fb);
uchar i2c_read(uchar address);
bit i2c_write(uchar address,uchar fb);
//***********************************//
void delay1();
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 i2c_start(void)
{
sda=1;
scl=1;
delay1();
sda=0;
delay1();
scl=0;
delay1();
}
void i2c_stop(void)
{
scl=0;
_nop_();
sda=0;
delay1();
scl=1;
delay1();
sda=1;
}
bit wait_ack(void)//=0,ok
{
uchar i;
scl=0;
_nop_();
_nop_();
sda=1;
delay1();
scl=1;
delay1();
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;
delay1();
scl=1;
delay1();
scl=0;
}
void sendnot_ack(void)
{
sda=1;
delay1();
scl=1;
delay1();
scl=0;
}
void i2c_sendbyte(uchar ch)
{
ACC=ch;
sda=ac7;_nop_();_nop_();_nop_();_nop_();scl=1;delay1();scl=0;delay1();
sda=ac6;_nop_();_nop_();_nop_();_nop_();scl=1;delay1();scl=0;delay1();
sda=ac5;_nop_();_nop_();_nop_();_nop_();scl=1;delay1();scl=0;delay1();
sda=ac4;_nop_();_nop_();_nop_();_nop_();scl=1;delay1();scl=0;delay1();
sda=ac3;_nop_();_nop_();_nop_();_nop_();scl=1;delay1();scl=0;delay1();
sda=ac2;_nop_();_nop_();_nop_();_nop_();scl=1;delay1();scl=0;delay1();
sda=ac1;_nop_();_nop_();_nop_();_nop_();scl=1;delay1();scl=0;delay1();
sda=ac0;_nop_();_nop_();_nop_();_nop_();scl=1;delay1();scl=0;delay1();
}
uint i2c_readbyte(void)
{
uint sf;
sda=1;_nop_();_nop_();_nop_();_nop_();
scl=1;delay1();ac7=sda;scl=0;delay1();
scl=1;delay1();ac6=sda;scl=0;delay1();
scl=1;delay1();ac5=sda;scl=0;delay1();
scl=1;delay1();ac4=sda;scl=0;delay1();
scl=1;delay1();ac3=sda;scl=0;delay1();
scl=1;delay1();ac2=sda;scl=0;delay1();
scl=1;delay1();ac1=sda;scl=0;delay1();
scl=1;delay1();ac0=sda;scl=0;delay1();
sf=ACC;
return(sf);
}
uchar i2c_readbyte1(void)
{
uchar sf;
sda=1;_nop_();_nop_();_nop_();_nop_();
scl=1;delay1();ac7=sda;scl=0;delay1();
scl=1;delay1();ac6=sda;scl=0;delay1();
scl=1;delay1();ac5=sda;scl=0;delay1();
scl=1;delay1();ac4=sda;scl=0;delay1();
scl=1;delay1();ac3=sda;scl=0;delay1();
scl=1;delay1();ac2=sda;scl=0;delay1();
scl=1;delay1();ac1=sda;scl=0;delay1();
scl=1;delay1();ac0=sda;scl=0;delay1();
sf=ACC;
return(sf);
}
void delay1()
{
uint i;
for(i=0;i<=40;i++)
_nop_();
}
uint i2c_read_int(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();
delay1();
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);
}
uchar i2c_read(uchar address)
{
uchar dd=0xa0;
uchar dc=0xa1;
uchar ae;
i2c_start();
i2c_sendbyte(dd);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(address);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_stop();
delay1();
i2c_start();
i2c_sendbyte(dc);
if(wait_ack())
{
i2c_stop();
return(0);
}
ae=i2c_readbyte1();
sendnot_ack();
i2c_stop();
return(ae);
}
/*bit i2c_write_int(uchar address,int fb)
{
uchar dd=0xa0;
uchar ae;
uchar ar;
char i;
ae=(uchar)fb;
fb=(fb>>8);
ar=(uchar)fb;
i2c_start();
i2c_sendbyte(dd);
while(wait_ack())
{
for(i=0;i<=10;i++)
{
delay();
}
i2c_stop();
return(0);
}
i2c_sendbyte(address);
while(wait_ack())
{
for(i=0;i<=10;i++)
{
delay();
}
i2c_stop();
return(0);
}
i2c_sendbyte(ae);
while(wait_ack())
{
for(i=0;i<=10;i++)
{
delay();
}
i2c_stop();
return(0);
}
i2c_sendbyte(ar);
while(wait_ack())
{
for(i=0;i<=10;i++)
{
delay();
}
i2c_stop();
return(0);
}
i2c_stop();
}
*/
bit i2c_write(uchar address,uchar fb)
{
uchar dd=0xa0;
i2c_start();
i2c_sendbyte(dd);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(address);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_sendbyte(fb);
if(wait_ack())
{
i2c_stop();
return(0);
}
i2c_stop();
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -