📄 24c04.c
字号:
#include<reg52.h>
#include<intrins.h>
#define ucahr unsigned char
#define uint unsigned int
sbit SDA=P3^7;
sbit SCL=P3^6;
#define SomeNOP(); { _nop_(); }
delay32()
{
unsigned int i=300;
while(i--);
}
/*--------------------------------------------------------------------------------
调用方式:void I2CStart(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
EA=0;
SDA=1; SCL=1; SomeNOP();//INI
SDA=0; SomeNOP(); //START
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void I2CStop(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
SCL=0; SDA=0; SomeNOP(); //INI
SCL=1; SomeNOP(); SDA=1; //STOP
EA=1;
}
/*--------------------------------------------------------------------------------
调用方式:I2CAck(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用,等待从器件接收方的应答
---------------------------------------------------------------------------------*/
WaitAck(void)
{
bit Errorbit;
SDA=1;
SCL=1;
Errorbit=SDA;
SCL=0;
return(Errorbit);
}
/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
---------------------------------------------------------------------------------*/
void SendNotAck(void)
{
SDA=1; SomeNOP();
SCL=1; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void I2CSend(unsigned char ch) ﹫2001/07/0 5
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CSendByte(unsigned char ch)
{
unsigned char i=8;
while(i--)
{
SCL=0;_nop_();
SDA=(bit)(ch&0x80); ch<<=1; SomeNOP();
SCL=1; SomeNOP();
}
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:unsigned char I2CReceive(void) ﹫2001/07/0 5
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
unsigned char I2CReceiveByte(void)
{
unsigned char i=8;
unsigned char dat=0;
SDA=1;
while(i--)
{
dat<<=1;
SCL=0;SomeNOP();
SCL=1;SomeNOP();
dat|=SDA;
}
SCL=0;
return(dat);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*-------------------------------------------------------------------------------------*/
/* 向AT24C02的任意地址写入一个字节 */
/*=====================================================================================*/
void Write_24c04( unsigned char add,unsigned char dat)
{
I2CStart();
I2CSendByte(0xA0);
WaitAck();
// I2CSendByte((char)(add>>8));delay32(); //如果使用的芯片是AT24C02、AT24C64、AT24C128、AT24C256的话 那么这句话就不需要屏蔽了
// WaitAck();
I2CSendByte(add);delay32();
WaitAck();
I2CSendByte(dat);delay32();
WaitAck();
I2CStop();
}
/*-------------------------------------------------------------------------------------*/
/* 从AT24C02的任意地址读入一个字节 */
/*=====================================================================================*/
unsigned char Read_24C04(unsigned char add)
{
unsigned char a;
I2CStart();
I2CSendByte(0xA0);
WaitAck();
//I2CSendByte((char)(add>>8)); //如果使用的芯片是AT24C02、AT24C64、AT24C128、AT24C256的话 那么这句话就不需要屏蔽了
//WaitAck();
I2CSendByte(add);
WaitAck();
I2CStart();
I2CSendByte(0xA1);
WaitAck();
a=I2CReceiveByte();
SendNotAck();
I2CStop();
return(a);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -