⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iicbusrom.c

📁 AT29C02的驱动程序
💻 C
字号:
//I2cE2pRom的读写操作
//读写操作之间需要一个(5ms)以上的延时
#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int

sbit SCL = P3^6;
sbit SDA = P3^7;

void start()//开始信号
{
    SDA = 1;
    SCL = 1;
    SDA = 0;
    
}

void stop()//结束信号
{
    SDA = 0;
    SCL = 1;
    SDA = 1;
}

void respond()//应答信号
{
    uchar t;
    SCL = 1;
    while((SDA==1)&&(t<250)) t++;
    SCL = 0;;
}

void softwareReset()//软复位
{
    uchar c;

    start();
    SDA = 1;
    for(c=0;c<9;c++)
    {
        SCL = 1;
        SCL = 0;
    }
    start();
    stop();
}

void writeByte(uchar byte)
{
    uchar c;
    
    for(c=0;c<8;c++)
    {
        byte <<= 1;//先将dat的MSB左移出到PSW的CY位
        SCL = 0;
        SDA = CY;  //将数据送给SDA
        SCL = 1;
    }
    SCL = 0;
    SDA = 1;//释放
}

uchar readByte()
{
    uchar byte,temp,c;
    
    SCL = 0;
    for(c=0;c<8;c++)
    {
        byte <<= 1;//先将byte的LSB清零,准备接收数据
        SCL = 1;
        temp = SDA;
        byte |= temp;        
        SCL = 0;
    }
    return byte;
}

//在某个E2PROM上的某个地址写一个字节数据;DeviceAdd的LSB为0,
//表示要发送数据,即DeviceAdd为1010xxx0
void writeData(uchar DeviceAdd, WordAdd, ByteData)
{
    start();             //先在SDA上给一个开始信号
    writeByte(DeviceAdd);//在SDA上给要写数据的E2PROM的地址,进行设备寻址
    respond();           //等待特定E2PROM的应答信号
    writeByte(WordAdd);  //给特定E2PROM送开始写数据的地址
    respond();           //等待特定E2PROM的应答信号
    writeByte(ByteData); //把数据写入E2PROM
    respond();           //等待特定E2PROM的应答信号
    stop();
}

//在某个E2PROM上的某个地址读一个字节数据;DeviceAdd的LSB为0,
//即DeviceAdd为1010xxx0
uchar readData(uchar DeviceAdd, WordAdd)
{
    uchar ReadAdd,dat;
    ReadAdd = DeviceAdd|0x01;//DeviceAdd的LSB改为1,表示要读数据
    
    //开始读数据动作
    start();             //先在SDA上给一个开始信号
    writeByte(DeviceAdd);//在SDA上给要读数据的E2PROM的地址,进行设备寻址
    respond();           //等待特定E2PROM的应答信号
    writeByte(WordAdd);  //给特定E2PROM送要读数据的地址
    respond();           //等待特定E2PROM的应答信号
    start();             //再先在SDA上给一个开始信号
    writeByte(ReadAdd);//再在SDA上给要读数据的E2PROM的地址,其LSB已改为1
    respond();           //等待特定E2PROM的应答信号
    dat = readByte();      //读数据
    stop();
    return dat;          //返回所读的数据
}

/*
//开始测试
void delay(uint time)
{
    uint i,j;
    for(i=time;i>0;i--)
        for(j=125;j>0;j--); //在11.0592的晶振下,延时大约1ms
}

void main()
{
    softwareReset();
    writeData(0xa0,1,0x99);//在1010000E2PROM的地址1上写入数据0x99
    delay(10);             //写入数据后延时>5ms,以便E2PROM将数据写入ROM
    P1 = readData(0xa0,1); //在1010000E2PROM的地址1上读出数据,并赋予P1口,驱动LED显示
    while(1);
}
//测试结束
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -