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

📄 comram.lst

📁 这是一个单片机的项目
💻 LST
字号:
C51 COMPILER V7.50   COMRAM                                                                03/17/2008 20:43:15 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE COMRAM
OBJECT MODULE PLACED IN ComRam.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE ComRam.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /****************************************************************************************
   2          File: ComRam.c
   3          Description:用来读写公共RAM的IIC程序。
   4          Author: ganzi535@qq.com Joehill.Net@qq.com
   5          Date:   September,2007
   6          ****************************************************************************************/
   7          #include<string.h>
   8          #include <SM89516A.h>
   9          #include<intrins.h>
  10          #include"SerialPort.h"
  11          
  12          #define uchar unsigned char
  13          #define uint  unsigned int
  14          
  15          #define WRITE 0xa0
  16          #define READ  0xa1 
  17          #define DELAY 5
  18          
  19          /*端口位定义*/
  20          sbit SCL=P0^0;            /*模拟I2C时钟控制位*/
  21          sbit SDA=P0^1;            /*模拟I2C数据传送位*/
  22          bit  Ack2;                /*应答标志位*/
  23          
  24          
  25          /****************************************************************************************
  26          功能:ComStart,起动总线函数.
  27          描述:启动I2C总线,即发送I2C起始条件.
  28          参数:无
  29          返回:无
  30          ****************************************************************************************/
  31          void ComStart()
  32          {
  33   1        SDA=1;   /*发送起始条件的数据信号*/
  34   1        Delay(DELAY);
  35   1      
  36   1        SCL=1;    /*起始条件建立时间大于4.7us,延时*/
  37   1        Delay(DELAY);   
  38   1      
  39   1        SDA=0;   /*发送起始信号*/ /* 起始条件锁定时间大于4μs*/
  40   1        Delay(DELAY);   
  41   1          
  42   1        SCL=0;   /*钳住I2C总线,准备发送或接收数据 */
  43   1        Delay(DELAY);
  44   1      }
  45          
  46          /****************************************************************************************
  47          功能:ComStop,结束总线函数.
  48          描述:结束I2C总线,即发送I2C结束条件.
  49          参数:无
  50          返回:无
  51          ****************************************************************************************/
  52          void ComStop()
  53          {
  54   1        SDA=0;  /*发送结束条件的数据信号*/
  55   1        Delay(DELAY); 
C51 COMPILER V7.50   COMRAM                                                                03/17/2008 20:43:15 PAGE 2   

  56   1      
  57   1        SCL=1;  /*结束条件建立时间大于4μs*/
  58   1        Delay(DELAY);
  59   1      
  60   1        SDA=1;  /*发送I2C总线结束信号*/
  61   1        Delay(DELAY);
  62   1      }
  63          
  64          /****************************************************************************************
  65          功能:ComSendByte,字节数据传送函数.
  66          描述:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答
  67               或者非应答都使ack=0 假)发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
  68          参数:c---需要发送的字符。
  69          返回:无
  70          ****************************************************************************************/
  71          void ComSendByte(uchar c)
  72          {
  73   1          uchar BitCnt;
  74   1       
  75   1          for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
  76   1          {
  77   2            if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/
  78   2              else  SDA=0;       
  79   2               
  80   2            Delay(DELAY);
  81   2            SCL=1;        /*置时钟线为高,通知被控器开始接收数据位保证时钟高电平周期大于4μs*/
  82   2      
  83   2            Delay(DELAY);       
  84   2            SCL=0; 
  85   2          }
  86   1          
  87   1          Delay(DELAY);
  88   1          SDA=1;         /*8位发送完后释放数据线,准备接收应答位*/
  89   1          Delay(DELAY);
  90   1      
  91   1          SCL=1;
  92   1          Delay(DELAY);
  93   1      
  94   1          if(SDA==1)    /*判断是否接收到应答信号*/
  95   1                Ack2=0;     
  96   1          else 
  97   1                Ack2=1;        
  98   1      
  99   1          SCL=0;
 100   1          Delay(DELAY);
 101   1      }
 102          
 103          /****************************************************************************************
 104          功能:ComRcvByte,字节数据传送函数。
 105          描述:用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数。
 106          参数:无
 107          返回:无
 108          ****************************************************************************************/
 109          uchar ComRcvByte()
 110          {
 111   1        uchar retc,BitCnt;
 112   1        
 113   1        retc=0; 
 114   1        SDA=1;             /*置数据线为输入方式*/
 115   1      
 116   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 117   1        {
C51 COMPILER V7.50   COMRAM                                                                03/17/2008 20:43:15 PAGE 3   

 118   2           Delay(DELAY);           
 119   2           SCL=0;         /*置时钟线为低,准备接收数据位*/  /*时钟低电平周期大于4.7μs*/
 120   2           Delay(DELAY);
 121   2      
 122   2           SCL=1;         /*置时钟线为高使数据线上数据有效*/
 123   2           Delay(DELAY);
 124   2      
 125   2           retc=retc<<1;
 126   2      
 127   2           if(SDA==1)    /*读数据位,接收的数据位放入retc中 */
 128   2                 retc=retc+1; 
 129   2           Delay(DELAY);
 130   2        }
 131   1      
 132   1        SCL=0;    
 133   1        Delay(DELAY);
 134   1      
 135   1        return(retc);
 136   1      }
 137          
 138          /****************************************************************************************
 139          功能:ComAck,应答子函数。
 140          描述:主控器进行应答信号,(可以是应答或非应答信号)。
 141          参数:a---应答与否,a==1应答,a==0不应答。
 142          返回:无
 143          ****************************************************************************************/
 144          void ComAck(bit a)
 145          {
 146   1        
 147   1        if(a==0)
 148   1          SDA=0;     /*在此发出应答或非应答信号 */
 149   1        else 
 150   1              SDA=1;
 151   1        Delay(DELAY);     
 152   1      
 153   1        SCL=1;       /*时钟低电平周期大于4μ*/
 154   1        Delay(DELAY);  
 155   1      
 156   1        SCL=0;       /*清时钟线,钳住I2C总线以便继续接收*/
 157   1        Delay(DELAY);   
 158   1      }
 159           
 160          /****************************************************************************************
 161          功能:ComWriteOneByte,向有子地址器件发送字节数据函数。
 162          描述:从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.如果返回1表示操作成功,否
 163               则操作有误,使用前必须已结束总线。
 164          参数:sla---器件地址;c---发送的字符。
 165          返回:无
 166          ****************************************************************************************/
 167          bit ComWriteOneByte(uint sla,uchar c)
 168          {
 169   1         ComStart();                                  //启动总线
 170   1      
 171   1         ComSendByte(WRITE);       if(Ack2==0)return(0);   //发送器件地址   
 172   1         ComSendByte(sla>>8);      if(Ack2==0)return(0);   //高address
 173   1         ComSendByte(sla);         if(Ack2==0)return(0);   //low address 
 174   1         ComSendByte(c);           if(Ack2==0)return(0);   //发送数据
 175   1         
 176   1         ComStop();                 /*结束总线*/ 
 177   1         return(1);
 178   1      }
 179          
