i2c.c

来自「I2C读写程序,其中与AT24C01 02等芯片的读写.」· C语言 代码 · 共 154 行

C
154
字号
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
sbit Scl=P2^0;
sbit Sda=P2^1;
void Start(void)        /*起始条件*/
{
        Sda=1;
        Scl=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Sda=0;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
}
void Stop(void) /*停止条件*/
{
        Sda=0;
        Scl=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Sda=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
}
void Ack(void)  /*应答位*/
{
        Sda=0;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Scl=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Scl=0;
}
void  NoAck(void)       /*反向应答位*/
{
        Sda=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Scl=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Scl=0;
}
void Send(uchar Data)   /*发送数据子程序,Data为要求发送的数据*/
{
        uchar BitCounter=8;       /*位数控制*/
        uchar temp;     /*中间变量控制*/
        do
        {
           temp=Data;
           Scl=0;
           _nop_ ();
           _nop_ ();
           _nop_ ();
           _nop_ ();
           if((temp&0x80)==0x80)/* 如果最高位是1*/
                Sda=1;
           else
                Sda=0;
           Scl=1;
           temp=Data<<1;        /*RLC*/
           Data=temp;
           BitCounter--;
         }while(BitCounter);
         Scl=0;
}
uchar Read(void) /*读一个字节的数据,并返回该字节值*/
{
        uchar temp=0;
        uchar temp1=0;
        uchar BitCounter=8;
        Sda=1;
        do{
          Scl=0;
          _nop_ ();
          _nop_ ();
          _nop_ ();
          _nop_ ();
          Scl=1;
          _nop_ ();
          _nop_ ();
          _nop_ ();
          _nop_ ();
          if(Sda)       /*如果Sda=1;*/
                temp=temp|0x01;  /*temp的最低位置1*/
          else
                temp=temp&0xfe;  /*否则temp的最低位清0*/
          if(BitCounter-1)
          {   temp1=temp<<1;
              temp=temp1;
          }
          BitCounter--;
        }while(BitCounter);
        return(temp);
}
void WrToROM(uchar Data[],uchar Address,uchar Num)
{
     uchar i=0;
     uchar *PData;
     PData=Data;
     Start();        
     Send(0xa0);    
     Ack();
     Send(Address);  
     Ack();
     for(i=0;i<Num;i++)
     {
        Send(*(PData+i));
        Ack();
     }
     Stop();
}
void  RdFromROM(uchar Data[],uchar Address,uchar Num)
{
     uchar i=0;
     uchar *PData;
     PData=Data;
     for(i=0;i<Num;i++)
     {
        Start();
        Send(0xa0);
        Ack();
        Send(Address+i);
        Ack();
        Start();
        Send(0xa1);
        Ack();
        *(PData+i)=Read();
        Scl=0;
        NoAck();
        Stop();
   }
}


⌨️ 快捷键说明

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