
STC 12C5A60S2 I/O口 模拟I2C 对 24LC32的读写问题 一直不能实现读写 下面的程序代码 请高手耐心解答
////////////////eeprom/////////////////////sbitsda=P3^6;sbitscl=P3^7;voiddelay()//12C...
////////////////eeprom/////////////////////
sbit sda=P3^6;
sbit scl =P3^7;
void delay() // 12C5A60S2 汇编指令nop速度是传统单片机12倍 所以这里用了10个NOP 不知道是否正确
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void eeprom_start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
scl=0;
delay();
}
void eeprom_stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void ack_eeprom()
{
sda=0;
delay();
scl=0;
delay();
scl=1;
delay();
scl=0;
delay();
sda=1;
delay();
}
void noack()
{
sda=1;
delay();
scl=1;
delay();
scl=0;
}
void eeprom_init()
{
sda=1;
delay();
scl=1;
delay();
}
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
if((temp&0x80)==0x80)
{
sda=1;
}
else
{
sda=0;
}
scl=1;
delay();
temp=temp<<1;
}
delay();
scl=0;
delay();
sda=1;
delay();
scl=1;
delay();
if(sda==1)
ack=0;
else
ack=0;
scl=0;
delay();
}
uchar read_byte()
{
uchar i,k=0;
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1);
if(sda==1)
k=k+1;
scl=0;
}
return k;
}
uchar write_add(uchar address,uchar address1,uchar date)
{
eeprom_start();
write_byte(0xa0);
if(ack==0)
return(0);
write_byte(address);
if(ack==0)
return(0);
write_byte(address1);
if(ack==0)
return(0);
write_byte(date);
if(ack==0)
return(0);
eeprom_stop();
return(1);
}
uchar read_add(uchar address,uchar address1)
{
uchar date;
eeprom_start();
write_byte(0xa0);
if(ack==0)
return(0);
write_byte(address);
if(ack==0)
return(0);
write_byte(address1);
if(ack==0)
return(0);
eeprom_start();
write_byte(0xa1);
if(ack==0)
return(0);
delay();
date=read_byte();
noack();
eeprom_stop();
return date;
}
24LC32 内部地址是2字节 展开
sbit sda=P3^6;
sbit scl =P3^7;
void delay() // 12C5A60S2 汇编指令nop速度是传统单片机12倍 所以这里用了10个NOP 不知道是否正确
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void eeprom_start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
scl=0;
delay();
}
void eeprom_stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void ack_eeprom()
{
sda=0;
delay();
scl=0;
delay();
scl=1;
delay();
scl=0;
delay();
sda=1;
delay();
}
void noack()
{
sda=1;
delay();
scl=1;
delay();
scl=0;
}
void eeprom_init()
{
sda=1;
delay();
scl=1;
delay();
}
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
if((temp&0x80)==0x80)
{
sda=1;
}
else
{
sda=0;
}
scl=1;
delay();
temp=temp<<1;
}
delay();
scl=0;
delay();
sda=1;
delay();
scl=1;
delay();
if(sda==1)
ack=0;
else
ack=0;
scl=0;
delay();
}
uchar read_byte()
{
uchar i,k=0;
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1);
if(sda==1)
k=k+1;
scl=0;
}
return k;
}
uchar write_add(uchar address,uchar address1,uchar date)
{
eeprom_start();
write_byte(0xa0);
if(ack==0)
return(0);
write_byte(address);
if(ack==0)
return(0);
write_byte(address1);
if(ack==0)
return(0);
write_byte(date);
if(ack==0)
return(0);
eeprom_stop();
return(1);
}
uchar read_add(uchar address,uchar address1)
{
uchar date;
eeprom_start();
write_byte(0xa0);
if(ack==0)
return(0);
write_byte(address);
if(ack==0)
return(0);
write_byte(address1);
if(ack==0)
return(0);
eeprom_start();
write_byte(0xa1);
if(ack==0)
return(0);
delay();
date=read_byte();
noack();
eeprom_stop();
return date;
}
24LC32 内部地址是2字节 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询