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

📄 iic.c

📁 一个基于C51开发的计价秤
💻 C
字号:
/*********************************************/
// File Name: IIC.c
// Author: henny
// Date: 2006/3/1
// Note: Crystal=11.0592MHz
/*********************************************/
#include <SST89x5xxRD2.h>
#include <intrins.h>
#include "Public.h"
#define HIGH 1
#define LOW 0
#define SCL P1_0
#define SDA P1_1
#define Nop() _nop_()

BOOL Ack;

VOID IIC_Start()
{
	SDA=HIGH;
	Nop();
	SCL=HIGH;
	Nop();/*>4.7us*/
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	SDA=LOW;
	Nop();/*>4us*/
	Nop();
	Nop();
	Nop();
	Nop();
	SCL=LOW;
	Nop();/*>4.7us*/
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
}

VOID IIC_Stop()
{
	SDA=LOW;
	Nop();
	SCL=HIGH;
	Nop();/*>4us*/
	Nop();
	Nop();
	Nop();
	Nop();
	SDA=HIGH;
	Nop();
	Nop();
	Nop();
	Nop();
}

BYTE IIC_Read()
{
	BYTE IIC_data=0;
	BYTE i;
	SDA=HIGH;
	for(i=0;i<8;i++)
	{         
        Nop();
		SCL=LOW;
        Nop();/*>4.7us*/
        Nop();
		Nop();
		Nop();
		Nop();
		Nop();         
        SCL=HIGH;
        Nop();/*>4us*/
		Nop();
		IIC_data=IIC_data<<1;
        if(SDA==HIGH)
			IIC_data=IIC_data+1;
		Nop();
		Nop();
		Nop(); 
	}
	SCL=LOW;
	Nop();
	Nop();
	return(IIC_data);
}

VOID IIC_Write(BYTE IIC_data)
{
	BYTE i;
	for(i=0;i<8;i++)
	{
		if((IIC_data<<i)&0x80)
			SDA=HIGH;
		else  
	   		SDA=LOW;
		Nop();
		SCL=HIGH;
		Nop();/*>4us*/
		Nop();
		Nop();
		Nop();
		Nop();
		SCL=LOW;
		Nop();/*>4.7us*/
		Nop();
		Nop();
		Nop();
		Nop();
		Nop();
	}
	Nop();
	Nop();
    SDA=HIGH;
    Nop();
	Nop();   
    SCL=HIGH;
    Nop();/*>4us*/
	Nop();
	Nop();
	Nop();
	Nop();
    if(SDA==HIGH)
		Ack=FALSE;     
	else 
		Ack=TRUE;
    SCL=LOW;
    Nop();/*>4.7us*/
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
}

VOID IIC_Ack(BOOL ack)
{
	if(ack==FALSE)
		SDA=LOW;
	else 
		SDA=HIGH;
	Nop(); 
	SCL=HIGH;
	Nop();/*>4us*/
	Nop();              
	Nop();
    Nop();
	Nop();
	SCL=LOW;           
    Nop();/*>4.7us*/
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();   
}

/*
BOOL IRcvByte(BYTE sla,BYTE *c)
{
   	IIC_Start();
   	IIC_Write(sla+1);
	if(ack==FALSE)return FALSE;
   	*c=IIC_Read();
	IIC_Ack(TRUE);
  	IIC_Stop();
  	return TRUE;
}

BOOL IRcvStr(BYTE sla,BYTE suba,BYTE *s,BYTE no)
{
   	BYTE i;
   	IIC_Start();
   	IIC_Write(sla);
	if(ack==FALSE)return FALSE;
   	IIC_Write(suba);
	if(ack==FALSE)return FALSE;
	IIC_Start();
   	IIC_Write(sla+1);
	if(ack==FALSE)return FALSE;
	for(i=0;i<no-1;i++)
    {   
		*s=IIC_Read();
      	IIC_Ack(FALSE);
     	s++;
    } 
   	*s=IIC_Read();
    IIC_Ack(TRUE);
 	IIC_Stop();
  	return TRUE;
}
*/

BOOL ISendByte(BYTE sla,BYTE c)
{
   	IIC_Start();
   	IIC_Write(sla);
	if(Ack==FALSE)return FALSE;
   	IIC_Write(c);
	if(Ack==FALSE)return FALSE;
  	IIC_Stop();
  	return TRUE;
}

BOOL ISendStr(BYTE sla,BYTE suba,BYTE *s,BYTE no)
{
	BYTE data i;
   	IIC_Start();
   	IIC_Write(sla);
	if(Ack==FALSE)return FALSE;
   	IIC_Write(suba);
	if(Ack==FALSE)return FALSE;
   	for(i=0;i<no;i++)
    {   
     	IIC_Write(*s);
       	if(Ack==FALSE)return FALSE;
     	s++;
    } 
 	IIC_Stop();
  	return TRUE;
}

BOOL Read_eeprom(BYTE sla,WORD adr,BYTE *s,BYTE no)
{
   	BYTE i;
   	IIC_Start();
   	IIC_Write(sla);
	if(Ack==FALSE)return FALSE;
   	IIC_Write((adr&0xff00)>>8);
	if(Ack==FALSE)return FALSE;
	IIC_Write(adr&0x00ff);
	if(Ack==FALSE)return FALSE;
	IIC_Start();
   	IIC_Write(sla+1);
	if(Ack==FALSE)return FALSE;
	for(i=0;i<no-1;i++)
    {   
		*s=IIC_Read();
      	IIC_Ack(FALSE);
     	s++;
    } 
   	*s=IIC_Read();
    IIC_Ack(TRUE);
 	IIC_Stop();
  	return TRUE;
}

BOOL Write_eeprom(BYTE sla,WORD adr,BYTE *s,BYTE no)
{
   	BYTE i;
   	IIC_Start();
   	IIC_Write(sla);
	if(Ack==FALSE)return FALSE;
   	IIC_Write((adr&0xff00)>>8);
	if(Ack==FALSE)return FALSE;
	IIC_Write(adr&0x00ff);
	if(Ack==FALSE)return FALSE;
   	for(i=0;i<no;i++)
    {   
     	IIC_Write(*s);
       	if(Ack==FALSE)return FALSE;
     	s++;
    } 
 	IIC_Stop();
  	return TRUE;
}

⌨️ 快捷键说明

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