//废话不多说,上代码;
//注释的部分出现乱码,请改成ANSI编码
#include<reg51.h>
#include<intrins.h>
#define NOP4() _nop_(),_nop_(),_nop_(),_nop_()
typedef unsigned char u8;
sbit SCL=P1^0;
sbit SDA=P1^1;
u8 code DATA[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //CA段码
void Delay(int x) //延时
{
u8 t;
while(x--) for(t=120;t>0;t--);
}
void I2cinit() //I2C的初始化
{
SDA = 1,NOP4();SCL = 1,NOP4();
}
void Start() //I2C启动
{
SDA=1;SCL=1;NOP4();SDA=0;NOP4();SCL=0;
}
void Stop() //I2C停止
{
SDA=0;SCL=0;NOP4();SCL=1;NOP4();SDA=1;
}
void RACK() //应答
{
SDA=1;NOP4();SCL=1;NOP4();SCL=0;
}
void NO_ACK() //不应答
{
SDA=1;SCL=1;NOP4();SCL=0;SDA=0;
}
void Write_A_Byte(u8 b) //写一个字节
{
#if 1
u8 i;
for(i=0;i<8;i++)
{
b<<=1;SDA=CY;_nop_();SCL=1;NOP4();SCL=0;
}
#else
//不使用溢出标志位Y的写法
u8 i;
for(i=0;i<8;i++,b<<=1) //从高位开始写
{
SDA = b & 0x80 == 0x00 ?0:1;
//if(b&0x80) //最高位数据是否位0
// SDA=1;
//else
// SDA=0;
SCL=1;NOP4();SCL=0;
}
#endif
RACK(); //Ó¦´ð
}
u8 Receive_A_Byte() //接收一个字节的数据
{
u8 i,d;
for(i=0;i<8;i++)
{
SCL=1;d<<=1;d|=SDA;SCL=0;
}
return d;
}
void Write_add_dat(u8 add,u8 dat) //在对应的地址写数据
{
Start();
Write_A_Byte(0xa0); A0,A1,A2接地,AT24C02芯片地址为1010,送控制字为1010A2A1A0R/~W
Write_A_Byte(add); //写地址
Write_A_Byte(dat); //写数据
Stop();
Delay(10);
}
u8 Read_addr(u8 addr){ //读对应地址的数据
u8 d;
Start();
Write_A_Byte(0xa0); //写设备地址 A0,A1,A2接地,AT24C02芯片地址为1010,送控制字为1010A2A1A0R/~W
Write_A_Byte(addr); //写对应的内存地址
Stop();
//写读指令
Start();
Write_A_Byte(0xa1); //写设备读的命令
d=Receive_A_Byte(); //接收读的数据
NO_ACK(); //不应答
Stop();
return d;
}
long pow(int a,int b){ //Ö»½ÓÊÕÕýÖµ
long y=1;
if(b!=0) while(b--) y*=a;
return y;
}
void dis_8(long x){ //P0ÊǶÎÂë P1ÊÇλÂë
u8 i,a[8];
u8 b=0x80;
for(i=0;i<8;i++) a[i]=x/pow(10,i)%10; //¸öλ~¸ßλ
for(i=0;i<8;i++) P0=0xff,P2=_cror_(b,i),P0=DATA[a[i]],Delay(1);
}
void main(){
u8 dat=0;
I2cinit(); //先把总线拉高,防止后面的不方便使用
Write_add_dat(0,12); //在地址0写入12
Write_add_dat(1,13); //在地址1写入13
dat=Read_add(0)+Read_add(1); //读出这两个数据的值并相加
Write_add_dat(2,dat+2); //地址2写上dat+2
while(1) dis_8(Random_Read(2)); //数码显示
}
现象:代码和想象的现象一样