📄 at24c256.c
字号:
#include "reg52.h"
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit WP= P3^5;
sbit SDA=P3^7;
sbit SCL=P3^6;
bit ACK;
void STOP_I2C();
void START_I2C();
void SENDBYTE(uchar c);
uchar RCVBYTE();
void ACK_I2C(bit A);
/*+++++++++++++++++++++++++
写数据到256中(SUB);
+++++++++++++++++++++++++*/
bit WRITE_256_SUB(uchar ADDR_CS,uchar ADDR_HI,uchar ADDR_LO,unsigned char *SP,unsigned int NO)
{
uchar idata I;
WP=0;
START_I2C();
SENDBYTE(ADDR_CS);
if(ACK==0){WP=1;return(0);}
SENDBYTE(ADDR_HI);
if(ACK==0){WP=1;return(0);}
SENDBYTE(ADDR_LO);
if(ACK==0){WP=1;return(0);}
for(I=0;I<NO;I++)
{
SENDBYTE(*SP);
if(ACK==0){WP=1;return(0);}
SP++;
}
STOP_I2C();
WP=1;
return(1);
}
/*++++++++++++++++++++++++++
从256中读数据(SUB);
++++++++++++++++++++++++++*/
bit READ_256_SUB(uchar ADDR_CS,uchar ADDR_HI,uchar ADDR_LO,unsigned char *SP,unsigned int NO)
{
uchar idata I;
START_I2C();
SENDBYTE(ADDR_CS);
if(ACK==0){return(0);}
SENDBYTE(ADDR_HI);
if(ACK==0){return(0);}
SENDBYTE(ADDR_LO);
if(ACK==0){return(0);}
START_I2C();
SENDBYTE(ADDR_CS+1);
if(ACK==0){return(0);}
for(I=0;I<(NO-1);I++)
{
*SP=RCVBYTE();
ACK_I2C(0);
SP++;
}
*SP=RCVBYTE();
ACK_I2C(1);
STOP_I2C();
return(1);
}
/*++++++++++++++++
空指令;
+++++++++++++++++*/
void _NOP(void)
{
_nop_();
}
/*++++++++++++++++
发送开始信号;
++++++++++++++*/
void START_I2C()
{
SDA=1;
_NOP();
SCL=1;
_NOP();
SDA=0;
_NOP();
SCL=0;
_NOP();
}
/*+++++++++++++
发送停止信号;
++++++++++++*/
void STOP_I2C()
{
SDA=0;
_NOP();
SCL=1;
_NOP();
SDA=1;
_NOP();
}
/*+++++++++++++
发送字节;
++++++++++++++*/
void SENDBYTE(uchar c)
{
uchar idata bitcnt;
for(bitcnt=0;bitcnt<8;bitcnt++)
{
if((c<<bitcnt)&0x80)SDA=1;
else SDA=0;
_NOP();
SCL=1;
_NOP();
SCL=0;
}
_NOP();
SDA=1;
_NOP();
SCL=1;
_NOP();
if (SDA==1)ACK=0;
else ACK=1;
SCL=0;
_NOP();
}
/*+++++++++++++++++
接收字节;
++++++++++++*/
uchar RCVBYTE()
{
uchar idata RETC;
uchar idata bitcnt;
RETC=0;
SDA=1;
for(bitcnt=0;bitcnt<8;bitcnt++)
{
_NOP();
SCL=0;
_NOP();
SCL=1;
_NOP();
RETC=RETC<<1;
if(SDA==1)RETC=RETC+1;
_NOP();
}
SCL=0;
_NOP();
return(RETC);
}
/*+++++++++++++++++
应答信号;
++++++++++++++*/
void ACK_I2C(bit A)
{
if (A==0) SDA=0;
else SDA=1;
_NOP();
SCL=1;
_NOP();
SCL=0;
_NOP();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -