⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at24c256.c

📁 包括ARM开发环境的使用和一些调试用的源程序
💻 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 + -