e2p.h

来自「基于c51单片机的e2p rom的读写子程序」· C头文件 代码 · 共 196 行

H
196
字号
#ifndef __e2p_H__
#define __e2p_H__

sbit SDA=P1^2;
sbit SCL=P1^1;
sbit WP=P1^6;
bit Y=1;


/********************启动总线****************************/
void IICStart(void)
{
    SCL=0;
	SDA=1;
	SCL=1;
	Y=Y;
	Y=Y;
	Y=Y;
	Y=Y;
	SDA=0;
	Y=Y;
	Y=Y;
	Y=Y;
	Y=Y;
	SCL=0;
	SDA=1;
}
/***********************停止总线*****************************/
void IICStop(void)
{
    SCL=0;
	SDA=0;
	SCL=1;
	Y=Y;
	Y=Y;
	Y=Y;
	Y=Y;
	SDA=1;
	Y=Y;
	Y=Y;
	Y=Y;
	Y=Y;
	SCL=0;
}
/***************************检查应答位************************************/
bit IICRecAck(void)
{
    SCL=0;
	SDA=1;
	SCL=1;
	Y=Y;
	Y=Y;
	Y=Y;
	Y=Y;
	Y=SDA;
	SCL=0;
	return(Y);
}
/********************************对I2C产生应答************************************/
/*
void IICACK(void)
{
    SDA=0;
	SCL=1;
	Y=Y;
	Y=Y;
	Y=Y;
	Y=Y;
	SCL=0;
	Y=Y;
	Y=Y;

	SDA=1;
} */
/*********************************不对I2C产生应答***********************************************/

void IICNoAcK(void)
{
    SDA=1;
	SCL=1;
	Y=Y;
	Y=Y;
	Y=Y;
	Y=Y;
	SCL=0;
}

/******************************向I2C写数据**************************************/
void IICSendByte(unsigned char sendbyte)
{	 unsigned char data j;
	for(j=8;j>0;j--)
	{
	    SCL=0;
		if(sendbyte&0x80)
		   SDA=1;
		  else  SDA=0; 
		  sendbyte<<=1;
		SCL=1;
		_nop_();

		
	}
	SCL=0;
}
/*********************************从I2C读数据**************************************/
unsigned char IICReceiveByte(void)
{
    register receivebyte,i=8;
	SCL=0;
	while(i--)
	{
	   SCL=1;
	   receivebyte=(receivebyte<<1)|SDA;
	   SCL=0;
	   _nop_();
	}
	return(receivebyte);
}



void write_e2p(unsigned char adh,unsigned char adl,unsigned char dda)
{
      unsigned char flag=1;
      cs=1;
      WP=0;
	  while(flag)
	  {
	   IICStart();
       _nop_();
	   IICSendByte(0Xa0);
		 _nop_();
	   if(IICRecAck())continue;
       IICSendByte(adh);
	   _nop_();
       if(IICRecAck())continue;
        
		IICSendByte(adl);
		_nop_();
	    if(IICRecAck())continue;
		 
		IICSendByte(dda);
		_nop_();
		if(IICRecAck())continue;
		_nop_();
		IICStop();
		  _nop_();
		  _nop_();
		  flag=0;
		}
		cs=0;
		WP=1;
}

unsigned char read_e2p(unsigned char adh,unsigned char adl)
{
	   unsigned char m;
	   cs=1;
    while(1)
	{
       	IICStart();
	_nop_();
    IICSendByte(0Xa0);
//	_nop_();

	if(IICRecAck())continue;
	
	IICSendByte(adh);
	_nop_();
    if(IICRecAck())continue;
         _nop_();
		IICSendByte(adl);
		_nop_();
		 if(IICRecAck())continue;
		   _nop_();
		 IICStart();
	_nop_();
	 IICSendByte(0Xa1);
	_nop_();
	if(IICRecAck())continue;
		 	_nop_();    		
		 m=IICReceiveByte();
		 _nop_();
		 IICNoAcK();
   	//if(IICRecAck())continue;
	   _nop_();
	     IICStop();
		 _nop_();
		 return m;
      }
	  cs=0;

}


#endif

⌨️ 快捷键说明

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