i2c.#3

来自「用c8051f320单片机,任选两个IO口进行模拟IIC操做,用软件IIC对加速」· #3 代码 · 共 202 行

#3
202
字号
#include "MEMSIC.h"


bit	Ack;
uint8 xdata Temp0;
uint8 xdata Temp1;
uint8 xdata Temp2;
uint8 xdata Temp3;
int8  xdata Ax;
int8  xdata Ay;


void IIC_Start (void)
{
	Sda=1;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
	Scl=1;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
	Sda=0;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
	Scl=0;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
}

void IIC_Stop (void)
{
	Sda=0;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
	Scl=0;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
	Scl=1;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
	Sda=1;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
}

void IIC_Read_Ack (void)
{
	Scl=1;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
	if(Sda==1)
	{
		Ack=0;
	}
	else
	{
		Ack=1;
	}
	Scl=0;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
}


void IIC_Write_Ack (void)
{
	Sda=0;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
	Scl=1;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
	Scl=0;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
}

void IIC_Write_NoAck (void)
{
	Sda=1;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
	Scl=1;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
	Scl=0;
	_nop_ ();
	_nop_ ();
	_nop_ ();
	_nop_ ();
}

unsigned char IIC_Read_Byte (void)
{
    uint8 bitCount;
    uint8 Temp;

	Sda=1;
	for(bitCount=0x00;bitCount<0x08;bitCount++)
	{
		Scl=1;
		_nop_ ();
		_nop_ ();
		_nop_ ();
		_nop_ ();
		Temp=Temp<<1;
		if(Sda==1)
		{
			Temp+=0x01;
		}
		Scl=0;
		_nop_ ();
		_nop_ ();
		_nop_ ();
		_nop_ ();
	}
	return(Temp);
}

void IIC_Write_Byte (unsigned char a)
{
    uint8 bitCount;
    uint8 Temp;
	
	for(bitCount=0x00;bitCount<0x08;bitCount++)
	{
		Temp=a;
		if((Temp<<bitCount)&0x80)
		{
			Sda=1;
		}
		else
		{
			Sda=0;
		}
		Scl=1;
		_nop_ ();
		_nop_ ();
		_nop_ ();
		_nop_ ();
		Scl=0;
	}
}

void Read_Acc (void)					//read acceleration
{
    IIC_Start ();
	IIC_Write_Byte (0x20);
	IIC_Read_Ack ();
	IIC_Write_Byte (0x01);
	IIC_Read_Ack ();
	IIC_Stop ();

	IIC_Start ();
	IIC_Write_Byte (0x21);
	IIC_Read_Ack ();
	*(&Temp0)=IIC_Read_Byte ();
	IIC_Write_Ack ();
	*(&Temp1)=IIC_Read_Byte ();
	IIC_Write_Ack ();
	*(&Temp2)=IIC_Read_Byte ();
	IIC_Write_Ack ();
	*(&Temp3)=IIC_Read_Byte ();
	IIC_Write_NoAck ();
	IIC_Stop ();

	Ax=Temp0;
	Ax=Ax<<8;
	Ax+=Temp1;
	Ay=Temp2;
	Ay=Ay<<8;
	Ay+=Temp3;
}

⌨️ 快捷键说明

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