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

📄 iic.lst

📁 单片机实现显示器信号发生仪 功能
💻 LST
字号:
C51 COMPILER V7.50   IIC                                                                   12/04/2007 21:53:32 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN iic.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE iic.c LARGE OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #define IIC_READ 0XA1    //定义读指令
   2          #define IIC_WRITE 0XA0   //定义写指令
   3          #define NOP _nop_()
   4          #define uchar unsigned char
   5          #define uint  unsigned int
   6          #include "reg52.h"
   7          #define IIC_READ 0XA1    //定义读指令
   8          #define IIC_WRITE 0XA0   //定义写指令
   9          #define NOP _nop_()
  10          uchar readbyteseq(uint add,uchar *ptr,uint readlen);
  11          uchar writebyteseq(uint add,uchar *ptr,uint writelen);
  12          void delay10ms(void);
  13          //#define SDA INT0
  14          //#define SCL T0
  15          //==============================
  16          uchar xdata buff[2000]; //save the byte read out  form iic device in test operation
  17          uchar xdata readbuff[232];//测试数组,暂存写入读出数据
  18          //uchar writebuff[32];
  19          //===============================
  20          sbit SDA=P3^5;//P2^7; //THE SDA BIT IS PORT 2 BIT 7
  21          sbit SCL=P3^4;//P2^6; //THE SCL BIT IS PORT 2 BIT 6
  22          sbit SEN=P3^3;//P2^6; //THE SCL BIT IS PORT 2 BIT 6
  23          sbit STE=P3^2;//P2^6; //THE SCL BIT IS PORT 2 BIT 6
  24          uchar bdata bbyte;//定义位操作用数组,采用此方法可提高位操作速度
  25          sbit a0=bbyte^0;
  26          sbit a1=bbyte^1;
  27          sbit a2=bbyte^2;
  28          sbit a3=bbyte^3;
  29          sbit a4=bbyte^4;
  30          sbit a5=bbyte^5;
  31          sbit a6=bbyte^6;
  32          sbit a7=bbyte^7;
  33          //========================================
  34          bit IFACK; //record the SDA state to confirn if ACK has happened 
  35          bit NO_ACK; //no ack flag
  36          bit BUS_FAULT; //bus fault flag
  37          //========================================
  38          void start(void)
  39          {
  40   1       SCL=0;
  41   1       SDA=1;
  42   1       SCL=1;
  43   1       SDA=0;
  44   1       SCL=0;
  45   1      }
  46          //=======================================
  47          //FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL
  48          void stop(void)
  49          {
  50   1       SCL=0;
  51   1       SDA=0;
  52   1       SCL=1;
  53   1       SDA=1;
  54   1       SCL=0;
  55   1      }
C51 COMPILER V7.50   IIC                                                                   12/04/2007 21:53:32 PAGE 2   

  56          //=====================================
  57          //FUNCTION:ROUTES TO PROVIDE ACK SINGAL
  58          void ack(void)
  59          {
  60   1       SCL=0;
  61   1       SDA=0;
  62   1       SCL=1;
  63   1       SCL=0;
  64   1      }
  65          //=====================================
  66          //FUNCTION:ROUTES TO RELEASE THE SDA TO RECEIVE A ACK SIGNAL 
  67          //              OR TO PROVIDE A NO_ACK SIGNAL
  68          //type=1等待应答信号
  69          //type=0 产生无应答信号
  70          void nack(uchar type)
  71          {
  72   1      SCL=0;
  73   1      SDA=1;
  74   1      SCL=1;
  75   1      IFACK=SDA;
  76   1      SCL=0;
  77   1       if(type)
  78   1       {
  79   2        if(IFACK)//如果无应答信号,则置标志位NO_ACK,程序中止
  80   2        { 
  81   3         NO_ACK=1;//用户可以加入自己的异常处理程序
  82   3         //while(1);
  83   3        }
  84   2        else NO_ACK=0;
  85   2       }
  86   1      }
  87          //=======================================================
  88          //FUNCTION:THE IIC DEVICE SHIFT OUT A BYTE  TO THE MASTER
  89          uchar  inbyte(void) {//从IIC器件中读出数据
  90   1       SDA=1;
  91   1       SCL=1;
  92   1       a7=SDA;
  93   1       SCL=0;
  94   1       SCL=1;
  95   1       a6=SDA;
  96   1       SCL=0;
  97   1       SCL=1;
  98   1       a5=SDA;
  99   1       SCL=0;
 100   1       SCL=1;
 101   1       a4=SDA;
 102   1       SCL=0;
 103   1       SCL=1;
 104   1       a3=SDA;
 105   1       SCL=0;
 106   1       SCL=1;
 107   1       a2=SDA;
 108   1       SCL=0;
 109   1       SCL=1;
 110   1       a1=SDA;
 111   1       SCL=0;
 112   1       SCL=1;
 113   1       a0=SDA;
 114   1       SCL=0;
 115   1       return(bbyte);
 116   1      }
 117          //=======================================================
