原创 24c02 读写程序

2010-7-13 22:42 2045 7 7 分类: MCU/ 嵌入式

 #include<reg52.h>
 #include<stdio.h>
 #include<absacc.h>
 #include<intrins.h>


 //*********************************
  #define TURE 1
 #define FALSE 0
 #define uchar unsigned char
 #define uint  unsigned int
 //*********************************
 sbit I2c_scl = P1^0;
 sbit I2c_sda = P1^1;
 //********************************
 uchar e24c02_date[]={0x00,0x01,0x02,0x03};
 uchar c2402_buffer[100];
 //**********************************
 void delay();
 void Creat_ack();
 void Creat_noack();
 bit Check_ack();
 void I2c_ini();
 void I2c_stop();
 void I2c_start();
 void I2c_writeB(uchar date);
 void I2c_write_one_byte(uchar addr,uchar thedate);
 void I2c_write_one_page(uchar addr,uchar *thedate,uchar m);
 uchar I2c_readB();
 uchar I2c_read_24c02(uchar I2c_addr,uchar I2c_reg_addr);
 void  I2c_read_one_byte(uchar *buffer,uchar I2c_reg_addr,uchar i);



  void main()
 {
  I2c_ini();
  I2c_write_one_byte(0X00,0XCC);
  delay();
  I2c_write_one_page(0x10,e24c02_date,4);
  delay();
  P2=I2c_read_24c02(0Xa0,0x00);
  delay();
  I2c_read_one_byte(c2402_buffer,0x10,5);
  while(1)
  {
   ;
  } 
 }
 //**********************************
 void delay()
 {
  uchar i="0";
  while(i<255)
  {
   _nop_();
   i++;
  }
 }
 //**********************************


  void I2c_ini()
  {
   I2c_scl=1;
 I2c_sda=1;
  }
  //******************
  void I2c_stop()
  {
   I2c_scl=0;
 I2c_sda=0;
 _nop_();
 I2c_scl=1;
 _nop_();
 I2c_sda=1;
 _nop_();
  }
  //***********************************
  void I2c_start()
  {
 I2c_sda=1;
 I2c_scl=1;
 _nop_();
 I2c_sda=0;
 _nop_();
 _nop_();
 I2c_scl=0;
  }
  //**************************************
   void I2c_writeB(uchar date)
   {
     uchar temp, i;
  temp="date";
  for(i=0;i<8;i++)
  {
   temp=temp<<1;
  I2c_scl=0;
  _nop_();
  I2c_sda=CY;
  _nop_();
  I2c_scl=1;
  _nop_(); 
  }
  I2c_scl=0;
  _nop_();
  I2c_sda=1;
  _nop_();
  I2c_scl=1;
  _nop_();
   }
   //*************************************************************
    void Creat_noack()
 {
  I2c_scl=0;
  I2c_sda=1;
  _nop_();
  _nop_();
  I2c_scl=1;
  _nop_();
 }
    //*************************************************************
    void Creat_ack()
 {
  I2c_scl=0;
  I2c_sda=0;
  _nop_();
  _nop_();
  I2c_scl=1;
  _nop_();
 }
   //**********************I2C ACK CHECK***************************
    bit Check_ack()
 {
  uchar i="0";
  while(i<255)
  {
   if(I2c_sda==0)
   {
    i=255;
   }
   else i++;
  }
  I2c_scl=0;
  return (~I2c_sda);



 }
 //******************write one byte*******************************
  void I2c_write_one_byte(uchar addr,uchar thedate)
  {
 
  I2c_start();
  I2c_writeB(0xa0);
  Check_ack();
  I2c_writeB(addr);
  Check_ack();
  I2c_writeB(thedate);
  Check_ack();
  I2c_stop();
  }
  //********************write a page***************************
  void I2c_write_one_page(uchar addr,uchar *thedate,uchar m)
  {
   uchar i;
 // bit ack_temp;
  I2c_start();
  I2c_writeB(0xa0);
  Check_ack();
  I2c_writeB(addr);
  Check_ack();
  for(i=0;i<m;i++)
  {
     I2c_writeB(thedate);
    if(!Check_ack())
    {
     I2c_stop();
    }
  }


  I2c_stop();
  }
   //*******************************************************************
    uchar I2c_readB()
 {
  uchar temp,i,j;
  for(i=0;i<8;i++)
  {
   I2c_scl=0;
   I2c_sda=1;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   I2c_scl=1;
   _nop_();
   if(I2c_sda==1) j=1;
   else j="0";
   temp=(temp<<1)|j;
  }
   
  return (temp);
 }


   //************************************************
    uchar I2c_read_24c02(uchar I2c_addr,uchar I2c_reg_addr)
 {
  uchar i;
  I2c_start();
  I2c_writeB(I2c_addr);
  Check_ack();
  I2c_writeB(I2c_reg_addr);
  Check_ack();
  I2c_start();
  I2c_writeB(I2c_addr|0x01);
  Check_ack();
  i=I2c_readB();
  Creat_noack();
  I2c_stop();
  return i;
 }
    //************************************************
    void  I2c_read_one_byte(uchar *buffer,uchar I2c_reg_addr,uchar i)
 {
  uchar j;
  I2c_start();
  I2c_writeB(0xa0);
  Check_ack();
  I2c_writeB(I2c_reg_addr);
  Check_ack();
  I2c_start();
  I2c_writeB(0xa1);
  Check_ack();
  for(j=0;j<i;j++)
  {
   buffer[j]=I2c_readB();
   if(j<i-1)
   {
    Creat_ack();
   }
   else
   {
    Creat_noack();
   }
  
  }
  I2c_stop();
 }

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条