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

📄 iic.c

📁 keil C51 LCD 驱动源码,其中还有I2C驱动,ADC驱动,键盘操作等,是一个完整的keil源代码,供大家参考
💻 C
字号:
/****************************************************************************
   +----------------------------------------------------------------------+
   | Copyright Trumpion Microelectronics Inc. 1999                        |
   | Trumpion Microelectronics Inc. reserves the right to change products |
   | or specifications without notice.                                    |
   +----------------------------------------------------------------------+
   Project    : LCD monitor
   Version    : 0.94
   File Name  : iic.c
   Functions  : i2c interface routine
   Revision   :

   1999-05-18  OriginalTeam    First Created
   2000-07-07  Glen Chang      Modify IIC access timing
   2000-07-17  Bill Tseng      Porting to C source
****************************************************************************/

/**************************************************************************/
/* INCLUDE FILES                                                          */
/**************************************************************************/
 
// Standard include files
#include  "lib\extent.h"
#include  "lib\wreg516.h"
#include  "lib\declare.h"

// Project include files
#include  "lib\global.h"
#include  "lib\initial.h"
#include  <intrins.h>

/**************************************************************************/
/**************************************************************************/
#define  SUCCESS   0
#define  FAILURE   1

/**************************************************************************/
/**************************************************************************/
extern Bool  SendData( void );
extern Bool  SendEEPROMData( void );
extern Bool  ReadI2CData(Byte,Byte);
extern Bool  IIC_SendByte(Byte);

//static Bool  IIC_SendByte(Byte);
static void  IIC_Start(void);
static void  IIC_Stop(void);  
static void  IIC_Delay(Byte);
/**************************************************************************/
/**************************************************************************/
Bool  SendData( void )
{
    Byte  i,j;
    Bool  no_ack = 1;

    for( i=0; i<10; i++)  /* retry for 10 times */
    {
       IIC_Start();                             
       if( IIC_SendByte(SlvAdr) )              
       {
           IIC_Stop();
           continue;
       }
       no_ack = 0;
       for(j=0; j<ByteCnt; j++)
       {
          if( IIC_SendByte( TrmBuf[j] ) != SUCCESS )
          {
             no_ack = 1;
             break;
          }
       }
       IIC_Stop();
       if( no_ack==0 )  break;    /* complete */
    }
    return  no_ack;
}
/**************************************************************************/  
/**************************************************************************/
Bool  SendEEPROMData( void )
{
    Byte  i,j;
    Bool  no_ack = 1;

    for( i=0; i<10; i++)
    {       
       IIC_Start();                             
       if( IIC_SendByte(SlvAdr) )              
       {
           IIC_Stop();
           IIC_Delay(10);
           continue;
       }
       no_ack = 0;
       for(j=0; j<ByteCnt; j++)
       {
          if( IIC_SendByte( TrmBuf[j] ) != SUCCESS )
          {
             no_ack = 1;
             break;
          }
       }
       IIC_Stop();
       if( no_ack==0 )  break;    /* complete */
       IIC_Delay(10);   /* delay 10 ms */
    }
    return  no_ack;
}
/**************************************************************************/
/**************************************************************************/
Bool  ReadI2CData(Byte base_addr,Byte byte_cnt)
{
    Byte  i,j,k,bval;
    Bool  no_ack = 1;

    for( i=0; i<10; i++)  /* retry for 10 times */
    {
       IIC_Start();                             
       if( IIC_SendByte(SlvAdr) )              
       {
           IIC_Stop();
           continue;
       }
       if( IIC_SendByte(base_addr) != SUCCESS )
       {
           IIC_Stop();          
           continue;
       }    
       IIC_Start();
       if( IIC_SendByte(SlvAdr+1) )
       {
          IIC_Stop();        
          continue;
       }   
       
       SDA_PIN = 1;
       for(j=0; j<byte_cnt; j++)
       {
          bval = 0;       
          for(k=0; k<8; k++)
          {
             SCL_PIN = 1;

             bval = bval << 1;
             if( SDA_PIN )  bval |= 0x01;

             SCL_PIN = 0;
             _nop_();
             _nop_();
             _nop_();
          }
          if( j==(byte_cnt-1) )  SDA_PIN = 1;
          else                   SDA_PIN = 0;
          _nop_();

          SCL_PIN = 1;
          _nop_();
          _nop_();
          _nop_();
          _nop_();

          SCL_PIN = 0;
          _nop_();
          SDA_PIN = 1;

          TrmBuf[j] = bval;
       }
       IIC_Stop();      
    
       no_ack = 0;
       break;
    }
    return  no_ack;
}

