at2401.c

来自「AT2401的读写程序」· C语言 代码 · 共 153 行

C
153
字号
#include "AT89X51.h"
#include "type.h"

/**definethe  port***/
sbit	SCL=P0^4;
sbit	SDA=P0^3;
sbit	HAVE=P0^6;
sbit	DOG=P3^7;

/**define command*********/
#define	COMMAND_WRITE 0xa0
#define	COMMAND_READ  0xa1

/***************************************************************************/
static void  DelayMs(U16 u16Num) 
{
	U8 u8Tmp;
	for(;u16Num!=0;u16Num--,DOG=!DOG) 
	{
        for(u8Tmp=112;u8Tmp!=0;u8Tmp--) 
        {
        }
	}
}

/***************************************************************************/
static void Start() 
{
	SDA=1;
	SCL=1;
	SDA=0;
	SCL=0;
}

/***************************************************************************/
static void Stop() 
{
	SCL=0;
	SDA=0;
	SCL=1;
	SDA=1;
}

/***************************************************************************/
static void Ack() 
{
	SDA=0;
	SCL=1;
	SCL=0;
	SDA=1;
}

/***************************************************************************/
static void NoAck() 
{
	SDA=1;
	SCL=1;
	SCL=0;
}

/***************************************************************************/
static BIT TestAck() 
{
	BIT ErrorBit;
	SDA=1;
	SCL=1;
	ErrorBit=SDA;
	SCL=0;
	return(ErrorBit);
}

/***************************************************************************/
static BIT WriteByte(U8 u8Input) 
{
	U8 u8Tmp;
	for(u8Tmp=8;u8Tmp!=0;u8Tmp--) 
	{
		SDA=(BIT)(u8Input&0x80);
		SCL=1;
		SCL=0;
		u8Input=u8Input<<1;
	}
	return 0;
}

/***************************************************************************/
static U8 ReadByte() 
{
	U8 u8Tmp,u8Ret=0;
	for(u8Tmp=8;u8Tmp!=0;u8Tmp--) 
	{
		SCL=1;
		u8Ret=u8Ret<<1;
		u8Ret=u8Ret|((U8)(SDA));
		SCL=0;
	}
	return(u8Ret);
}

/***************************************************************************/
void CARD_WriteBlock(U8 *pu8Data,U8 u8Addr,U8 u8Num) 
{
	Start();
	WriteByte(COMMAND_WRITE);
	TestAck();
	WriteByte(u8Addr);
	TestAck();
	for(;u8Num!=0;u8Num--) 
	{
		WriteByte(*pu8Data);
		TestAck();
		pu8Data++;
	}
	Stop();
	DelayMs(10);
}

/***************************************************************************/
void CARD_ReadBlock(U8 *pu8Data,U8 u8Addr,U8 u8Num) 
{	
	Start();
	WriteByte(COMMAND_WRITE);
	TestAck();
	WriteByte(u8Addr);
	TestAck();
	Start();
	WriteByte(COMMAND_READ);
	TestAck();
	while(u8Num!=1) 
	{
	    *pu8Data=ReadByte();
	    Ack();
	    u8Addr++;
	    u8Num--;
	}
	*pu8Data=ReadByte();
	NoAck();
	Stop();
}

/***************************************************************************/
U8 CARD_HaveCard() 
{
	if(HAVE == 1)
	{
	    return 1;
	}
	else
	{
	    return 0;
	}
}

⌨️ 快捷键说明

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