/********************************************************************
汇诚科技
网址:http://www.ourhc.cn
产品有售淘宝店:http://shop36330473.taobao.com
*********************************************************************/
#include <reg52.H>
/****************************************************************************
24C08 读写驱动程序 开始
*****************************************************************************/
#include<reg52.h>
#include<string.h>
#include<intrins.h>
#define DELAY_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/
#define TRUE 1
#define FALSE 0
sbit SCL=P3^3;/*串行时钟*/
sbit SDA=P3^4;/*串行数据*/
char mybyte; /*单字节*/
char myarray[2];
sbit P2_0=P2^0;/*按键控制数据重载*/
/********** Function Definition 函数定义 ************/
void DELAY(unsigned int t) /*延时函数*/
{
while(t!=0)
t--;
}
void I2C_Start(void)
{
/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
SDA=1;
SCL=1;
DELAY(DELAY_TIME);
SDA=0;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
void I2C_Stop(void)
{
/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
SDA=0;
SCL=1;
DELAY(DELAY_TIME);
SDA=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
void SEND_0(void) /* SEND ACK */
{
/*发送0,在SCL为高电平时使SDA信号为低*/
SDA=0;
SCL=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
void SEND_1(void)
{
/*发送1,在SCL为高电平时使SDA信号为高*/
SDA=1;
SCL=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
bit Check_AcknowLEDge(void)
{
/*发送完一个字节后检验设备的应答信号*/
SDA=1;
SCL=1;
DELAY(DELAY_TIME/2);
F0=SDA;
DELAY(DELAY_TIME/2);
SCL=0;
DELAY(DELAY_TIME);
if(F0==1)
return FALSE;
return TRUE;
}
void WriteI2CByte(char b)reentrant
{
/*向I2C总线写一个字节*/
char i;
for(i=0;i<8;i++)
if((b<<i)&0x80)
SEND_1();
else
SEND_0();
}
char ReadI2CByte(void)reentrant
{
/*从I2C总线读一个字节*/
char b=0,i;
for(i=0;i<8;i++)
{
SDA=1; /*释放总线*/
SCL=1; /*接受数据*/
DELAY(10);
F0=SDA;
DELAY(10);
SCL=0;
if(F0==1)
{
b=b<<1;
b=b|0x01;
}
else
b=b<<1;
}
return b;
}
/**********以下为读写24c02的函数**********/
void Write_One_Byte(char addr,char thedata)
{
bit acktemp=1;
/*write a byte to mem*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_AcknowLEDge();
WriteI2CByte(addr);/*address*/
acktemp=Check_AcknowLEDge();
WriteI2CByte(thedata);/*thedata*/
acktemp=Check_AcknowLEDge();
I2C_Stop();
}
void Write_A_Page(char *buffer,char addr)
{
bit acktemp=1;
bit wrtmp;
int i;
/*write a page to at24c02*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_AcknowLEDge();
WriteI2CByte(addr);/*address*/
acktemp=Check_AcknowLEDge();
for(i=0;i<7;i++)
{
WriteI2CByte(buffer);
if(!Check_AcknowLEDge())
{
I2C_Stop();
}
}
I2C_Stop();
}
char Read_One_Byte(char addr)
{ bit acktemp=1;
char mydata;
/*read a byte from mem*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_AcknowLEDge();
WriteI2CByte(addr);/*address*/
acktemp=Check_AcknowLEDge();
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_AcknowLEDge();
mydata=ReadI2CByte();
acktemp=Check_AcknowLEDge();
return mydata;
I2C_Stop();
}
void Read_N_Bytes(char *buffer,char n,char addr)
{
bit acktemp=1;
int i=0;
/*read 8 bytes from mem*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_AcknowLEDge();
WriteI2CByte(addr);/*address*/
acktemp=Check_AcknowLEDge();
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_AcknowLEDge();
for(i=0;i<n;i++)
{
buffer=ReadI2CByte();
if(i!=n-1)
SEND_0(); /*发送应答*/
else
SEND_1(); /*发送非应答*/
}
I2C_Stop();
}
/*************延时函数*************/
void delay02s(void) //延时0.2秒子程序
{
unsigned char i,j,k;
for(i=200;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
/*********************************
主函数
*********************************/
void main()
{
int i;
char rdarray[8];
/*********************************
读出写入的数据值
*********************************/
for(i=0;i<8;i++)
{
Read_N_Bytes(rdarray,8,0x10); //*读出数据*
P0= rdarray[2]; //*显示读出数据*
delay02s(); //*延时函数*
}
/**********结束******************/
/*********************************
写入8个数据值
*********************************/
/* for(i=0;i<8;i++)
{
rdarray=i; //*产生数据*
Write_A_Page(rdarray,0x10); //*写入数据*
P0= rdarray; //*显示数据*
delay02s(); //*延时函数*
}
/**********结束******************/
}
|