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

📄 i2c.c

📁 用在EM78860单片机制作的摩斯密码机源文件
💻 C
字号:
/*
*	I2C read and write
*/
#include "i2c.h"
#include "em78p860.h"

bit SDA	@0x07@3;
bit SCL	@0x07@4;

uchar F0;


void sta()        //启动iic总线//
{
	char regdata;
	
	regdata=PORT7;
	regdata |=0x18;
	PORT7=regdata;
	//SDA=1;
	//SCL=1;
	while(SCL==0)
	{;}
	NOP();
	NOP();
	regdata&=~0x08;
	PORT7=regdata;
	//SDA=0;
	NOP();
	NOP();
	NOP();
	NOP();
	regdata &=~0x10;
	PORT7=regdata;
//	SCL=0;
}

void stop()
{
	char regdata;
	
	regdata=PORT7;
	regdata&=~0x08;
	regdata|=0x10;
	PORT7=regdata;
	
	//SDA=0;
	//SCL=1;
	while(SCL==0)
	{;}
	NOP();
	NOP();
	regdata |=0x08;
	PORT7=regdata;
	//SDA=1;
	NOP();
	NOP();
	NOP();
	NOP();
	regdata&=~0x10;
	PORT7=regdata;
	//SCL=0;
}

void mack()
{
	char regdata;
	
	regdata=PORT7;
	regdata&=~0x08;
	regdata|=0x10;
	
	//SDA=0;
	//SCL=1;
	NOP();
	NOP();
	NOP();
	NOP();
	regdata&=0x10;
	regdata|=0x08;
	PORT7=regdata;
	
	//SCL=0;
	//SDA=1;
}

void mnack()
{
	char regdata;
	
	regdata=PORT7;
	regdata|=0x18;
	PORT7=regdata;
	//SDA=1;
	//SCL=1;
	NOP();
	NOP();
	NOP();
	NOP();
	regdata&=~0x18;
	PORT7=regdata;
	//SCL=0;
//	SDA=0;
}

void cack()
{
	char regdata;
	
	regdata=PORT7;
	regdata|=0x10;
	PORT7=regdata;
	regdata|=0x08;
	PORT7=regdata;
	//SDA=1;
//	SCL=1;
	F0=0;
	if(SDA==0)
	   {
	   		regdata &=~0x10;
	   		PORT7=regdata;
	        //SCL=0;
	        NOP();
	        NOP();
	        NOP();
	        NOP();
	    }
	 else
	    {
	         F0=1;
	         regdata&=~0x10;
	         PORT7=regdata;
	         //SCL=0;
	         NOP();
	         NOP();
	         NOP();
	         NOP();
	     }
}
void wrbyt1()
{
	char regdata;
	
	regdata =PORT7;
	regdata |=0x18;
	PORT7=regdata;
	//SDA=1;
	//SCL=1;
	NOP(); 
	NOP(); 
	NOP(); 
	NOP();
	regdata&=~0x18;
	PORT7=regdata;
	 
//	SCL=0;
//	SDA=0;
}
void wrbyt0()
{
	char regdata;
	regdata&=~0x08;
	regdata|=0x10;
	PORT7=regdata;
	//SDA=0;
	//SCL=1;
	NOP(); 
	NOP(); 
	NOP(); 
	NOP();
	regdata&=~0x10;
	PORT7=regdata;
	//SCL=0;
}

void wrbyt(uchar shu)
{
	uchar i;
	for(i=0;i<8;i++)
	   {
	      if ((shu&0x80)>0)
	         { wrbyt1(); }
	      else
	         { wrbyt0();}
	      shu<<=1;
	    }
}

uchar rdbyt()
{
uchar nn=0xff;
uchar j;
char regdata;

regdata = PORT7;
for (j=0;j<8;j++)
    {
    	regdata |=0x18;
    	PORT7=regdata;
        // SDA=1;
        // SCL=1;
         if(SDA==0)
            {
                    nn<<=1;
                nn=(nn&0xfe);     
                regdata &=~0x10;
                PORT7=regdata;            
                //SCL=0;
             }
          else 
             {
                    nn<<=1;
                nn=(nn|0x01);    
                regdata &=~0x10;
                PORT7=regdata;               
                //SCL=0;
             }
     }
     return(nn);
}

void wrnbyt(uchar slaw,uchar number,uchar ff[])
{
  uchar  k;
writ: do
   {
         sta();
         wrbyt(slaw);
         cack();
    }while(F0==1);
for(k=0;k<number;k++)
    {  
         wrbyt(ff[k]);
         cack();
         if(F0==1)
             goto writ;
      }
 stop();
}

void rdnbyt(uchar slar,uchar number,uchar qq[])
 
{
uchar  data0,l;
do
    {
       sta();
       wrbyt(slar);
       cack();
     }while(F0==1);
    
  for(l=0;l<number;l++)
     {
        data0=rdbyt();
        qq[l]=data0;
           if(l<(number-1))
              { mack(); }
      }
   mnack();
   stop();
}

//set port 7 bit 3 SDA is out..
//set port 7 bit 4 SCL is out...
void init_i2c_port()
{
	char regdata;
	
	regdata = IOC7;
	regdata &=~(0x18);
	IOC7=regdata;
}

⌨️ 快捷键说明

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