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

📄 24c02_eeprom读写.c

📁 EEPROM 24C02的STC89c52程序
💻 C
字号:
   
/*copyright 2007,ShangHai  HaoTun Electronic Technology co.,Ltd
 *
 *This sample is used for EEPROM 24C02 Read and Write.
 *
 *write by Shifang 2007-4-29
 *
 *V1.1
 */


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

 #define AddWr 0xae //Write Address
 #define AddRd 0xaf //Read Address

 //全局变量
 sbit Sda=P1^2;
 sbit Scl=P1^1;
 sbit WP=P3^3;//No connect here

 void mDelay(unsigned char j)//A normal delay
 {
  unsigned int i;
  for(;j>0;j--)
     {
	  for(i=0;i<125;i++)
	     {;}
	  }
  }

  //start IIC
  void Start(void)
  {
   Sda=1;
   _nop_();_nop_();
   Scl=1;
   _nop_();_nop_();_nop_();_nop_();_nop_();
   Sda=0;
   _nop_();_nop_();_nop_();_nop_();_nop_();
   Scl=0;
  }

  //stop IIC
  void Stop(void)
  {
   Sda=0;
   _nop_();
   Scl=1;
   _nop_();_nop_();_nop_();_nop_();_nop_();
   Sda=1;
   _nop_();_nop_();_nop_();_nop_();_nop_();
   Scl=0;
   _nop_();_nop_();
   Scl=1;

   }

   //ack IIC
   void Ack(void)
   {
    Sda=0;
	_nop_();_nop_();_nop_();
	Scl=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	Scl=0;
	_nop_();_nop_();
	}

	//unack IIC
	void NoAck(void)
	{
	 Sda=1;
	 _nop_();_nop_();_nop_();
	 Scl=1;
	 _nop_();_nop_();_nop_();_nop_();_nop_();
	 Scl=0;
	 _nop_();_nop_();
	 }

	 //send a byte
	 void Send(unsigned char Data)
	 { 
	  unsigned char BitCounter=8;
	  unsigned char temp;

	  do
	    {
		 temp=Data;
		 Scl=0;
		 _nop_();_nop_();_nop_();_nop_();_nop_();
		 if((temp&0x80)==0x80)
		    Sda=1;
		 else
		    Sda=0;


			Scl=1;
			temp=Data<<1;
			Data=temp;
			BitCounter--;
		  }
	  while(BitCounter);
	      Scl=0;
	  }

	  //read a byte and return
	  unsigned char Read(void)
	  {
	   unsigned char temp=0;
	   unsigned char temp1=0;
	   unsigned char BitCounter=8;

	   Sda=1;
	   do
	     {
		  Scl=0;
          _nop_();_nop_();_nop_();_nop_();_nop_();
		  Scl=1;
		  _nop_();_nop_();_nop_();_nop_();_nop_();
		  if(Sda)
		     temp=temp|0x01;
		  else
		     temp=temp&0xfe;

		  if(BitCounter-1)
		     {
			  temp1=temp<<1;
			  temp=temp1;
			  }
			  BitCounter--;
			 }
		while(BitCounter);
		return(temp);
	  }
   //write to ROM
	  void WrToROM(unsigned char Data[],unsigned char Address,unsigned char Num)
	  {
	   unsigned char i;
	   unsigned char *PData;
	   PData=Data;
	   for(i=0;i<Num;i++)
	      {
		   Start();
		   Send(AddWr);//Write Address
		   Ack();
		   Send(Address+i);//Write sub Address
		   Ack();
		   Send(*(PData+i));//Write Data
		   Ack();
		   Stop();
		   mDelay(20);
		   }
	   }
   //read from ROM
	  void RdFromROM(unsigned char Data[],unsigned char Address,unsigned char Num)
	  {
	   unsigned char i;
	   unsigned char *PData;
	   PData=Data;
       for(i=0;i<Num;i++)
	      {
		   Start();
		   Send(AddWr);//Write Address
		   Ack();
 		   Send(Address+i);//Write sub Address
		   Ack();
		   Start();
		   Send(AddRd);//Read Address
		   Ack();
		   *(PData+i)=Read();//Read Data
		   Scl=0;
		   NoAck();
		   Stop();
		   }
	  }

	void main()
	{
	 unsigned char Number[4]={1,2,4,8};
	 unsigned char i;
	 //WP=1;
	 //P2=0x20;
	 //P0=Number[1];
	 WrToROM(Number,4,4);//写入4个数据
	 mDelay(200);  
	 Number[0]=0;//将现有的数据清0
	 Number[1]=0;
	 Number[2]=0;
	 Number[3]=0;
	 RdFromROM(Number,4,4);//从存储器读出存入的数据
	 
	 while(1)
	      { 
	       P1=Number[i];//将这4个数据从P1口显示出来
		   mDelay(200);
		   i++;
		   if(i==4)
		      i=0;
		  }
	}

⌨️ 快捷键说明

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