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

📄 i2c.c

📁 基于8051的驱动源码.包括STN LCD driver, I2C driver, 键盘(模拟键盘)驱动,串口驱动,中断应用,部分GDI函数
💻 C
字号:
//
//
//for at24c02
//
#include "reg52.h"
#include "i2c.h"
#include "common.h"


sbit SDA = P3^4;
sbit SCL = P3^2;

static S_BYTE idata I2C_Device_Addr = 0x07;//A0=1,A1=1;A2=1

S_VOID I2C_Start(S_VOID)
{
	SCL = 0;
	SDA = 1;
	SCL = 1;
	DelayUs(1);
	SDA = 0;
	SCL = 0;
}

S_VOID I2C_Stop(S_VOID)
{
	SCL = 0;
	SDA = 0;
	SCL = 1;
	DelayUs(1);
	SDA = 1;
	SCL = 0;
}

S_VOID I2C_MainAck(bit IsNeed)
{
	SCL = 0;
	SDA = !IsNeed;
	SCL = 1;
	DelayUs(1);
	SCL = 0;
}

S_VOID I2C_SlaveAck(S_VOID)
{
	SCL = 0;
	SDA = 1;
	SCL = 1;
	while (SDA);
	SCL = 0;
}

S_VOID I2C_SerialIn8Bits(S_BYTE ch)
{
	S_BYTE cnt;

	for (cnt = 0; cnt < 8; cnt++)
	{
		SCL = 0;
		if ((ch<<cnt)&0x80)
			SDA = 1;
		else
			SDA = 0;
		SCL = 1;
		DelayUs(1);
		SCL = 0;
	}
}

S_BYTE I2C_SerialOut8Bits(S_VOID)
{
	S_BYTE ch = 0;
	S_BYTE cnt;

	SCL = 0;
	SDA = 1;
	for (cnt = 0; cnt < 8; cnt++)
	{
		SCL = 0;
		SCL = 1;
		ch <<= 1;
		if (SDA)
			ch += 1;
		else
			ch += 0;
		SCL = 0;
	}
	return ch;
}

S_VOID I2C_SetI2CDeviceAddr(S_BYTE I2C_Addr)
{
	I2C_Device_Addr = I2C_Addr & 0x0F;
}

S_VOID I2C_WriteChar(S_BYTE addr, S_BYTE dat)
{
	I2C_Start();
	I2C_SerialIn8Bits(0xA0 | (I2C_Device_Addr << 1));
	I2C_SlaveAck();
	I2C_SerialIn8Bits(addr);
	I2C_SlaveAck();
	I2C_SerialIn8Bits(dat);
	I2C_SlaveAck();
	I2C_Stop();
	DelayMs(1);
}

S_BYTE I2C_ReadChar(S_BYTE addr)
{
	S_BYTE idata dat;

	I2C_Start();
	I2C_SerialIn8Bits(0xA0 | (I2C_Device_Addr << 1));
	I2C_SlaveAck();
	I2C_SerialIn8Bits(addr);
	I2C_SlaveAck();

	I2C_Start();
	I2C_SerialIn8Bits(0xA1 | (I2C_Device_Addr << 1));
	I2C_SlaveAck();
	dat = I2C_SerialOut8Bits();
	I2C_MainAck(0);
	I2C_Stop();
	DelayMs(1);
	
	return dat;
}


⌨️ 快捷键说明

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