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

📄 24c04.c

📁 应用电子密码锁
💻 C
字号:
#include "intrins.h"
#include "reg51.h"

#define  WriteDeviceAddress 0xa0	//写驱动地址指令
#define  ReadDeviceAddress 0xa1		//读驱动地址指令

sbit AT24C02_SCL = 0xB6;
sbit AT24C02_SDA = 0xB7;

/*-------------------------------------------------
功能100uS延时子程序
-------------------------------------------------*/
void Delay_xuS(unsigned int x)
{
    unsigned int i,j;
    for( i =0;i < x;i++ )
    {
        for( j =0;j<50;j++ );
    }
}

/*-------------------------------------------------
功能:1MS延时子程序
-------------------------------------------------*/
void Delay_xMs(unsigned int x)
{   
    unsigned int i,j;
    for( i =0;i < x;i++ )
    {
        for( j =0;j<100;j++ );
    }
}



/*-------------------------------------------------------------
功能:发起始信号
------------------------------------------------------------*/
void Start_Cond()
{
	AT24C02_SCL = 0;
    _nop_();
	AT24C02_SDA = 1;
    _nop_();
	AT24C02_SCL = 1;
    _nop_();
	AT24C02_SDA = 0;
	_nop_();
}

/*-------------------------------------------------------------
功能:发停止信号
------------------------------------------------------------*/
void Stop_Cond()
{
	AT24C02_SCL = 0;
	_nop_();
	AT24C02_SDA = 0;
	_nop_();
	AT24C02_SCL = 1;
	_nop_();
	AT24C02_SDA = 1;
	_nop_();
}

/*-------------------------------------------------------------
功能:发确认信号
------------------------------------------------------------*/
void Ack()
{
	AT24C02_SCL = 0;
	_nop_();
	AT24C02_SDA = 0;
	AT24C02_SCL = 1;
	_nop_();
	AT24C02_SCL = 0;
	_nop_();
	AT24C02_SDA = 1;
}

/*-------------------------------------------------------------
功能:发无确认信号
------------------------------------------------------------*/
void NoAck()
{
	AT24C02_SCL = 0;
	_nop_();
	AT24C02_SDA = 1;
	_nop_();
	AT24C02_SCL = 1;
	_nop_();
	AT24C02_SCL = 0;
	_nop_();
}

/*-------------------------------------------------------------
功能:写一个字节数据
------------------------------------------------------------*/
bit Write8Bit(unsigned char input)
{
	unsigned char i;
	for (i=0;i<8;i++)
	{	
		AT24C02_SCL = 0;
		input <<= 1;
		AT24C02_SDA = CY;
		AT24C02_SCL = 1;
	
	}
	AT24C02_SCL = 0;
    _nop_();
	AT24C02_SDA = 1;
	AT24C02_SCL = 1;
    _nop_();
	CY = AT24C02_SDA;
	return(CY) ;
}

/*-------------------------------------------------------------
功能:读一个字节数据
------------------------------------------------------------*/
unsigned char Read8Bit()
 {
	unsigned char temp,rbyte=0;
	for (temp = 8;temp != 0;temp--)
	{
		AT24C02_SCL = 0;
		_nop_();
		rbyte = (rbyte << 1) | AT24C02_SDA;
		AT24C02_SCL = 1;
        _nop_();
	}
	return rbyte;
}

/*-------------------------------------------------------------
功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针
nContent开头的往下内容。
------------------------------------------------------------*/
bit Read_Flash ( unsigned char *nContent, unsigned char nAddr, unsigned char nLen )
{
	unsigned char Addr;
	Addr = nAddr;
	Start_Cond();				//写开始信号
	Write8Bit(WriteDeviceAddress);		//写驱动地址
	Write8Bit(Addr);			//写从EEPROM中读的开始地址
        Start_Cond();				//写开始信号
        Write8Bit(ReadDeviceAddress);		//写读数据指令
	while(--nLen)
	{

		*nContent=Read8Bit();		//读出内容
		nContent++;			//指针加1
		Ack();				//发确认信号
	}
	*nContent=Read8Bit();			//读一字节
 	NoAck();				//没有确认信号
	Stop_Cond();				//发停止信号
	return(0);				//返回
}

/*-------------------------------------------------------------
功能:初始化EEPROM子程序内容为FF
------------------------------------------------------------*/
bit Init_Flash ( unsigned int nPage ) //    8 Byte/1Page init 0xFF 
{
	unsigned char nLen;
	unsigned char Addr;
	nLen=8;
    Addr=8 *nPage;
	Start_Cond();
    Write8Bit(WriteDeviceAddress);
	Write8Bit(Addr);
	for(;nLen!=0;nLen--)
    {
	       if(Write8Bit(0xff)) break;  //if Write8Bit() Return 1 Write Flase
	}
	Stop_Cond();
    return(CY);
}

/*-------------------------------------------------------------
功能:从EEPROM中给定一个地址连续写NLEN个字节数据存放在以指针
nContent开头的往下内容。
------------------------------------------------------------*/
bit Write_Flash ( unsigned char *nContent, unsigned char nAddr,unsigned char nLen)
{
	unsigned char i,temp;
	unsigned char Addr;
	Addr = nAddr;
	Start_Cond();					//写开始信号
 	Write8Bit(WriteDeviceAddress);			//写驱动地址
	Write8Bit(Addr);				//写从EEPROM中写的开始地址	
	for(i = 0;i < nLen;i++)
	{
		if(Addr%8==0)   //每页8字节		//换页
		{
			Stop_Cond();
            _nop_();
			Start_Cond();
			Write8Bit(WriteDeviceAddress);
			Write8Bit(Addr);
		}
		temp = *nContent;
		if(Write8Bit(temp)) break;  //CY
		nContent++;
                Addr++;
	}
	Stop_Cond();					//发停止信号
	return(CY);
}

⌨️ 快捷键说明

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