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

📄 i2c.lst

📁 使用显示芯片ZLG7290
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.05a   I2C                                                                  01/11/2008 12:42:15 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil C\C51\BIN\C51.EXE I2C.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*
   2                  I2C.c
   3                  标准80C51单片机模拟I2C总线的主机程序
   4                  Copyright (c) 2005,广州周立功单片机发展有限公司
   5                  All rights reserved.
   6                  本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的
   7          */
   8          
   9          #include "I2C.h"
  10          
  11          //定义延时变量,用于宏I2C_Delay()
  12          unsigned char data I2C_Delay_t;
  13          
  14          /*-------------------------------------------------------------
  15          宏定义:I2C_Delay()
  16          功能:延时,模拟I2C总线专用
  17          -------------------------------------------------------------*/
  18          #define I2C_Delay()\
  19          {\
  20                  I2C_Delay_t = (I2C_DELAY_VALUE);\
  21                  while ( --I2C_Delay_t != 0 );\
  22          }
  23          
  24          /*-------------------------------------------------------------
  25          函数:I2C_Init()
  26          功能:I2C总线初始化,使总线处于空闲状态
  27          说明:在main()函数的开始处,通常应当要执行一次本函数
  28          -------------------------------------------------------------*/
  29          void I2C_Init()
  30          {
  31   1              I2C_SCL = 1;
  32   1              I2C_Delay();
  33   1              I2C_SDA = 1;
  34   1              I2C_Delay();
  35   1      }
  36          
  37          /*-------------------------------------------------------------
  38          函数:I2C_Start()
  39          功能:产生I2C总线的起始状态
  40          说明:
  41                  SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
  42                  不论SDA和SCL处于什么电平状态,本函数总能正确产生起始状态
  43                  本函数也可以用来产生重复起始状态
  44                  本函数执行后,I2C总线处于忙状态
  45          -------------------------------------------------------------*/
  46          void I2C_Start()
  47          {
  48   1              I2C_SDA = 1;
  49   1              I2C_Delay();
  50   1              I2C_SCL = 1;
  51   1              I2C_Delay();
  52   1              I2C_SDA = 0;
  53   1              I2C_Delay();
  54   1              I2C_SCL = 0;
  55   1              I2C_Delay();
C51 COMPILER V8.05a   I2C                                                                  01/11/2008 12:42:15 PAGE 2   

  56   1      }
  57          
  58          /*-------------------------------------------------------------
  59          函数:I2C_Write()
  60          功能:向I2C总线写1个字节的数据
  61          参数:
  62                  dat:要写到总线上的数据
  63          -------------------------------------------------------------*/
  64          void I2C_Write(char dat)
  65          {
  66   1              unsigned char t = 8;
  67   1              do
  68   1              {
  69   2                      I2C_SDA = (bit)(dat & 0x80);
  70   2                      dat <<= 1;
  71   2                      I2C_SCL = 1;
  72   2                      I2C_Delay();
  73   2                      I2C_SCL = 0;
  74   2                      I2C_Delay();
  75   2              } while ( --t != 0 );
  76   1      }
  77          
  78          /*-------------------------------------------------------------
  79          函数:I2C_Read()
  80          功能:从从机读取1个字节的数据
  81          返回:读取的一个字节数据
  82          -------------------------------------------------------------*/
  83          char I2C_Read()
  84          {
  85   1              char dat;
  86   1              unsigned char t = 8;
  87   1              I2C_SDA = 1;    //在读取数据之前,要把SDA拉高
  88   1              do
  89   1              {
  90   2                      I2C_SCL = 1;
  91   2                      I2C_Delay();
  92   2                      dat <<= 1;
  93   2                      if ( I2C_SDA ) dat |= 0x01;
  94   2                      I2C_SCL = 0;
  95   2                      I2C_Delay();
  96   2              } while ( --t != 0 );
  97   1              return dat;
  98   1      }
  99          
 100          /* -------------------------------------------------------------
 101          函数:I2C_GetAck()
 102          功能:读取从机应答位
 103          返回:
 104                  0:从机应答
 105                  1:从机非应答
 106          说明:
 107                  从机在收到每个字节的数据后,要产生应答位
 108                  从机在收到最后1个字节的数据后,一般要产生非应答位
 109          -------------------------------------------------------------*/
 110          bit I2C_GetAck()
 111          {
 112   1              bit ack;
 113   1              I2C_SDA = 1;
 114   1              I2C_Delay();
 115   1              I2C_SCL = 1;
 116   1              I2C_Delay();
 117   1              ack = I2C_SDA;
C51 COMPILER V8.05a   I2C                                                                  01/11/2008 12:42:15 PAGE 3   

 118   1              I2C_SCL = 0;
 119   1              I2C_Delay();
 120   1              return ack;
 121   1      }
 122          
 123          /*-------------------------------------------------------------
 124          函数:I2C_PutAck()
 125          功能:主机产生应答位或非应答位
 126          参数:
 127                  ack=0:主机产生应答位
 128                  ack=1:主机产生非应答位
 129          说明:
 130                  主机在接收完每一个字节的数据后,都应当产生应答位
 131                  主机在接收完最后一个字节的数据后,应当产生非应答位
 132          -------------------------------------------------------------*/
 133          void I2C_PutAck(bit ack)
 134          {
 135   1              I2C_SDA = ack;
 136   1              I2C_Delay();
 137   1              I2C_SCL = 1;
 138   1              I2C_Delay();
 139   1              I2C_SCL = 0;
 140   1              I2C_Delay();
 141   1      }
 142          
 143          /*-------------------------------------------------------------
 144          函数:I2C_Stop()
 145          功能:产生I2C总线的停止状态
 146          说明:
 147                  SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
 148                  不论SDA和SCL处于什么电平状态,本函数总能正确产生停止状态
 149                  本函数执行后,I2C总线处于空闲状态
 150          -------------------------------------------------------------*/
 151          void I2C_Stop()
 152          {
 153   1              unsigned int t = I2C_STOP_WAIT_VALUE;
 154   1              I2C_SDA = 0;
 155   1              I2C_Delay();
 156   1              I2C_SCL = 1;
 157   1              I2C_Delay();
 158   1              I2C_SDA = 1;
 159   1              I2C_Delay();
 160   1              while ( --t != 0 );             //在下一次产生Start之前,要加一定的延时
 161   1      }
 162          
 163          /*-------------------------------------------------------------
 164          函数:I2C_Puts()
 165          功能:I2C总线综合发送函数,向从机发送多个字节的数据
 166          参数:
 167                  SlaveAddr:从机地址(7位纯地址,不含读写位)

⌨️ 快捷键说明

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