/**************************************************************************/
/**************************************************************************/
/*
static Bool IIC_SendByte(Byte bval)
{
    Byte  i;
    Bool  no_ack = 0; 

    for(i=8; i!=0; i--)
    {
        if( bval & 0x80 )
        {
                SDA_PIN = 1;
                _nop_();
                SCL_PIN = 1;
                bval <<= 1;
                SCL_PIN = 0;
        }                                       
        else    
        {
                SDA_PIN = 0;
                _nop_();
                SCL_PIN = 1;
                bval <<= 1;
                SCL_PIN = 0;
        }                       
//      bval <<= 1;

// glen        SCL_PIN = 1;
//      _nop_();
//      _nop_();
//      _nop_();
// glen        bval <<= 1;
// glen        SCL_PIN = 0;
//      _nop_();
    }
    _nop_();
    SDA_PIN = 1;
    _nop_();
    _nop_();
    _nop_();
    SCL_PIN = 1;
    for(i=0; i<64; i++)
       if( SDA_PIN==0 )  break;
    if( i==64 )  no_ack = 1;

    SCL_PIN = 0;
    _nop_();
    SDA_PIN = 0;
    
    return  no_ack;
}*/
/**************************************************************************/
/**************************************************************************/
static void IIC_Start(void) 
{
    SDA_PIN = 1;
    _nop_();
    SCL_PIN = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();  
    SDA_PIN = 0;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SCL_PIN = 0;
}
/**************************************************************************/
/**************************************************************************/
static void IIC_Stop(void) 
{
    SDA_PIN = 0;
    _nop_();
    SCL_PIN = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();  
    SDA_PIN = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_(); 
}
/**************************************************************************/
/**************************************************************************/
static void  IIC_Delay(Byte count)
{
    Byte  i,j;
 
    for(i=0; i<count; i++)
       for(j=0; j<=142; j++)
          _nop_();
}
/**************************************************************************/
/**************************************************************************/
// static void DdcIIC_Start(void)
// {
//     DSDA_PIN = 1;
//     _nop_();
//     DSCL_PIN = 1;
//     _nop_();
//     _nop_();
//     _nop_();
//     _nop_();
//     DSDA_PIN = 0;
//     _nop_();
//     _nop_();
//     _nop_();
//     _nop_();
//     DSCL_PIN = 0;
// }
// static void DdcIIC_Stop(void)
// {
//     DSDA_PIN = 0;
//     _nop_();
//     DSCL_PIN = 1;
//     _nop_();
//     _nop_();
//     _nop_();
//     _nop_();
//     DSDA_PIN = 1;
//     _nop_();
//     _nop_();
//     _nop_();
//     _nop_();
// }
// static Bool DdcIIC_SendByte(Byte bval)
// {
//     Byte  i;
//     Bool  no_ack = 0;
//
//     for(i=8; i!=0; i--)
//     {
//         if( bval & 0x80 )   DSDA_PIN = 1;
//         else                DSDA_PIN = 0;
//         bval <<= 1;
//
//         DSCL_PIN = 1;
//         _nop_();
//         _nop_();
//         _nop_();
//         DSCL_PIN = 0;
//         _nop_();
//     }
//     DSDA_PIN = 1;
//     _nop_();
//     _nop_();
//     _nop_();
//     DSCL_PIN = 1;
//     for(i=0; i<64; i++)
//        if( DSDA_PIN==0 )  break;
//     if( i==64 )  no_ack = 1;
//
//     DSCL_PIN = 0;
//     _nop_();
//     DSDA_PIN = 0;
//
//     return  no_ack;
// }
// Bool  ReadDdcI2CData(Byte base_addr,Byte byte_cnt)
// {
//     Byte  i,j,k,bval;
//     Bool  no_ack = 1;
//
//     SlvAdr = 0xA0;
//     for( i=0; i<10; i++)  /* retry for 10 times */
//     {
//        DdcIIC_Start();
//        if( DdcIIC_SendByte(SlvAdr) )
//        {
//            DdcIIC_Stop();
//            continue;
//        }
//        if( DdcIIC_SendByte(base_addr) != SUCCESS )
//        {
//            DdcIIC_Stop();
//            continue;
//        }
//        DdcIIC_Start();
//        if( DdcIIC_SendByte(SlvAdr+1) )
//        {
//           DdcIIC_Stop();
//           continue;
//        }
//
//        DSDA_PIN = 1;
//        for(j=0; j<byte_cnt; j++)
//        {
//           bval = 0;
//           for(k=0; k<8; k++)
//           {
//              DSCL_PIN = 1;
//
//              bval = bval << 1;
//              if( DSDA_PIN )  bval |= 0x01;
//
//              DSCL_PIN = 0;
//              _nop_();
//              _nop_();
//              _nop_();
//           }
//           if( j==(byte_cnt-1) )  DSDA_PIN = 1;
//           else                   DSDA_PIN = 0;
//           _nop_();
//
//           DSCL_PIN = 1;
//           _nop_();
//           _nop_();
//           _nop_();
//           _nop_();
//
//           DSCL_PIN = 0;
//           _nop_();
//           DSDA_PIN = 1;
//
//           TrmBuf[j] = bval;
//        }
//        DdcIIC_Stop();
//
//        no_ack = 0;
//        break;
//     }
//     return  no_ack;
// }

⌨️ 快捷键说明

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