立即注册 登录
返回首页

uid:155764的个人空间

日志

EEPROM多字节读写

已有 3810 次阅读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中读取一段数据
    ArrayToHexStr(str, buf, sizeof(buf)); //转换为十六进制字符串
    LcdShowStr(0, 0, str);                //显示到液晶上
    for (i=0; i<sizeof(buf); i++)        //数据依次+1,+2,+3...
    {
        buf[ i] = buf[ i] + 1 + i;
    }
    E2Write(buf, 0x90, sizeof(buf));      //再写回到E2

    while(1)
    {}
}

void ArrayToHexStr(unsigned char *str, unsigned char *array, unsigned char len) //把一个字节数组转换为十六进制字符串的格式
{
    unsigned char tmp;

    while (len--)
    {
        tmp = *array >> 4;         //先取高4
        if (tmp <= 9)              //转换为0-9A-F
            *str = tmp + '0';
        else
            *str = tmp - 10 + 'A';
        str++;
        tmp = *array & 0x0F;       //再取低4
        if (tmp <= 9)              //转换为0-9A-F
            *str = tmp + '0';
        else
            *str = tmp - 10 + 'A';
        str++;
        *str = ' ';                //转换完一个字节添加一个空格
        str++;
        array++;
    }
}
void E2Read(unsigned char *buf, unsigned char addr, unsigned char len) //E2读取函数,数据接收指针bufE2中的起始地址addr,读取长度len
{
    do {                       //用寻址操作查询当前是否可进行读写操作
        I2CStart();
        if (I2CWrite(0x50<<1)) //器件应答则跳出循环,继续执行,非应答则进行下一次查询
            break;
        I2CStop();
    } while(1);
    I2CWrite(addr);           //写入起始地址
    I2CStart();               //发送重复启动信号
    I2CWrite((0x50<<1)|0x01); //寻址器件,后续为读操作
    while (len > 1)           //连续读取len-1个字节
    {
        *buf = I2CReadACK();  //最后字节之前为读取操作+应答
        buf++;
        len--;
    }
    *buf = I2CReadNAK();      //最后一个字节为读取操作+非应答
    I2CStop();
}

void E2Write(unsigned char *buf, unsigned char addr, unsigned char len) //E2写入函数,源数据指针bufE2中的起始地址addr写入长度len
{
    while (len--)
    {
        do {                       //用寻址操作查询当前是否可进行读写操作,即等待上一次写入操作完成
            I2CStart();
            if (I2CWrite(0x50<<1)) //器件应答则跳出循环,继续执行,非应答则进行下一次查询
                break;
            I2CStop();
        } while(1);
        I2CWrite(addr);           //写入起始地址
        I2CWrite(*buf);           //写入一个字节数据
        I2CStop();                //结束写操作,以等待写入完成
        buf++;                    //数据指针递增
        addr++;                   //E2地址递增
    }
}


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

返回顶部