seprom.c

来自「Atmel 24c04 eeprom 读写程序」· C语言 代码 · 共 185 行

C
185
字号
		/*************************************************************
		 *				Serial EEPROM READ & WRITE					 *
		 *************************************************************/

#define 	UINT        unsigned int
#define 	UCHAR		unsigned char
#include <W77E58.H>
#include <INTRINS.H>

	sbit SCLK   = P1^5;
	sbit SDAT   = P1^4;
	sbit ALOD   = P1^2;
	sbit ACLK   = P1^1;
	sbit ADAT   = P1^0;

#define		BSTART	   {SDAT=1;SCLK=1;awhile();\
						SDAT=0;awhile();\
						SCLK=0;}

#define		BSTOP	   {SDAT=0;awhile();\
						SCLK=1;awhile();\
						SDAT=1;}

#define		BOUT(B)	   {SDAT=B;awhile();\
						SCLK=1;awhile();\
						SCLK=0;awhile();}

#define		BIN(BUF)   {SDAT=1;awhile();\
						SCLK=1;awhile();\
						BUF|=SDAT;awhile();\
						SCLK=0;}

#define		ABOUT(B)   {ACLK=1;ADAT=B;awhile();\
						ACLK=0;awhile();}

extern  bit  EEWRDIS,EEBLANK; 

/****************************************************************************/
void awhile(void)
{
	_nop_();
	_nop_();
	_nop_();
}

/*****************************************************************************/
void ee_write(UINT xdata *dp,UINT addr,UCHAR n)
{
	UCHAR i;
	
	do{
		while(EEWRDIS);
		i=addr>>8;
		i=(i & 0x07)<<1;
		BSTART
		transmit(0xa0|i);
		transmit((UCHAR)addr);
		for(i=0;i<8;i++)
		{
			if(n){
				transmit(*dp);
				transmit(*dp>>8);
				dp++;n--;
			}
			else
				break;
		}
		BSTOP
		EEWRDIS=1;
		addr+=16;
	}while(n);
}

void ee_write_char(UCHAR *dp,UINT addr,UCHAR n)
{
	UCHAR i;
	
	do{
		while(EEWRDIS);
		i=addr>>8;
		i=(i & 0x07)<<1;
		BSTART
		transmit(0xa0|i);
		transmit((UCHAR)addr);
		for(i=0;i<16;i++)
		{
			if(n){
				transmit(*dp);
				dp++;n--;
			}
			else
				break;
		}
		BSTOP
		EEWRDIS=1;
		addr+=16;
	}while(n);
}

void protect(UINT xdata *dp,UINT addr)
{
	UCHAR i;
	
	while(EEWRDIS);
	i=addr>>8;
	i=(i & 0x07)<<1;
	BSTART
	transmit(0xa0|i);
	transmit((UCHAR)addr);
	for(i=0;i<8;i++)
	{
		transmit(*dp);
		transmit(*dp>>8);
		dp++;
	}
	BSTOP
}

UCHAR ee_read(UINT xdata *dp,UINT addr,UCHAR n)
{
	data UCHAR i;
	
	while(EEWRDIS);
	i=addr>>8;
	i=(i & 0x07)<<1;
	BSTART
	transmit(0xa0|i);
	transmit((UCHAR)addr);
	BSTART
	transmit(0xa1|i);
	for(i=0;i<n;i++)
	{
		*dp=receive(1);
		*dp|=receive(1)<<8;
		dp++;
	}
	receive(0);
	BSTOP
	return((UCHAR)*(dp-n) & (UCHAR)(*(dp-n)>>8));
}

UCHAR ee_read_char(UCHAR *dp,UINT addr,UCHAR n)
{
	UCHAR i;
	
	while(EEWRDIS);
	i=addr>>8;
	i=(i & 0x07)<<1;
	BSTART
	transmit(0xa0|i);
	transmit((UCHAR)addr);
	BSTART
	transmit(0xa1|i);
	for(i=0;i<n;i++)
	{
		*dp=receive(1);
		dp++;
	}
	receive(0);
	BSTOP
	return(*(dp-n));
}

/*************************************************************************/
void dac5620(UINT sd,UCHAR ch)
{
	data UCHAR i;
	
	ch<<=6;
	if(sd>>8){
		ch|=0x20;sd>>=1;}
	i=3;
	do{
		ch<<=1;ABOUT(CY)
	}while(--i);
	i=8;ch=sd;
	do{
		ch<<=1;ABOUT(CY)
	}while(--i);
	ALOD=0;
	awhile();
	ALOD=1;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?