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

📄 lc32_.c

📁 单片机与pc机通讯例程的mcu部分
💻 C
字号:
#include "Def_.h"

/*----------------------------------------------------
LC32存储器操作
----------------------------------------------------*/

static unsigned char FakeI2cSerIn(unsigned char x);
static unsigned char FakeI2cSerOut(unsigned char ack);
static unsigned char FakeI2cBusyCheck(unsigned char icAddr);
static void FakeI2cStart(void);
static void FakeI2cStop(void);
static void FakeI2cClk(void);
static void FakeI2cNop(void);


static void FakeI2cNop(void)
/*
IIC延时
*/
{
	DelayUs(20);
}

static void FakeI2cStart(void)
/*
IIC开始时序
*/
{
//while PFakeI2cClk=1,PFakeI2cDat=1->0
	PFakeI2cDatOut = 1;
	PFakeI2cClk = 1;
	FakeI2cNop();
	PFakeI2cDatOut = 0;
	PFakeI2cClk = 0;
	FakeI2cNop();
}


static void FakeI2cStop(void)
/*
IIC停止时序
*/
{
//while scl=1,sda=0->1
	PFakeI2cDatOut = 0;
	PFakeI2cClk = 1;
	FakeI2cNop();
	PFakeI2cDatOut = 1;
	FakeI2cNop();
}

static void FakeI2cClk(void)
/*
IIC脉冲时序
*/
{
	FakeI2cNop();
	PFakeI2cClk=1;
	FakeI2cNop();
	PFakeI2cClk=0;
	FakeI2cNop();
}

static unsigned char FakeI2cSerIn(unsigned char x)
/*
写入一个byte
*/
{
	unsigned char i;
	unsigned char result;
	for(i=8;i;i--)
	{
		PFakeI2cDatOut = x&0x80;
		x<<=1;
		FakeI2cClk();
	}
	PFakeI2cDatOut = 1;
	FakeI2cNop();
	if(PFakeI2cDatIn)	result = 0;
	else				result = 1;
	FakeI2cClk();
	return (result);
}

static unsigned char FakeI2cSerOut(unsigned char ack)
/*
读取一个byte
*/
{
	unsigned char i,val;
	PFakeI2cDatOut = 1;
	for(i=8;i;i--)
	{
		val<<=1;
		if(PFakeI2cDatIn) val++;
		FakeI2cClk();
	}
	if(ack)
	{
		PFakeI2cDatOut = 0;
		FakeI2cClk();
	}
	return(val);
}


#define CHECK_FAKE_IIC_TIMES		20
static unsigned char FakeI2cBusyCheck(unsigned char icAddr)
/*	返回非零表示IIC忙线	*/
{
	unsigned char i;
	for(i=0;i<CHECK_FAKE_IIC_TIMES;i++)
	{
		FakeI2cStart();
		if(FakeI2cSerIn(icAddr))	break;
	}
	if(CHECK_FAKE_IIC_TIMES == i)	return 1;
	else					return 0;
}



unsigned char RdFakeI2cLc32Byte(unsigned char icAddr,unsigned int addr, unsigned char* x)
/*
从相应器件内部地址读出一个byte
*/
{
	if(FakeI2cBusyCheck(icAddr)) return 0;
	FakeI2cSerIn(addr>>8);
	FakeI2cSerIn(addr&0xff);
	FakeI2cStart();
	FakeI2cSerIn(icAddr+1);
	*x=FakeI2cSerOut(0);
	FakeI2cStop();
	return 1;
}

unsigned char RdFakeI2cLc32Buff(unsigned char icAddr,unsigned char buff[],unsigned int addr,unsigned char length)
/*
从相应器件内部地址读出少于8个的buffer
*/
{
	unsigned char loop;
	if(FakeI2cBusyCheck(icAddr))	return 0;
	if(length>8) 			length = 8;
	FakeI2cSerIn(addr>>8);
	FakeI2cSerIn(addr&0xff);
	FakeI2cStart();
	FakeI2cSerIn(icAddr+1);
	for(loop=0;loop<(length-1);loop++)
		*(buff+loop) = FakeI2cSerOut(1);
	*(buff+loop) = FakeI2cSerOut(0);
	FakeI2cStop();
	return 1;
}

unsigned char WrFakeI2cLc32Byte(unsigned char icAddr,unsigned int addr,unsigned char x)
/*
从相应器件内部地址写入一个byte
*/
{
	if(FakeI2cBusyCheck(icAddr))	return 0;
	FakeI2cStart();
	FakeI2cSerIn(icAddr);
	FakeI2cSerIn(addr>>8);
	FakeI2cSerIn(addr&0xff);
	FakeI2cSerIn(x);
	FakeI2cStop();
	return 1;
}

unsigned char WrFakeI2cLc32Buff(unsigned char icAddr,unsigned char buff[],unsigned int addr,unsigned char length)
/*
从相应器件内部地址写入少于8个的buffer
*/
{
	unsigned char loop;
	if(FakeI2cBusyCheck(icAddr))	return 0;
	if(length>8)	length = 8;

	FakeI2cStart();
	FakeI2cSerIn(icAddr);
	FakeI2cSerIn(addr>>8);
	FakeI2cSerIn(addr&0xff);
	for(loop=0;loop<length;loop++)
		FakeI2cSerIn(buff[loop]);
	FakeI2cStop();
	return 1;
}

U08 Read8574A(unsigned char icAddr,unsigned char *x)
/*
读取8574Abyte
*/
{
	if(FakeI2cBusyCheck(icAddr))	return 0;
	FakeI2cStart();
	FakeI2cSerIn(icAddr+1);
	*x = FakeI2cSerOut(0);
	FakeI2cStop();
	return 1;
}

U08 Write8574A(unsigned char icAddr,U08 dat)
/*
写入8574Abyte
*/
{
	if(FakeI2cBusyCheck(icAddr))	return 0;
	FakeI2cStart();
	FakeI2cSerIn(icAddr);
	FakeI2cSerIn(dat);
	FakeI2cStop();
	return 1;
}


⌨️ 快捷键说明

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