新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AT24C1024 proteus 2-wire Serial EEPROM 1

        AT24C1024 proteus 2-wire Serial EEPROM 1

        作者: 時間:2016-11-13 來源:網絡 收藏
        第i地址寫入i

        注意,讀數據時候 if((TWSR & 0xF8) != 0x10)//0x10 重復START 已發。。。不是0x08.還有2次讀寫之間稍微延時一會。否則不出結果

        本文引用地址:http://www.104case.com/article/201611/316380.htm

        avr的數據手冊寫得很好,好多程序源碼都有,怪不得這么流行

        1

        #include
        #include "1602.c"

        #define uint unsigned int
        #define uchar unsigned char

        #define START TWCR=(1<#define STOP TWCR=(1<

        void iic_init()
        {
        TWBR=32;//8mhz/80= 100khz
        TWCR=0;
        TWSR=0;
        //DDRC|=0X03;
        //PORTC|=0X03;
        }

        uint write_B(uchar page,uint addr,uchar data )//page 0 . 1. 代表17位地址最高位
        {
        uchar s=0xa0|(page<<1);//at24 從地址
        START;
        while(!(TWCR & (1<if((TWSR & 0xF8) != 0x08)
        return 0xffff;
        ////////////////
        TWDR=s;
        TWCR = (1<while(!(TWCR & (1<if((TWSR & 0xF8) != 0x18)
        return 0xffff;
        //// /////////
        TWDR = (addr>>8); //先發高地址
        TWCR = (1<while(!(TWCR & (1<
        if((TWSR & 0xF8) != 0x28)
        return 0xffff;
        ////////////////
        TWDR = (addr&0xff); //地址低8位
        TWCR = (1<while(!(TWCR & (1<
        if((TWSR & 0xF8) != 0x28)//數據已發送接收到ACK

        return 0xffff;
        /////////////////
        TWDR = data; //數據
        TWCR = (1<while(!(TWCR & (1<
        if((TWSR & 0xF8) != 0x28)//數據已發送接收到ACK

        return 0xffff;

        STOP;

        }

        uint read_B(uchar page,uint addr)
        {
        uchar data,s=0xa0|(page<<1);//at24 從地址.。@@寫最后一位為0

        START;
        while(!(TWCR & (1<

        if((TWSR & 0xF8) != 0x08)
        return 0xffff;
        ////////////////
        TWDR=s;
        TWCR =(1<while (!(TWCR & (1<if((TWSR & 0xF8) != 0x18)
        return 0xffff;
        //// /////////
        TWDR = (addr>>8); //先發高地址
        TWCR = (1<while(!(TWCR & (1<
        if((TWSR & 0xF8) != 0x28)
        return 0xffff;
        ////////////////
        TWDR = (addr&0xff); //地址低8位
        TWCR = (1<while(!(TWCR & (1<
        if((TWSR & 0xF8) != 0x28)//數據已發送接收到ACK

        return 0xffff;
        //重復START
        START;
        while(!(TWCR & (1<

        if((TWSR & 0xF8) != 0x10)//0x10 重復START 已發
        return 0xffff;

        TWDR=s|(1);//最后一位1,讀
        TWCR = (1<while(!(TWCR & (1<if((TWSR & 0xF8) != 0x40)//SLA+R 已發送接收到ACK

        return 0xffff;
        //DDRC&=~(0X03);

        TWCR = (1<while(!(TWCR & (1<data=TWDR;
        STOP;
        //DDRC|=(0X03);

        return data;

        }

        void main()
        {
        uint i,j,k,r;
        uchar temp[4], temp1[7]="t[ ]";
        uchar table[255];

        iic_init();
        init_1602();

        for(k=0;k<255;k++)
        table[k]=k;

        for(k=0;k<255;k++)
        {
        write_B(0,k,k);//第k地址寫k
        for(i=0;i<10;i++)//一定要延時
        for(j=0;j<1141;j++);
        }



        for(i=0;i<1000;i++)//延時
        for(j=0;j<1141;j++);

        for(k=0;k<255;k++)
        {
        r=read_B(0,k);
        r=r&0xff;

        temp[0]=r/100+0;
        temp[1]=r%100/10+0;
        temp[2]=r%10+0;
        temp[3]=0;

        LCD_write_string(1,1,temp);


        temp1[2]=k/100+0;
        temp1[3]=k%100/10+0;
        temp1[4]=k%10+0;
        temp1[6]=0;



        LCD_write_string(2,0,temp1);


        for(i=0;i<1000;i++)
        for(j=0;j<1141;j++);


        }

        while(1);
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宽甸| 桦南县| 新乡县| 深圳市| 枣庄市| 藁城市| 密云县| 彭阳县| 宿州市| 屯昌县| 大足县| 嘉善县| 莱州市| 高台县| 和田市| 渭源县| 芜湖县| 罗江县| 河池市| 汉川市| 隆化县| 红安县| 米林县| 社旗县| 时尚| 云南省| 阳原县| 天等县| 白城市| 错那县| 温州市| 宜章县| 临澧县| 辽阳县| 郁南县| 马关县| 祁东县| 揭西县| 盘山县| 山丹县| 平陆县|