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

📄 iic24c0x.c

📁 通用的24C02/4/8的C语言程序
💻 C
字号:
/********************************************************************
*以下程序为24C0x的操作
/*******************************************************************/
//#pragma la      //存储器为大模式

#define __IIC24C0x_h__

#include "Includes.h"	//函数声明

sbit SDA = P1^6;
sbit SCL = P1^7;

/********************************************************************
*延时子程序,执行时间: 4*count+4(字节时间)
********************************************************************/
void delay(INT16U count)
{
	while (count-- != 0);
}

/********************************************************************
*I2C总线初始化。在main()函数中应首先调用本函数
********************************************************************/
void I2C_init(void)
{
	SCL = low;
	delay(1);
	I2C_stop();
}

/********************************************************************
*提供I2C总线工作时序中的起始条件
********************************************************************/
void I2C_start(void)
{
	SDA = high;
	delay(1);
	SCL = high;
	delay(1);
	SDA = low;
	delay(1);
	SCL = low;
}

/********************************************************************
*提供I2C总线工作时序中的停止条件
********************************************************************/
void I2C_stop(void)
{
	SDA = low;
	delay(1);
	SCL = high;
	delay(1);
	SDA = high;
	delay(1);
	SCL = low;
}

/********************************************************************
*向I2C总线发送8 bit数据
********************************************************************/
C51_BOOLEAN I2C_sendByte(INT8U I2C_data)
{
	INT8U i;
	C51_BOOLEAN ack;

	for (i=0;i<8;i++)
	{
		SDA = (C51_BOOLEAN)(I2C_data & 0x80);
		I2C_data = I2C_data << 1;
		SCL = high;
		delay(1);
		SCL = low;
	}

	delay(1);
	SDA = high;
	delay(1);
	SCL = high;
	delay(1);
	if (SDA) ack = false;          //Wait for Slave Ack
		else  ack = true;
	SCL = low;
	if (ack) return (true);
		else  return (false);
}

/********************************************************************
*从I2C总线上接收8 bit数据,并将接收到8 bit数据作为一个字节返回,
********************************************************************/
INT8U I2C_receiveByte(void)
{
	INT8U I2C_data = 0;
	INT8U i;

	SDA = high;
	for (i=0;i<8;i++)
	{
		I2C_data *= 2;
		SCL = high;
		delay(1);
		if (SDA) I2C_data++;
		SCL = low;
	}
	return (I2C_data);
}

/********************************************************************
*向24C0X写入器件地址及从地址
********************************************************************/
void I2C_issue_add(INT8U  chipAdd,
                   INT16U subAdd)
{
	INT8U low_add;
	INT8U wd = 0;

	low_add  = subAdd;        //Addressing byte address
#ifdef _24C04
	subAdd >>= 7;
	wd  = subAdd & 0x02;      //Addressing page
#endif
#ifdef _24C08
	subAdd >>= 7;
	wd  = subAdd & 0x06;      //Addressing page
#endif
	wd |= chipAdd;

	I2C_start();
	I2C_sendByte(wd);
	I2C_sendByte(low_add);
}

/********************************************************************
*将指针地址buf中的n_buf个字节数据写入到24C0X的地址S_add处,
*采用连续写入操作方式,连续写字节数不能大于8,并且连续字节
*地址须在同一页内
********************************************************************/
void I2C_write_block(INT8U  chipAdd,
                     INT16U S_add,
                     INT8U  n_buf,
                     INT8U  *buf)
{
	INT8U i;

//	WDTC  = 0x06;	     //关闭看门狗
//	EA    = 0;

	I2C_issue_add(chipAdd,S_add);
	for (i=0;i<n_buf;i++)
	{
		I2C_sendByte(*(buf+i));
	}
	I2C_stop();
	delay(3000);              //I2C_stop与I2C_start间隔10ms

//	WDTC = 0x86;              //Enable Watchdog,Watchdog time-out period: 314.5728ms (CR:40MHz)
//	EA    = 1;
}

/********************************************************************
*从24C0X中读取n_buf个字节的数据存于指针buf指向的地址中,
*采用序列读方式从片内S_add地址开始连续读取数据,连续读字节数不能大于8.
*地址须在同一页内
********************************************************************/
void I2C_read_block(INT8U  chipAdd,
                    INT16U S_add,
                    INT8U  n_buf,
                    INT8U  *buf)
{
	INT8U i;
	INT8U rd=0;

//	WDTC  = 0x06;	           //关闭看门狗
//	EA    = 0;

	I2C_issue_add(chipAdd,S_add);

#ifdef _24C04
	S_add >>= 7;
	rd  = S_add & 0x02;        //Addressing page
#endif
#ifdef _24C08
	S_add >>= 7;
	rd  = S_add & 0x06;        //Addressing page
#endif
	rd |= chipAdd;
	rd |= 0x01;                //READ command

	I2C_start();               //Repeated START condition
	I2C_sendByte(rd);

	for (i=0;i<n_buf-1;i++)
	{
		*(buf+i) = I2C_receiveByte();

		SDA = low;              //Master ACK
		delay(1);
		SCL = high;
		delay(1);
		SCL = low;
		SDA = high;
	}
	*(buf+i) = I2C_receiveByte();

	I2C_stop();

//	WDTC = 0x86;              //Enable Watchdog,Watchdog time-out period: 314.5728ms (CR:40MHz)
//	EA    = 1;
}

//=======================================================================================
//                            End of file.
//=======================================================================================

⌨️ 快捷键说明

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