📄 24cxx.h
字号:
#define W24C02 0xA0 //存储器的写地址
#define R24C02 0xA1 //存储器的读地址
#define MSB 0x80 //8位二进制最高位置1
#define LSB 0x01 //8位二进制最低位置1
/********************/
sbit SDA=P3^6; //AT24C02串行数据 5脚
sbit SCL=P3^7; //AT24C02串行时钟 6脚
void I2C_write(unsigned char tmp); //向I2C总线写数据
unsigned char I2C_read(); //向I2C总线读数据
void I2C_ACK(bit tmp); //ACK应答
void I2C_start(void); //I2C传送数据的开始
void I2C_stop(void); //I2C传送数据的结束
void DelayQuarter()
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}
static void AssertClock(void)
{
DelayQuarter();
SCL=1;
while (!(SCL!=0)) {
/* Wait if a slave is stretching the clock (holding it low). */
}
DelayQuarter();
}
void I2C_write(unsigned char tmp)//I2C写入一个8位二进制数,高位在前低位在后
{
unsigned char i;
for(i=0;i<8;i++){
SCL=0;
_nop_();
_nop_();
_nop_();
SDA=(bit)(tmp&0x80);
tmp<<=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
SCL=0;
}
unsigned char I2C_read(void)////I2C读取一个8位二进制数,也是高位在前低位在后
{
unsigned char i,tmp;
tmp=0;
for(i=0;i<8;i++){
SCL=0;
_nop_();
_nop_();
_nop_(); //加入空指令增加稳定性,这关系到频率问题
SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
tmp<<=1;
if(SDA==1)
tmp++;
}
SCL=0;
return tmp;
}
void I2C_ACK(bit tmp) //根据tmp的1、0来决定应答信号
{
SDA=tmp;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
}
void I2C_start(void) //看看I2C开始的波形,再对应SDA、SCL的输出
{
SDA=1;
_nop_();
SCL=1;
_nop_();
SDA=0;
_nop_();
SCL=0;
_nop_();
}
/*********/
void I2C_stop(void) //I2C结束
{
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=1;
_nop_();
SCL=0;
_nop_();
}
void Page_write(unsigned char add,unsigned char len,unsigned char *buf)
{
unsigned char i;
I2C_start();
I2C_write(W24C02);
I2C_ACK(0);
I2C_write(add);
I2C_ACK(0);
for(i=0;i<len;i++)
{
I2C_write(buf[i]);
if(i==len-1)
I2C_ACK(0);
else
I2C_ACK(0);
}
I2C_stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -