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

📄 eeprom_24c02.c

📁 用KEIL开发的出租车计费系统
💻 C
字号:
/**************************************************************************
  
                   		24c02 Serial EEPROM
  
   File Name:       EEPROM_24c02.c
   Author:          Lin Qian
   Created:         2008/04/24
   Modified:		NO
   Revision: 		1.0
  
***************************************************************************/
#define __EEPROM_24C02
#include "INC\\main.h"
#undef __EEPROM_24C02


#if EEPROM_24c02_Internal_Func_en
//********** 内部函数声明 **********
void hold_24c02();
void start_24c02();
void stop_24c02();
void WriteOneByte(uchar j);
uchar ReadOneByte();
void clock_24c02();
//******************************

// 电平维持 ******************************
void hold_24c02()
{
	_nop_();
}

// 起始命令时序 ******************************
void start_24c02()
{
	SDA = 1;	hold_24c02();
	SCL = 1;	hold_24c02();
	SDA = 0;	hold_24c02();
	SCL = 0;	hold_24c02();
}

// 停止命令时序 ******************************
void stop_24c02()
{
	SDA = 0;	hold_24c02();
	SCL = 1;	hold_24c02();
	SDA = 1;	hold_24c02();
}

// 写单字节 ******************************
void WriteOneByte(uchar info)
// info: 需要写入的字节.
{
	uchar i;

	for( i=0; i<8; i++ )
	{
		info = info << 1;
		SCL = 0;	hold_24c02();
		SDA = CY;	hold_24c02();		// 从进位从进位取出当前写入位
		SCL = 1;	hold_24c02();
	}
	SCL = 0;	hold_24c02();
	SDA = 1;	hold_24c02();
}

// 读单字节 ******************************
uchar ReadOneByte(void)
// 返回: 读出的字节.
{
	uchar i, tmp, info;

	SCL = 0; hold_24c02();
	SDA = 1;

	for( i=0, info=0; i<8; i++ )
	{
		hold_24c02();
		SCL = 1;	hold_24c02();
		if( SDA == 1 )
			tmp = 1;
		else
			tmp = 0;
		info = (info << 1) | tmp;
		SCL = 0;
	}
	hold_24c02();

	return info;
}

// 时钟时序 ******************************
void clock_24c02()
{
	uchar i=0;

	SCL = 1;	hold_24c02();
	while( (SDA == 1) && (i < 255) )
		i++;
	SCL = 0;	hold_24c02();
}
#endif

// 24c02初始化 ******************************
#if x24c02_Init_en
void x24c02_Init()
{
	SCL = 1;	hold_24c02();
	SDA = 1;	hold_24c02();
}
#endif

// 读24c02 ******************************
#if x24c02_Read_en
uchar x24c02_Read(uchar ChipAddr, uchar addr)
// 功能: 向24c02写入一字节数据.
// ChipAddr: 器件片选地址. 由引脚A0~A2确定.
// addr: 24c02内部寻址地址.
// 返回: 读出的字节.
{
	uchar info;
//	bit tmpEA;

	ChipAddr = (0x07 & ChipAddr) << 1;	// 调整片选地址至1~3位

//	tmpEA = EA;		// 缓存当前总中断状态
//	EA = 0;	// 关闭总中断

	start_24c02();		// 起始命令
	WriteOneByte(0xa0 | ChipAddr);	// 发送片选地址, R/W=0
	clock_24c02();
	WriteOneByte(addr);		// 发送片内寻址地址
	clock_24c02();
	start_24c02();	// 起始命令
	WriteOneByte(0xa1 | ChipAddr);	// 发送片选地址, R/W=1
	clock_24c02();
	info = ReadOneByte();	// 读取字节
	stop_24c02();		// 停止命令

//	EA = tmpEA;		// 恢复总中断状态

	return info;
}
#endif

// 写24c02 ******************************
#if x24c02_Write_en
void x24c02_Write(uchar ChipAddr, uchar addr, uchar info)
// 功能: 从24c02中读取一个字节数据.
// ChipAddr: 器件片选地址. 由引脚A0~A2确定.
// addr: 24c02内部寻址地址.
// info: 待写入字节
{
//	bit tmpEA;

	ChipAddr = (0x07 & ChipAddr) << 1;	// 调整片选地址至1~3位

//	tmpEA = EA;		// 缓存当前总中断状态
//	EA = 0;	// 关闭总中断

	start_24c02();		// 起始命令
	WriteOneByte(0xa0 | ChipAddr);	// 发送片选地址, R/W=0
	clock_24c02();
	WriteOneByte(addr);		// 发送片内寻址地址
	clock_24c02();
	WriteOneByte(info);		// 数据写入
	clock_24c02();
	stop_24c02();		// 停止命令

//	EA = tmpEA;		// 恢复总中断状态
}
#endif

// 擦除24c02 ******************************
#if x24c02_Erase_en
void x24c02_Erase (uchar ChipAddr)
// 功能: 擦除选定的24c02的全部内容.
// ChipAddr: 器件片选地址. 由引脚A0~A2确定.
{
	uint i;

	for( i=0; i<EEPROM_SIZE; i++ );
	{
		x24c02_Write(ChipAddr, i, 0xff);
		DelayXms(5);
	}
}
#endif
//************************************************************

⌨️ 快捷键说明

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