#include <reg52.h>
#define uint unsigned int //定义unsigned int 为uint
#define uchar unsigned char //定义unsigned char 为uchar
#define uchar unsigned char //定义unsigned char 为uchar
#define uint unsigned int //定义unsigned int 为uint
sbit sda=P3^3;//定义I2C数据线
sbit scl=P3^2;//定义I2C时钟线
void delay2()//延迟6us函数
{;;;}
void start()//I2C开始时钟函数
{
sda=1;
delay2();//延迟6us是时序要求。
scl=1;
delay2();
sda=0;
delay2();
}
void stop()//I2C结束时钟函数
{
sda=0;
delay2();//延迟6us是时序要求。
scl=1;
delay2();
sda=1;
delay2();
}
void respons()//应答函数
{
uchar i;//定义变量I
scl=1;
delay2();
while((sda==1)&&(i<250))i++;//没有收到应答信号在等
//过一段时间后还是没收到自动跳出该语句.相与。
scl=0;
delay2();
}
void init()//初始化函数。
{
scl=1;
sda=1;
}
void write_byte(uchar date)//写一字节函数。
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;//TEMP左移一位!
scl=0;
delay2();
sda=CY;//送走最高位,依次把八位送完。
scl=1;//保持数据稳定。
delay2();
}
scl=0;
delay2();
sda=1;//总线释放。
delay2();
}
uchar read_byte()//读一字节函数。带返回值的函数
{
uchar i,j,k;
scl=0;
delay2();
sda=1;//总线释放。
delay2();
for(i=0;i<8;i++)
{
scl=1;
delay2();
j=sda;
k=(k<<1)|j;//k左移一位最低位变成了0,再与J相或,J就送到K最低位。
scl=0;//置低以便下次读数据。
delay2();
}
return k;
}
void write_add(uchar address,uchar date)
{ start();//I2C开始时钟函数
write_byte(0xa0);//at24c02的固定地址A,1010,AO-A3都接地都为0。
respons();//写完后调用应答函数
write_byte(address);//确定从at24c02的第address位置写数据。
respons();//写完后调用应答函数
write_byte(date);//在芯片第address位置写date.
respons();//写完后调用应答函数
stop();//I2C结束时钟函数
}
uchar read_add(uchar address)
{
uchar date;
start();//I2C开始时钟函数
write_byte(0xa0);//开始读。
respons();//读完后调用应答函数
write_byte(address);//确定从at24c02的第address位置读数据。
respons();//读完后调用应答函数
start();//I2C开始时钟函数
write_byte(0xa1);//读数据
respons();//读完后调用应答函数
date=read_byte();//送到P1口显示。
stop();//I2C结束时钟函数
return date;
}
uint intnum,aa,ee,dd,cc;
sbit D1=P3^4;//位定义
sbit D2=P3^5;//位定义
sbit D3=P3^7;//位定义
sbit D4=P1^6;//位定义
sbit D5=P1^7;//位定义
void delay (uint z);
void main ()
{
P1=0xff;
dd=0;
D2=0;
D3=0;
delay (2200);
//aa=5;
//ee=11000;
while(1)
{
uchar f,k;
f=2;
init();//写直址,最后低位应为0。
delay (1);
k=read_add(f);//送到P1口显示。//从23地址读数据
aa=k;
ee=aa*2200;
if(D4==0)
{
delay (100);
if(D4==1)
{
aa++;
delay (1);
init();//写直址,最后低位应为0。
write_add(2,aa);//23为at24c02内部储存地址,0xaa为写到23地址的数据。
delay (1);
k=read_add(2);//送到P1口显示。//从23地址读数据
aa=k;
stop();
if(aa==8)
{
aa=7;
}
}
}
if(aa>1)
{
if(D5==0)
{
delay (100);
if(D5==1)
{
aa--;
delay (1);
init();//写直址,最后低位应为0。
write_add(2,aa);//23为at24c02内部储存地址,0xaa为写到23地址的数据。
delay (1);
k=read_add(2);//送到P1口显示。//从23地址读数据
aa=k;
stop();
//ee=aa*2200;
if(aa==1)
{
aa=2;
}
}
}
}
if(dd==0)
{
if(D1==0)
{
delay (5000);
if(D1==0)
{
D2=0;
D3=1;
dd=1;
delay (ee);
D2=0;
D3=0;
}
}
}
if(dd==1)
{
if(D1==1)
{
delay (5000);
if(D1==1)
{
D2=1;
D3=0;
dd=0;
delay (ee);
D2=0;
D3=0;
}
}
}
}
}
void delay(uint z)//代参数无返回值
{ uint x,y;
for (x=300;x>0;x--)
for (y=z;y>0;y--);//100*2000次
}