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

📄 i2c.c

📁 PIC串口程序  可以帮助你编写串口程序  里面还有我自己做的协议 很方便
💻 C
字号:
 
#include "..\includes\includes.h"


#define ERRORCOUNT 3




void busDelay(void)
{
	#asm
	nop;
	nop;
	nop;
	nop;
	nop;
    #endasm 
}

void IICStart(void)
{
	    SCL=0;
        SDA=1;
        busDelay();
        SCL=1;
        busDelay();
        SDA=0;
        busDelay();
        SCL=0;
        SDA=1;
}


void IICStop(void)
{
	    SCL=0;
        SDA=0;
        busDelay();
        SCL=1;
        busDelay();       
        SDA=1;
        busDelay();
        SCL=0;
}

bit temp;
bit IICRecAck(void)
{	//	bit temp;
        SCL=0;
        SDA=1;
        SCL=1;
        TRISA4=1;
        temp=SDA;     //因为返回值总是放在CY中的
        SCL=0;
        TRISA4=0; 
        return(temp);
}

void IICACK(void)
{
        SDA=0; 
        SCL=1;
        busDelay();
        SCL=0;
        SDA=1;
}

void IICNoAck(void)
{
        SDA=1;
        SCL=1;
        busDelay();
        SCL=0;
}


void IICSendByte(INT8U sendbyte)
{       
        INT8U j=8;
        for(;j>0;j--)
        {
                SCL=0;
                 busDelay();
                sendbyte<<=1;        
                SDA=CARRY;
                busDelay();
                SCL=1;
                busDelay();
        }
        SCL=0;
}

unsigned char IICReceiveByte(void)
{       char receivebyte,i=8;
        SDA=1;
        SCL=0;
        while(i--)
        {
                SCL=1;
                busDelay();
                receivebyte=(receivebyte<<1)|SDA;
                busDelay();
                SCL=0;
        }
        return(receivebyte);
}




/*

INT8U IIcRead(INT8U Address)
{
        INT8U bank;
        INT8U DataBuff;
        INT8U i=ERRORCOUNT;
        if ((Address&0x8000)==0x8000)                  //IIC地止最高位1表示外部卡
           bank=0xAE;
        else bank=0xA0;
        Address=Address&0x7FFF;
        while(i--)
   		{   IICStart();
	   		IICSendByte(bank);			//写控制字到E2PROM
	   		if (IICRecAck())
	       	            continue;
	                IICSendByte((unsigned char)(Address>>8));
	                if (IICRecAck())
	                    continue;
	                IICSendByte((unsigned char)Address);
	                if (IICRecAck())
	                    continue;
	                IICStart();
	     		IICSendByte(bank+1);
	     		if(IICRecAck())
	       		   continue;
	     		DataBuff=IICReceiveByte();        //read last byte data
	            IICNoAck();
                 break;
        }
  		IICStop();
        return(DataBuff);
}


bit IIcWrite(INT8U DataBuff,INT8U Address)
{
        INT8U bank;
        INT8U IICFlag=FALSE;
        INT8U i=ERRORCOUNT;
        if ((Address&0x8000)==0x8000)
           bank=0xAE;
        else bank=0xA0;
        Address=Address&0x7FFF;
        while(i--)
   	{       IICStart();
   		IICSendByte(bank);			//写控制字到E2PROM
   		if (IICRecAck())
       	            continue;
                IICSendByte((unsigned char)(Address>>8));
                if (IICRecAck())
                    continue;
                IICSendByte((unsigned char)Address);
                if (IICRecAck())
                    continue;
                IICSendByte(DataBuff);
                IICRecAck();
                IICFlag=TRUE;
                break;
        }
  		IICStop();
        //IIcWriteDelays(10);      //changed 2007.11.16
        return(IICFlag);

}
*/

INT8U I2C_WriteNByte(INT8U chip,INT8U mode,INT8U addr,INT8U *p,INT8U sum)
{
	INT8U flag;
	INT8U i,r;
	flag=0;
	r=ERRORCOUNT; 
	while(r--)
   	{   IICStart();
   		IICSendByte(chip);			
   		if (IICRecAck())
      	    continue;
        IICSendByte(addr);
       if (IICRecAck())
          continue;
        for (i=0;i<sum;i++)    
        	IICSendByte(*(p+i));
        IICRecAck();
        flag=TRUE;
        break;
    } 
  	IICStop();
    return(flag);
}

⌨️ 快捷键说明

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