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 + -
显示快捷键?