C51 COMPILER V7.50   COMRAM                                                                03/17/2008 20:43:15 PAGE 4   

 180          /****************************************************************************************
 181          功能:ComWriteBytes,向有子地址器件发送多字节数据函数。
 182          描述:从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件地址sla,子地址suba,发送
 183               内容是s指向的内容,发送no个字节。 如果返回1表示操作成功,否则操作有误。使用前必须已
 184                   结束总线。
 185          参数:suba---子地址,s---指向发送的内容,no---发送字符个数。
 186          返回:写成功则返回1,否则返回0.
 187          ****************************************************************************************/
 188          bit ComWriteBytes(uint suba,uchar *s,uchar no)
 189          {
 190   1         uchar i;
 191   1      
 192   1         ComStart();      
 193   1                 
 194   1         ComSendByte(WRITE);    
 195   1         if(Ack2==0)return(0);
 196   1      
 197   1         ComSendByte(suba>>8);  
 198   1         if(Ack2==0)return(0);
 199   1      
 200   1         ComSendByte(suba);     
 201   1         if(Ack2==0)return(0);
 202   1         
 203   1         for(i=0;i<no;i++)
 204   1          {   
 205   2             ComSendByte(*s);   
 206   2                 if(Ack2==0)return(0);                      
 207   2             s++;
 208   2          } 
 209   1      
 210   1        ComStop();  
 211   1        return(1);
 212   1      }
 213          
 214          /****************************************************************************************
 215          功能:ComReadOneByte,向无子地址器件读字节数据函数。
 216          描述:从启动总线到发送地址,读数据,结束总线的全过程,从器件地址sla,返回值在c.如果返回1表
 217               示操作成功,否则操作有误。使用前必须已结束总线。
 218          参数:sla---器件地址。
 219          返回:返回读取的字符。
 220          ****************************************************************************************/
 221          uchar ComReadOneByte(uint sla)
 222          {
 223   1         uchar x;
 224   1         ComStart();               /*启动总线*/
 225   1      
 226   1         ComSendByte(WRITE);   
 227   1         if(Ack2==0)return(0);    //发送器件地址
 228   1      
 229   1         ComSendByte(sla>>8);  
 230   1         if(Ack2==0)return(0);    //高address 
 231   1      
 232   1         ComSendByte(sla);     
 233   1         if(Ack2==0)return(0);    //low address
 234   1         
 235   1        ComStart();
 236   1      
 237   1        ComSendByte(READ);     
 238   1        if(Ack2==0)return(0);  
 239   1         
 240   1        x=ComRcvByte();
 241   1        return x;
C51 COMPILER V7.50   COMRAM                                                                03/17/2008 20:43:15 PAGE 5   

 242   1      }
 243          
 244          /****************************************************************************************
 245          功能:ComReadBytes,向有子地址器件读取多字节数据函数。
 246          描述:从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件地址sla,子地址suba,读
 247               出的内容放入s指向的存储区,读no个字节。使用前必须已结束总线。
 248          参数:suba---子地址,s---指向发送的内容,no---发送字符个数。
 249          返回:如果返回1表示操作成功,否则操作有误。
 250          ****************************************************************************************/
 251          bit ComReadBytes(uint suba,uchar *s,uchar no)
 252          {
 253   1         uchar i;
 254   1      
 255   1         ComStart();            
 256   1         
 257   1         ComSendByte(WRITE);     
 258   1         if(Ack2==0)return(0);
 259   1               
 260   1         ComSendByte(suba>>8);   
 261   1         if(Ack2==0)return(0);   
 262   1               
 263   1         ComSendByte(suba);      
 264   1         if(Ack2==0)return(0);
 265   1          
 266   1         ComStart();
 267   1      
 268   1         ComSendByte(READ);      
 269   1         if(Ack2==0)return(0);
 270   1          
 271   1         for(i=0;i<no-1;i++)
 272   1         {   
 273   2            *s=ComRcvByte();             
 274   2            ComAck(0);                  
 275   2            s++;
 276   2         } 
 277   1      
 278   1          *s=ComRcvByte();
 279   1          ComAck(1);     
 280   1                  
 281   1         ComStop();                  
 282   1         return(1);
 283   1      }
 284          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    597    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      23
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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