#include "STC12C5A60S2.h"
#include <intrins.h>
#include "EEPROM.h"
void WriteOneByte(uchar dat); //写入一字节.
uchar ReadOneByte(void); //读出一字节.
void Start(void); //起始信号.
void Stop(void); //停止信号.
void RdAck(bit k); //读取回复确认信号. k=0, 表示回复一个确认信号, k=1, 不回复.
void delay1ms(uchar t);
extern void delay1us(uchar t); //延迟t us.
/*********************************************************************
* 函 数 名: Start, Stop
* 功能描述: 数据通信起始和截止函数.
* 函数说明:
**********************************************************************/
void Start(void)
{
SCL=0;
_nop_(); //等待低电平建立.
_nop_();
SDA=1;
SCL=1;
_nop_(); //等待SCL上升.
_nop_();
SDA=0;
delay1us(3); //起始信号保持.
}
void Stop(void)
{
SCL=0;
_nop_();
_nop_();
SDA=0;
SCL=1;
_nop_();
_nop_();
SDA=1;
delay1us(4);
}
/*********************************************************************
* 函 数 名: void WriteOneByte(uchar dat);
* 功能描述: 写入一个字节.
* 函数说明: 先放数据, 然后再把SCL拉高. 写入顺序从高位到低位.
写入一个字节的数据之后, 忽略ack的监测.
**********************************************************************/
void WriteOneByte(uchar dat)
{
uchar j;
for(j=0;j<8;j++)
{
SCL=0;
_nop_(); //等待电平建立.
_nop_();
SDA=0x80&dat;
delay1us(1);
SCL=1;
dat<<=1;
delay1us(2);
}
SCL=0;
_nop_();
_nop_();
SDA=1;
delay1us(1);
SCL=1;
delay1us(2); //直接延时跳过ack信号检测. 直接进入下一个发送.
}
/*********************************************************************
* 函 数 名: uchar ReadOneByte(void);
* 功能描述: 接收一个字节的数据.
* 函数说明:
**********************************************************************/
uchar ReadOneByte(void)
{
uchar j, tmp=0x00;
for(j=0;j<8;j++)
{
SCL=0;
delay1us(2);
SCL=1;
_nop_();
_nop_();
if(SDA)
tmp|=(0x80>>j);
delay1us(2);
}
return(tmp);
}
/*********************************************************************
* 函 数 名: void RdAck(bit k)
* 功能描述: 读取确认回复.
* 函数说明:
**********************************************************************/
void RdAck(bit k)
{
SCL=0;
_nop_();
_nop_();
SDA=k;
delay1us(1);
SCL=1;
delay1us(2);
SCL=0;
_nop_();
SDA=1;
}
/*********************************************************************
* 函 数 名: void WrE2prom(uchar addrh, uchar addrl, uchar wdata)
* 功能描述: 向地址addrh, addrl写入wdata数据.
* 函数说明:
**********************************************************************/
void WrE2prom(uint addr, uchar wdata)
{
uchar addrh, addrl;
addrh=addr/256;
addrl=addr%256;
Start();
WriteOneByte(0xa0);
WriteOneByte(addrh);
WriteOneByte(addrl);
WriteOneByte(wdata);
Stop();
delay1ms(100);
}
/*********************************************************************
* 函 数 名: void PageWrE2prom(uchar addrh, uchar addrl, uchar datanum, uchar *dat)
* 功能描述: 页写. 数据个数. 数据数组.
* 函数说明:
**********************************************************************/
void PageWrE2prom(uint addr, uchar datanum, uchar *dat)
{
uchar j,addrh,addrl;
addrh=addr/256;
addrl=addr%256;
Start();
WriteOneByte(0xa0);
WriteOneByte(addrh);
WriteOneByte(addrl);
for(j=0;j<datanum;j++)
{
WriteOneByte(dat[j]);
}
Stop();
delay1ms(100);
}
/*********************************************************************
* 函 数 名: uchar RdE2prom(uchar addrh, uchar addrl)
* 功能描述: 读某个地址数据.
* 函数说明:
**********************************************************************/
uchar RdE2prom(uint addr)
{
uchar temp, addrh, addrl;
addrh=addr/256;
addrl=addr%256;
Start();
WriteOneByte(0xa0);
WriteOneByte(addrh);
WriteOneByte(addrl);
Start();
WriteOneByte(0xa1);
temp=ReadOneByte();
RdAck(1);
Stop();
// delay1ms(100);
return(temp);
}
/*********************************************************************
* 函 数 名: void PageRdE2prom(uchar addrh, uchar addrl, uchar datanum, uchar *dat)
* 功能描述: 页读.
* 函数说明:
**********************************************************************/
void PageRdE2prom(uint addr, uchar datanum, uchar *dat)
{
uchar j, addrh, addrl;
addrh=addr/256;
addrl=addr%256;
Start();
WriteOneByte(0xa0);
WriteOneByte(addrh);
WriteOneByte(addrl);
Start();
WriteOneByte(0xa1);
for(j=0;j<datanum;j++)
{
*dat=ReadOneByte();
dat++;
if(j==datanum-1)
RdAck(1);
else
RdAck(0);
}
Stop();
// delay1ms(100);
}
/*********************************************************************
* 函 数 名: void delay1ms(uchar t)
* 功能描述: 延时1ms.
* 函数说明:
**********************************************************************/
void delay1ms(uchar t)
{
uchar j;
while(t)
{
for(j=0;j<100;j++)
{;}
t-- ;
}
}
/*********************************************************************
* 函 数 名:
* 功能描述:
* 函数说明:
**********************************************************************/