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

📄 iic.lst

📁 俄罗斯方块的源代码雅俗文件
💻 LST
字号:
C51 COMPILER V7.50   IIC                                                                   11/14/2007 11:29:07 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 OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*
   2          本项目专门为本站的51 PIC AVR 多功能学习开发板而写,仅供参考,请勿做商业用途,欢迎转载但要保留本站信息
   3                                            志博电子专注于8位单片机开发板设计和教学  
   4                                                让人耳目一心的经济又豪华型开发板
   5                                                          性价比最高 
   6                                                           仅售378! 
   7          欢迎访问我们的网站 www.elecmcu.com                                              
   8          */
   9          #define IIC_READ 0XA1    //定义读指令
  10          #define IIC_WRITE 0XA0   //定义写指令
  11          #define NOP _nop_()
  12          #define uchar unsigned char
  13          #define uint  unsigned int
  14          #include "reg52.h"
  15          #define IIC_READ 0XA1    //定义读指令
  16          #define IIC_WRITE 0XA0   //定义写指令
  17          #define NOP _nop_()
  18          uchar readbyteseq(uint add,uchar *ptr,uint readlen);
  19          uchar writebyteseq(uint add,uchar *ptr,uint writelen);
  20          void delay10ms(void);
  21          //#define SDA INT0
  22          //#define SCL T0
  23          //==============================
  24          uchar xdata buff[2000]; //save the byte read out  form iic device in test operation
  25          uchar xdata readbuff[232];//测试数组,暂存写入读出数据
  26          //uchar writebuff[32];
  27          //===============================
  28          sbit SDA=P3^5;//P2^7; //THE SDA BIT IS PORT 2 BIT 7
  29          sbit SCL=P3^4;//P2^6; //THE SCL BIT IS PORT 2 BIT 6
  30          sbit SEN=P3^3;//P2^6; //THE SCL BIT IS PORT 2 BIT 6
  31          sbit STE=P3^2;//P2^6; //THE SCL BIT IS PORT 2 BIT 6
  32          uchar bdata bbyte;//定义位操作用数组,采用此方法可提高位操作速度
  33          sbit a0=bbyte^0;
  34          sbit a1=bbyte^1;
  35          sbit a2=bbyte^2;
  36          sbit a3=bbyte^3;
  37          sbit a4=bbyte^4;
  38          sbit a5=bbyte^5;
  39          sbit a6=bbyte^6;
  40          sbit a7=bbyte^7;
  41          //========================================
  42          bit IFACK; //record the SDA state to confirn if ACK has happened 
  43          bit NO_ACK; //no ack flag
  44          bit BUS_FAULT; //bus fault flag
  45          //========================================
  46          void start(void)
  47          {
  48   1       SCL=0;
  49   1       SDA=1;
  50   1       SCL=1;
  51   1       SDA=0;
  52   1       SCL=0;
  53   1      }
  54          //=======================================
  55          //FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL
C51 COMPILER V7.50   IIC                                                                   11/14/2007 11:29:07 PAGE 2   

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

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

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

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

 304   1       SEN=1;
 305   1       return 0;
 306   1      }
 307          
 308          
 309          void delay10ms(void)
 310          {
 311   1      xdata int i;
 312   1      for(i=0;i<1000;i++)
 313   1      ;
 314   1      }
 315          
 316          
 317          
 318          


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