EEPROM_IIC

# include<reg52.h>

# define uchar unsigned char
# define uint unsigned int 

sbit sda=P2^0;
sbit scl=P2^1;

sbit lsa=P2^2;
sbit lsb=P2^3;
sbit lsc=P2^4;

uint code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0到F
uint disp[3];

void delay(uchar t);
void delay_1(uchar x);
void at24c02_start();
void at24c02_stop();
void at24c02_ack();
void at24c02_init();
void at24c02_write_onebyte(uchar byte);
uchar at24c02_read_onebyte();
void byte_write(uchar slave_add,
                uchar byte_add,
                uchar write_add);
uchar random_read(uchar slave_add,
                uchar byte_add);
void  datepros(uchar w);
void display();


uchar k,n;

int main()
{
    at24c02_init();
    while(1)
    {
        random_read(0xa0,0);
        k++;
        if(k==50)  //延时一段时间
        {
            k=0;
            n++;
        }  
        if(n==250)
        {
            n=0;
        }
        datepros(n);  //数字处理
        display();    //数码管显示
        byte_write(0xa0,0,n);//字节写函数
        delay(1);   
    }

}
/***************************************************************
                        1、 IIC延时函数
***************************************************************/
void delay(uchar t)
{
    uchar x,y;
    for(x=t;x>0;x--)
    {
        for(y=10;y>0;y--)
        {}
    }
}
/***************************************************************
                        数码管延时函数
***************************************************************/
void delay_1(uchar x)
{
    uchar m,n;
    for(n=x;n>0;n--)
    {
        for(m=120;m>0;m--)
        {}
    }
}

/***************************************************************
                        2、 起始函数
***************************************************************/
void at24c02_start()
{
    scl=1;
    delay(1);
    sda=1;
    delay(1);
    sda=0;  //SDA下降沿
    delay(1);       
}
/***************************************************************
                        3、停止函数
***************************************************************/
void at24c02_stop()
{
    scl=1;
    delay(1);
    sda=0;
    delay(1);
    sda=1;//SDA上升沿
    delay(1);   
}
/***************************************************************
                         4、应答函数
***************************************************************/
void at24c02_ack()
{
    uchar i;
    scl=1;
    delay(1);
    while((sda==1)&&(i<250))//判断是否响应
    {
        i++;
    }
    scl=0;
    delay(1);
}
/***************************************************************
                        5、初始化函数
***************************************************************/
void at24c02_init()
{
    sda=1;
    scl=1;
}
/***************************************************************
                     6、向at24c02里写入一个字节的函数
***************************************************************/
void at24c02_write_onebyte(uchar byte)
{
    uchar i,temp;
    temp=byte;
    scl=0;
    delay(1);
    for(i=0;i<8;i++) //一位一位的写入字节
    {
        temp=temp<<1;  //左移
        sda=CY;        //最高位移动到CY里面  再赋值给sda
        delay(1);
        scl=1;        //scl变化时 sda才允许变化
        delay(1);
        scl=0;
        delay(1);
    }
    sda=1;    //释放sda
    delay(1);
}
/***************************************************************
                     7、从at24c02读取一个字节的函数
***************************************************************/
uchar at24c02_read_onebyte()
{
    uchar i,dat=0;
    scl=0;
    delay(1);
    sda=1;
    delay(1);
    for(i=0;i<8;i++)
    {
        scl=1;
        delay(1);
        dat<<=1;
        dat|=sda;
        delay(1);
        scl=0;
        delay(1);
    }
    return dat;
}
/***************************************************************
                     8、定义一个字节写函数
***************************************************************/
void byte_write(uchar slave_add,
                uchar byte_add,
                uchar write_add)
{
    at24c02_start();
    at24c02_write_onebyte(slave_add);
    at24c02_ack();
    at24c02_write_onebyte(byte_add);
    at24c02_ack();
    at24c02_write_onebyte(write_add);
    at24c02_stop();
}
/***************************************************************
                     9、选择地址函数
***************************************************************/
uchar random_read(uchar slave_add,
                uchar byte_add)
{   
    uchar num;
    at24c02_start();
    at24c02_write_onebyte(slave_add);
    at24c02_ack();
    at24c02_write_onebyte(byte_add);
    at24c02_ack();

    at24c02_start();
    at24c02_write_onebyte(slave_add+0x01);
    at24c02_ack();
    num = at24c02_read_onebyte();
    return num;
    at24c02_stop();
}
/***************************************************************
                     10、处理函数 分离出百 十 个 位
***************************************************************/
void  datepros(uchar w)
{
    uchar baiwei,shiwei,gewei;  
    baiwei=w/100;
    shiwei=w%100/10;
    gewei=w%10;

    disp[0]=smgduan[baiwei];
    disp[1]=smgduan[shiwei];
    disp[2]=smgduan[gewei];

}
/***************************************************************
                     11、显示函数
***************************************************************/
void display()
{
    uchar i;
    for(i=0;i<3;i++)
    {
        switch(i)
        {
            case(0):lsa=0;lsb=0;lsc=0;break;
            case(1):lsa=1;lsb=0;lsc=0;break;
            case(2):lsa=0;lsb=1;lsc=0;break;                                            
        }
        P0=disp[i];
        delay_1(10);
        P0=0x00;//消隐    
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值