恩,这个问题困扰了两天,终于找到原因并且顺利解决了!原因是:单片机接收应答信号(向AT24C02写数据时)和发送应答信号(AT24C02向单片机发送数据)的代码是不一样的!
void ack()//acknowledge (单片机接收应答信号)
{
uchar i;
scl=1;
delay();
while((sda == 1)&&(i > 250))
i++;
scl=0;//注意此处,此处表示第九个时钟结束,不能不写
delay();
}
void ack2(bit response)//(单片机发送的应答信号,response=1时是非应答,response=0时是应答!)
{
sda=response;
scl=1;
delay();
scl=0;
delay();
}
//然后严格遵循datasheet的操作时序
//读数据的代码是这样的()
void read_add(uchar address)
{
start();
write_byte(0xa0);
ack();
write_byte(address);
ack();//dummy write
start();
write_byte(0xa1);
ack();
P1=read_byte();
ack2(0);//这个应答才正确
// ack();这个应答不正确
P1=read_byte();
ack2(1);
delay();
stop();
}
//这里注意,我用郭天祥老师的TX-1C,给P1口赋值让lcd灯来检验我的应答信号是否正确