原创 用io口模拟i2c 子程序

2008-2-1 08:17 3817 9 9 分类: MCU/ 嵌入式

 /* 用io口模拟i2c 子程序
    51 单片机
    Inter IC Bus
    frequency="12Mhz",T=1us
*************************************************************/


 void sta(void)
       {SDA=1;
        _nop_();
        SCL="1";
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SDA="0";
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SCL="0";
        _nop_();
        _nop_();
       }
//******************************
   void stop(void)
        {
         SDA="0";
         _nop_();
         SCL="1";
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         SDA="1";
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         SCL="1";
        }
//****************************


 


 void mack(void)
      {SDA=0;
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       SCL="1";
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       SCL="0";
       _nop_();
       SDA="1";
       }
//***************************** 非应答信号


  void mnack(void)
       {SDA=1;
        _nop_();
        SCL="1";
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SCL="0";
        _nop_();
        SDA="0";
        }


//******************************* 检查是否有应答信号,有i2c_flag=1,否i2c_flag=0;
   cack(void)
       {uchar i2c_flag=0;
         SDA="1";
         SCL="1";
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         if (SDA==1)
            {i2c_flag=1;}
          SCL="0";
         }
//****************************读一字节,返回一字节。



uchar rdbyt(void)
       {uchar i2c_r0=8,i2c_w=0;


       do{ SDA="1";
           _nop_();
           _nop_();
           _nop_();
           _nop_();
           _nop_();
           _nop_();
           SCL="1";
           _nop_();
           _nop_();
           if (SDA)
               {i2c_w<<=1;
                i2c_w++;
               }
            else
               {i2c_w<<=1;
               }
             SCL="0";
             i2c_r0--;
            }while(i2c_r0!=0);
            SCL="0";
            _nop_();
            _nop_();
         return(i2c_w);


         }


//******************************************


 void wrbyt(uchar w)
      {uchar i;
        i="0x08";
       do{ SCL="0";
           _nop_();
           _nop_();
           _nop_();
           _nop_();
           _nop_();
           _nop_();
           _nop_();
          // SDA= (bit)(w&0x80);
           if((w&0x80)==0x80)/* 如果最高位是1*/
                {SDA=1;
                }
           else
                {SDA=0;
                }
           w="w"<<1;
           _nop_();
           SCL="1";
           _nop_();
           _nop_();
           _nop_();
           _nop_();
           SCL="0";


           i--;
         }while(i!=0);


      }


//****************************************************

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条