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

📄 iic.lst

📁 此程序实现IIC通信
💻 LST
字号:
C51 COMPILER V8.02   IIC                                                                   04/21/2007 15:52:42 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN IIC.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IIC.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h>
   2          #include<intrins.h>
   3          #define uchar unsigned char
   4          #define uint unsigned int
   5          #define IIC_READ  0XA1   //定义读指令
   6          #define IIC_WRITE 0XA0   //定义写指令
   7          #define NOP _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
   8          
   9          //==============================
  10          
  11          sbit    SDA=P0^6;               
  12          sbit    SCL=P0^7;               
  13          
  14          //===============================
  15          //define a bit_operation byte to use in shift operation
  16          //use this mode can achieve high operation speed 
  17          uchar bdata bbyte;//定义位操作用数组,采用此方法可提高位操作速度
  18          sbit a0=bbyte^0;
  19          sbit a1=bbyte^1;
  20          sbit a2=bbyte^2;
  21          sbit a3=bbyte^3;
  22          sbit a4=bbyte^4;
  23          sbit a5=bbyte^5;
  24          sbit a6=bbyte^6;
  25          sbit a7=bbyte^7;
  26          //========================================
  27          bit IFACK;      //record the SDA state to confirn if ACK has happened 
  28          bit NO_ACK;     //no ack flag
  29          bit BUS_FAULT;  //bus fault flag
  30          //========================================
  31          //FUNCTION:ROUTES TO PROVIDE A START SIGNAL
  32          void start(void)
  33          {
  34   1              SCL=0;SDA=1; NOP;SCL=1;SDA=0;NOP;SCL=0;
  35   1      }
  36          //=======================================
  37          //FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL
  38          void stop(void)
  39          {
  40   1              SCL=0;SDA=0;NOP;SCL=1;SDA=1;NOP;SCL=0;
  41   1      }
  42          //=====================================
  43          //FUNCTION:ROUTES TO PROVIDE ACK SINGAL
  44          void ack(void)
  45          {
  46   1              SCL=0;SDA=0;NOP;SCL=1;NOP;SCL=0;
  47   1      }
  48          //=====================================
  49          //FUNCTION:ROUTES TO RELEASE THE SDA TO RECEIVE A ACK SIGNAL 
  50          //                   OR TO PROVIDE A NO_ACK SIGNAL
  51          //type=1等待应答信号
  52          //type=0 产生无应答信号
  53          void nack(uchar type)
  54          {
  55   1              SCL=0;SDA=1;NOP;SCL=1;IFACK=SDA; NOP;SCL=0;
C51 COMPILER V8.02   IIC                                                                   04/21/2007 15:52:42 PAGE 2   

  56   1              if(type)
  57   1              {
  58   2                      if(IFACK)//如果无应答信号,则置标志位NO_ACK,程序中止
  59   2                      {       
  60   3                              NO_ACK=1;//用户可以加入自己的异常处理程序
  61   3                              //while(1);
  62   3                      }
  63   2                      else NO_ACK=0;
  64   2              }
  65   1      }
  66          //=======================================================
  67          //FUNCTION:THE IIC DEVICE SHIFT OUT A BYTE  TO THE MASTER
  68          uchar  inbyte(void) 
  69          {//从IIC器件中读出数据
  70   1              SDA=1;
  71   1              SCL=1;a7=SDA;NOP;SCL=0;
  72   1              SCL=1;a6=SDA;NOP;SCL=0;
  73   1              SCL=1;a5=SDA;NOP;SCL=0;
  74   1              SCL=1;a4=SDA;NOP;SCL=0;
  75   1              SCL=1;a3=SDA;NOP;SCL=0;
  76   1              SCL=1;a2=SDA;NOP;SCL=0;
  77   1              SCL=1;a1=SDA;NOP;SCL=0;
  78   1              SCL=1;a0=SDA;NOP;SCL=0;
  79   1              return(bbyte);
  80   1      }
  81          //=======================================================
  82          //FUNCTION:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER 
  83          void outbyte(uchar outdata)
  84           {//将数据写放IIC器件
  85   1              bbyte=outdata;
  86   1              SDA=a7;SCL=1;NOP;SCL=0;
  87   1              SDA=a6;SCL=1;NOP;SCL=0;
  88   1              SDA=a5;SCL=1;NOP;SCL=0;
  89   1              SDA=a4;SCL=1;NOP;SCL=0;
  90   1              SDA=a3;SCL=1;NOP;SCL=0;
  91   1              SDA=a2;SCL=1;NOP;SCL=0;
  92   1              SDA=a1;SCL=1;NOP;SCL=0;
  93   1              SDA=a0;SCL=1;NOP;SCL=0;
  94   1      }
  95          
  96          /**********************写函数****************************************
  97          **   函数名称:  写数据 
  98          **   入口参数:add为读起始地址,ptr数据保存指针,writelen为写出数据长度
  99          ********************************************************************/
 100          void writebyteseq(unsigned char page_addr, unsigned char byte_address,uchar *ptr,uchar writelen)
 101          {
 102   1              uchar temph;
 103   1              uchar i;
 104   1      //      unsigned char x;
 105   1                temph = (page_addr<<1);                         
 106   1             
 107   1              start();                
 108   1              outbyte(IIC_WRITE);             
 109   1              nack(1);                
 110   1              outbyte(temph);
 111   1              nack(1);
 112   1              outbyte(byte_address);
 113   1              nack(1);
 114   1              for(i=0;i<writelen;i++)
 115   1              {
 116   2                      outbyte(*(ptr+i));
 117   2                      nack(1);
C51 COMPILER V8.02   IIC                                                                   04/21/2007 15:52:42 PAGE 3   

 118   2              }
 119   1              stop(); 
 120   1      }
 121          /**********************读函数***************************************
 122          **   函数名称:  连续读数据 
 123          **   入口参数:add为读起始地址,ptr数据保存指针,readlen为读出数据长度
 124          ********************************************************************/
 125          void readbyteseq(unsigned char page_addr, unsigned char byte_address,uchar *ptr,uchar readlen)
 126          {
 127   1      
 128   1              uchar temph;
 129   1              uchar i;
 130   1          temph = (page_addr<<1);                          // 2 address bytes.    
 131   1              start();
 132   1              outbyte(IIC_WRITE);
 133   1              nack(1);
 134   1              outbyte(temph);
 135   1              nack(1);
 136   1              outbyte(byte_address);
 137   1              nack(1);
 138   1              start();
 139   1              outbyte(IIC_READ);
 140   1              nack(1);
 141   1              for(i=0;i<readlen-1;i++)
 142   1              {
 143   2                      *(ptr+i)=inbyte();
 144   2                      ack();          
 145   2              }
 146   1              *(ptr+readlen-1)=inbyte();
 147   1              nack(0);
 148   1              stop();
 149   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    543    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1      12
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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