C51 COMPILER V7.50   IIC                                                                   12/04/2007 21:53:32 PAGE 3   

 118          //FUNCTION:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER 
 119          void outbyte(uchar outdata) {//将数据写放IIC器件
 120   1       bbyte=outdata;
 121   1       SDA=a7;
 122   1       SCL=1;
 123   1       SCL=0;
 124   1       SDA=a6;
 125   1       SCL=1;
 126   1       SCL=0;
 127   1       SDA=a5;
 128   1       SCL=1;
 129   1       SCL=0;
 130   1       SDA=a4;
 131   1       SCL=1;
 132   1       SCL=0;
 133   1       SDA=a3;
 134   1       SCL=1;
 135   1       SCL=0;
 136   1       SDA=a2;
 137   1       SCL=1;
 138   1       SCL=0;
 139   1       SDA=a1;
 140   1       SCL=1;
 141   1       SCL=0;
 142   1       SDA=a0;
 143   1       SCL=1;
 144   1       SCL=0;
 145   1      }
 146          /*
 147          //======================================================
 148          //FUNCTION:BYTE WRITE.  'add'     THE WRITE ADDRESS, 'wbyte'   THE DATA WANT TO WRITE
 149          void writebyte(uint add,uchar wbyte)//add为写入地址,wbyte为写入数据
 150          {
 151           uchar temph,templ;
 152           temph=(uchar)(add/256);
 153           templ=(uchar)(add%256);
 154           if(!STE)
 155           return;
 156           SEN=0;
 157           if(!STE)
 158           {
 159           SEN=1;
 160           SCL=1;
 161           SDA=1;
 162           return;
 163           }
 164           start();    //开始信号
 165           outbyte(IIC_WRITE|(temph<<1));   //写命令
 166           nack(1);   //等待应答
 167           outbyte(templ);  //写地址
 168           nack(1);
 169           outbyte(wbyte);   //写数据
 170           nack(1);   //等待应答
 171           stop();    //停止信号
 172           SCL=1;
 173           SDA=1;
 174           SEN=1;
 175          }
 176          //=====================================================
 177          //FUNCTION:RANDOM READ.'add' IS THE ADDRESS WANT TO READ
 178          uchar readbyte (uint add)//add为读地址
 179          {
C51 COMPILER V7.50   IIC                                                                   12/04/2007 21:53:32 PAGE 4   

 180          uchar temp,temph,templ; 
 181           temph=(uchar)(add/256);
 182           templ=(uchar)(add%256);
 183           if(!STE)
 184           return 0XFF;
 185           SEN=0;
 186           if(!STE)
 187           {
 188            SCL=1;
 189           SDA=1;
 190           SEN=1;
 191           return 0XFF;
 192           }
 193           start();   //开始信号
 194           outbyte(IIC_WRITE|(temph<<1));   //写命令
 195           nack(1);   //等待应答
 196           outbyte(templ);  //写地址
 197           nack(1);
 198           start();   //开始信号
 199           outbyte(IIC_READ|(temph<<1));   //读命令
 200           nack(1);   //等待应答
 201           temp=inbyte();   //读数据
 202           nack(0);   //无应答
 203           stop();    //停止信号
 204           SEN=1;
 205           SCL=1;
 206           SDA=1;
 207           return(temp);
 208          }
 209          */
 210          //=================================================
 211          //连写函数
 212          //add为读起始地址,ptr数据保存指针,writelen为写入数据长度
 213          uchar writebyteseq(uint add,uchar *ptr,uint writelen)
 214          {
 215   1       //uchar temp;
 216   1       uchar temph,templ;
 217   1      uint i;
 218   1       temph=(uchar)(add/256);
 219   1       templ=(uchar)(add%256);
 220   1        if(!STE)
 221   1       return 0XFF;
 222   1       SEN=0;
 223   1       if(!STE)
 224   1       {
 225   2        SCL=1;
 226   2       SDA=1;
 227   2       SEN=1;
 228   2       return 0XFF;
 229   2       }
 230   1       start();   
 231   1       outbyte(IIC_WRITE|(temph<<1));  
 232   1       nack(1);  
 233   1       outbyte(templ);
 234   1       nack(1);
 235   1       for(i=0;i<writelen;i++)
 236   1       {
 237   2        outbyte(*(ptr+i));
 238   2        nack(1);
 239   2       }
 240   1      
 241   1       stop(); 
C51 COMPILER V7.50   IIC                                                                   12/04/2007 21:53:32 PAGE 5   

 242   1         SCL=1;
 243   1       SDA=1;
 244   1       SEN=1;
 245   1        return 0;
 246   1      }
 247          //=================================================
 248          //连读函数
 249          //add为读起始地址,ptr数据保存指针,writelen为读出数据长度
 250          uchar readbyteseq(uint add,uchar *ptr,uint readlen)
 251          {
 252   1      
 253   1      xdata uchar temph,templ;
 254   1       uint i;
 255   1       EA=0;
 256   1      
 257   1       temph=(uchar)(add/256);
 258   1       templ=(uchar)(add%256);
 259   1         if(!STE)
 260   1         {
 261   2           SCL=1;
 262   2       SDA=1;
 263   2       SEN=1;
 264   2       return 0XFF;
 265   2       }
 266   1       SEN=0;
 267   1       if(!STE)
 268   1       {
 269   2        SCL=1;
 270   2       SDA=1;
 271   2       SEN=1;
 272   2       return 0XFF;
 273   2       }
 274   1       start();
 275   1       outbyte(IIC_WRITE|(temph<<1));
 276   1       nack(1);
 277   1       outbyte(templ);
 278   1       nack(1);
 279   1       start();
 280   1       outbyte(IIC_READ|(temph<<1));
 281   1       nack(1);
 282   1       for(i=0;i<readlen-1;i++)
 283   1       {
 284   2        *(ptr+i)=inbyte();
 285   2        ack();
 286   2        
 287   2       }
 288   1       *(ptr+readlen-1)=inbyte();
 289   1       nack(0);
 290   1       stop();
 291   1         SCL=1;
 292   1       SDA=1;
 293   1       SEN=1;
 294   1       return 0;
 295   1      }
 296          //=======================================================
 297          //THIS IS A TEST OPERATION 
 298          
 299          void delay10ms(void)
 300          {
 301   1      xdata int i;
 302   1      for(i=0;i<1000;i++)
 303   1      ;
C51 COMPILER V7.50   IIC                                                                   12/04/2007 21:53:32 PAGE 6   

 304   1      }
 305          //=======================================================
 306          //THIS IS A TEST OPERATION 
 307          
 308          
 309          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    527    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   2232      14
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1    ----
   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 + -