24c02仿真proteus 不知道哪里错了
#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitscl=P1^0;sbitsda=P...
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit scl=P1^0;
sbit sda=P1^1;
//uchar read_byte=0x00;
void delay(void)
{
unsigned char i,j,k;
for(i=2;i>0;i--)
for(j=132;j>0;j--)
for(k=150;k>0;k--);
}
iic_start()
{
sda=1;
scl=1;
delay();
sda=0;
delay();
scl=0;
}
iic_stop()
{
sda=0;
scl=1;
delay();
sda=1;
delay();
sda=0;
}
iic_waitack() //此函数适用于EEPROM应答
{
scl=0;//一般情况下,只有在scl为0时,sda允许改变。 特殊情况下,假如scl为1时,sda从1下降到0,为iic起始信号;sda从0上升到1,为iic停止信号
sda=1; //主机释放sda线,即写入1
scl=1;//开始读入从机的sda值
delay();
while(sda);
scl=0;
}
iic_noack() //均适用 当前地址读 多字节读 随机读
{
sda=1;//主机已写好应答位1 (非应答)
scl=1;//读入sda的0应答位
delay();//延时确保读入完毕
scl=0;//一般最后应把scl线拉成0,不然,可能会产生意外的起始和停止信号。
}
void iic_write(uchar write_byte)
{
uint i;
for(i=0;i<8;i++)
{
scl=0;
sda=(bit)(write_byte&0x80);
scl=1;
delay();
scl=0; //把scl置为0
write_byte<<=1;
}
delay();
}
/*
uchar iic_read() //当前地址读一个字节
{
uint i;
for(i=0;i<8;i++)
{
scl=0;
scl=1;
read_byte=readbyte|sda;
delay();
scl=0; //把scl置为0
read_byte<<=1;
}
return (read_byte);
}*/
uchar iic_read()
{
unsigned char temp,rbyte=0;
for(temp=0;temp<8;temp++)
{
scl=1; //下降沿为产生下降沿作准备
rbyte=rbyte<<1;//rbyte左移
rbyte=rbyte|((unsigned char)(sda));//SDA总线发送数据
scl=0;//产生下降沿
}
return (rbyte);
}
void main()
{
uchar byte_address=0x20;
uchar segment=0x3f;
iic_start();
iic_write(0xa0);
iic_waitack();
iic_write(byte_address);
iic_waitack();
iic_write(segment);
iic_waitack();
delay();
iic_stop();
//以上为写数据segmen=0x3ft到地址0x20
iic_start();
iic_write(0xa0);
iic_waitack();
iic_write(byte_address);
iic_waitack();
iic_start();
iic_write(0xa1);
iic_waitack();;
P3=iic_read();
iic_noack();
iic_stop();
while(1);
}
proteus图片附上 展开
#define uchar unsigned char
#define uint unsigned int
sbit scl=P1^0;
sbit sda=P1^1;
//uchar read_byte=0x00;
void delay(void)
{
unsigned char i,j,k;
for(i=2;i>0;i--)
for(j=132;j>0;j--)
for(k=150;k>0;k--);
}
iic_start()
{
sda=1;
scl=1;
delay();
sda=0;
delay();
scl=0;
}
iic_stop()
{
sda=0;
scl=1;
delay();
sda=1;
delay();
sda=0;
}
iic_waitack() //此函数适用于EEPROM应答
{
scl=0;//一般情况下,只有在scl为0时,sda允许改变。 特殊情况下,假如scl为1时,sda从1下降到0,为iic起始信号;sda从0上升到1,为iic停止信号
sda=1; //主机释放sda线,即写入1
scl=1;//开始读入从机的sda值
delay();
while(sda);
scl=0;
}
iic_noack() //均适用 当前地址读 多字节读 随机读
{
sda=1;//主机已写好应答位1 (非应答)
scl=1;//读入sda的0应答位
delay();//延时确保读入完毕
scl=0;//一般最后应把scl线拉成0,不然,可能会产生意外的起始和停止信号。
}
void iic_write(uchar write_byte)
{
uint i;
for(i=0;i<8;i++)
{
scl=0;
sda=(bit)(write_byte&0x80);
scl=1;
delay();
scl=0; //把scl置为0
write_byte<<=1;
}
delay();
}
/*
uchar iic_read() //当前地址读一个字节
{
uint i;
for(i=0;i<8;i++)
{
scl=0;
scl=1;
read_byte=readbyte|sda;
delay();
scl=0; //把scl置为0
read_byte<<=1;
}
return (read_byte);
}*/
uchar iic_read()
{
unsigned char temp,rbyte=0;
for(temp=0;temp<8;temp++)
{
scl=1; //下降沿为产生下降沿作准备
rbyte=rbyte<<1;//rbyte左移
rbyte=rbyte|((unsigned char)(sda));//SDA总线发送数据
scl=0;//产生下降沿
}
return (rbyte);
}
void main()
{
uchar byte_address=0x20;
uchar segment=0x3f;
iic_start();
iic_write(0xa0);
iic_waitack();
iic_write(byte_address);
iic_waitack();
iic_write(segment);
iic_waitack();
delay();
iic_stop();
//以上为写数据segmen=0x3ft到地址0x20
iic_start();
iic_write(0xa0);
iic_waitack();
iic_write(byte_address);
iic_waitack();
iic_start();
iic_write(0xa1);
iic_waitack();;
P3=iic_read();
iic_noack();
iic_stop();
while(1);
}
proteus图片附上 展开
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询