立即注冊(cè) 登錄
返回首頁(yè)

uid:155764的個(gè)人空間

日志

EEPROM多字節(jié)讀寫(xiě)

已有 3921 次閱讀2017-11-3 22:09

 /************************main.c文件程序源代碼**************************/


#include <reg52.h>

extern void LcdInit();
extern void LcdShowStr(unsigned char x, unsigned char y, const unsigned char *str);
extern void I2CStart();
extern void I2CStop();
extern unsigned char I2CReadACK();
extern unsigned char I2CReadNAK();
extern bit I2CWrite(unsigned char dat);
void E2Read(unsigned char *buf, unsigned char addr, unsigned char len);
void E2Write(unsigned char *buf, unsigned char addr, unsigned char len);
void ArrayToHexStr(unsigned char *str, unsigned char *array, unsigned char len);

void main ()
{
    unsigned char i;
    unsigned char buf[5];
    unsigned char str[20];

    LcdInit();   //初始化液晶
    E2Read(buf, 0x90, sizeof(buf));       //E2中讀取一段數(shù)據(jù)
    ArrayToHexStr(str, buf, sizeof(buf)); //轉(zhuǎn)換為十六進(jìn)制字符串
    LcdShowStr(0, 0, str);                //顯示到液晶上
    for (i=0; i<sizeof(buf); i++)        //數(shù)據(jù)依次+1,+2,+3...
    {
        buf[ i] = buf[ i] + 1 + i;
    }
    E2Write(buf, 0x90, sizeof(buf));      //再寫(xiě)回到E2

    while(1)
    {}
}

void ArrayToHexStr(unsigned char *str, unsigned char *array, unsigned char len) //把一個(gè)字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制字符串的格式
{
    unsigned char tmp;

    while (len--)
    {
        tmp = *array >> 4;         //先取高4
        if (tmp <= 9)              //轉(zhuǎn)換為0-9A-F
            *str = tmp + '0';
        else
            *str = tmp - 10 + 'A';
        str++;
        tmp = *array & 0x0F;       //再取低4
        if (tmp <= 9)              //轉(zhuǎn)換為0-9A-F
            *str = tmp + '0';
        else
            *str = tmp - 10 + 'A';
        str++;
        *str = ' ';                //轉(zhuǎn)換完一個(gè)字節(jié)添加一個(gè)空格
        str++;
        array++;
    }
}
void E2Read(unsigned char *buf, unsigned char addr, unsigned char len) //E2讀取函數(shù),數(shù)據(jù)接收指針buf,E2中的起始地址addr,讀取長(zhǎng)度len
{
    do {                       //用尋址操作查詢(xún)當(dāng)前是否可進(jìn)行讀寫(xiě)操作
        I2CStart();
        if (I2CWrite(0x50<<1)) //器件應(yīng)答則跳出循環(huán),繼續(xù)執(zhí)行,非應(yīng)答則進(jìn)行下一次查詢(xún)
            break;
        I2CStop();
    } while(1);
    I2CWrite(addr);           //寫(xiě)入起始地址
    I2CStart();               //發(fā)送重復(fù)啟動(dòng)信號(hào)
    I2CWrite((0x50<<1)|0x01); //尋址器件,后續(xù)為讀操作
    while (len > 1)           //連續(xù)讀取len-1個(gè)字節(jié)
    {
        *buf = I2CReadACK();  //最后字節(jié)之前為讀取操作+應(yīng)答
        buf++;
        len--;
    }
    *buf = I2CReadNAK();      //最后一個(gè)字節(jié)為讀取操作+非應(yīng)答
    I2CStop();
}

void E2Write(unsigned char *buf, unsigned char addr, unsigned char len) //E2寫(xiě)入函數(shù),源數(shù)據(jù)指針bufE2中的起始地址addr,寫(xiě)入長(zhǎng)度len
{
    while (len--)
    {
        do {                       //用尋址操作查詢(xún)當(dāng)前是否可進(jìn)行讀寫(xiě)操作,即等待上一次寫(xiě)入操作完成
            I2CStart();
            if (I2CWrite(0x50<<1)) //器件應(yīng)答則跳出循環(huán),繼續(xù)執(zhí)行,非應(yīng)答則進(jìn)行下一次查詢(xún)
                break;
            I2CStop();
        } while(1);
        I2CWrite(addr);           //寫(xiě)入起始地址
        I2CWrite(*buf);           //寫(xiě)入一個(gè)字節(jié)數(shù)據(jù)
        I2CStop();                //結(jié)束寫(xiě)操作,以等待寫(xiě)入完成
        buf++;                    //數(shù)據(jù)指針遞增
        addr++;                   //E2地址遞增
    }
}


路過(guò)

雞蛋

鮮花

握手

雷人

評(píng)論 (0 個(gè)評(píng)論)

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

返回頂部