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

📄 24c01a.lst

📁 C51单片机扩展的数据存储器24X01的读写驱动程序
💻 LST
字号:
C51 COMPILER V8.02   24C01A                                                                03/10/2007 21:11:14 PAGE 1   


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

line level    source

   1          
   2          #include <reg51.h>
   3          #include <intrins.h>
   4          //#include <stdio.h>
   5          //#include <absacc.h>
   6          
   7          #define uchar unsigned char
   8          #define uint unsigned int
   9          #define WriteDeviceAddress 0xa0
  10          #define ReadDviceAddress 0xa1
  11          
  12          
  13          
  14          
  15          uchar get_code(uchar i);
  16          void display(uchar i,uchar j,uchar k,uchar l);
  17          void DelayMs(uint number);
  18          void Start(void);
  19          void Stop(void);
  20          void Ack(void);
  21          void NoAck(void);
  22          bit TestAck(void);
  23          void Write8Bit(uchar input);
  24          uchar Read8Bit(void);
  25          void Write24c02(uchar Romadd,uchar number,uchar *Wdata);
  26          void Read24c02(uchar RomAddress, uchar num,uchar *RamAddress);
  27          
  28          
  29          
  30          sbit SCL=P1^6;
  31          sbit SDA=P1^7;
  32          bit bdata NACK=0;//器件坏或错误标志;
  33          uchar idata MTD[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //数据发送缓冲区
  34          uchar idata MRD[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //数据接收缓冲区
  35          
  36          /***************************************************************************/
  37          
  38          main()
  39          {
  40   1       uchar i;
  41   1       Write24c02(0x00,8,MTD);
  42   1       Read24c02(0x00,8,MRD);
  43   1       for(i=0;i<8;i++)
  44   1       {
  45   2        display(MRD[i],MRD[i],MRD[i],MRD[i]);
  46   2       }
  47   1       while(1);
  48   1      }
  49          
  50          /*************************************功能:发起始信号*******************************/
  51          /*****************当SCL为高电平时,SDA发生由高到低跳变为开始信号*********************/
  52          void Start()
  53          {SCL=0;
  54   1       SDA=1;
  55   1        _nop_();_nop_();_nop_();_nop_();
C51 COMPILER V8.02   24C01A                                                                03/10/2007 21:11:14 PAGE 2   

  56   1       SCL=1;
  57   1       _nop_();_nop_();_nop_();_nop_();
  58   1       SDA=0;
  59   1       _nop_();_nop_();_nop_();_nop_();
  60   1       SCL=0;
  61   1       return;
  62   1       }
  63           /***************************************************************************/
  64          
  65          
  66          
  67          
  68          
  69          /*********************************功能:发停止信**********************************/
  70          /****************当SCL为高电平时,SDA发生由低到高跳变为结束信号*******************/
  71          void Stop()
  72          { SCL=0;
  73   1        SDA=0;
  74   1        _nop_();_nop_();_nop_();_nop_();
  75   1        SCL=1;
  76   1        _nop_();_nop_();_nop_();_nop_();
  77   1        SDA=1;//放开总线
  78   1        _nop_();_nop_();_nop_();_nop_();
  79   1        return;
  80   1      }
  81          /***************************************************************************/
  82          
  83          
  84          
  85          
  86          /*********************************功能:发响应信号***************************/
  87          void Ack()
  88          {SCL=0;
  89   1       SDA=0;
  90   1        _nop_();_nop_();_nop_();_nop_();
  91   1       SCL=1;
  92   1       _nop_();_nop_();//_nop_();_nop_();
  93   1       SCL=0;
  94   1        _nop_();_nop_();_nop_();_nop_();
  95   1       return;
  96   1       }
  97           /***************************************************************************/
  98          
  99          
 100          
 101          
 102          
 103          /*********************************功能:发非响应信号*************************/
 104          void NoAck()
 105           {
 106   1       SCL=0;
 107   1       SDA=1;
 108   1       _nop_();_nop_();_nop_();_nop_();
 109   1       SCL=1;
 110   1        _nop_();_nop_();_nop_();_nop_();
 111   1        SCL=0;
 112   1        return;
 113   1      }
 114          /***************************************************************************/
 115          
 116          
 117          
C51 COMPILER V8.02   24C01A                                                                03/10/2007 21:11:14 PAGE 3   

 118          
 119          /*****************************测试响应信号(不完善需改动)**********************************/
 120          bit TestAck()
 121          {
 122   1         bit ErrorBit;
 123   1         SCL=0;
 124   1         SDA=1;
 125   1         _nop_();_nop_();_nop_();_nop_();
 126   1         SCL=1;
 127   1         _nop_();_nop_();_nop_();_nop_();
 128   1         ErrorBit=SDA;
 129   1         SCL=0;
 130   1         SDA=1;
 131   1         return(ErrorBit);
 132   1        }
 133          /***************************************************************************/
 134          
 135          
 136          
 137          
 138          
 139          
 140          
 141          
 142          
 143          /*****************************写一字节**********************************/
 144           void Write8Bit(unsigned char input)
 145           {
 146   1        unsigned char temp;
 147   1        for(temp=8;temp!=0;temp--)
 148   1         {
 149   2          SCL=0;
 150   2          SDA=(bit)(input&0x80);
 151   2          _nop_();_nop_();_nop_();_nop_();
 152   2          SCL=1;
 153   2          _nop_();_nop_();_nop_();_nop_();
 154   2          SCL=0;
 155   2          input=input<<1;
 156   2       }
 157   1      }
 158          /***************************************************************************/
 159          
 160          
 161          /********************************读一字节**********************************/
 162          unsigned char Read8Bit()
 163           {
 164   1        unsigned char temp,rbyte=0;
 165   1        SDA=1;
 166   1        for(temp=8;temp!=0;temp--)
 167   1        {
 168   2         SCL=0;
 169   2         _nop_();_nop_();_nop_();_nop_();
 170   2         SCL=1;
 171   2         _nop_();_nop_();_nop_();_nop_();
 172   2         rbyte=rbyte<<1;
 173   2         rbyte=rbyte|((unsigned char)(SDA));
 174   2         SCL=0;
 175   2         SDA=1;
 176   2        }
 177   1       return(rbyte);
 178   1      }
 179          /***************************************************************************/
C51 COMPILER V8.02   24C01A                                                                03/10/2007 21:11:14 PAGE 4   

 180          
 181          
 182          /*********************************多字节写操作******************************************/
 183          /*Wdata为待写数据所在的首地址,RomAddress为将存储的存储卡地址,number为将写入的数据个数*/
 184          
 185          void Write24c02(uchar RomAdd,uchar number,uchar *Wdata)
 186           {
 187   1       uchar i;
 188   1       Start();
 189   1       Write8Bit(WriteDeviceAddress); //发送从地址
 190   1       i=TestAck();
 191   1       if(i==1)
 192   1       {
 193   2        NACK=1;
 194   2        return;
 195   2       }
 196   1       Write8Bit(RomAdd);     //发送子地址
 197   1       i=TestAck();
 198   1       if(i==1)
 199   1          {
 200   2            NACK=1;
 201   2            return;
 202   2          }
 203   1      for(;number!=0;number--)
 204   1         {
 205   2             Write8Bit(*Wdata);
 206   2             i=TestAck();
 207   2             if(i==1)
 208   2               {
 209   3                 NACK=1;
 210   3                 return;
 211   3               }
 212   2              Wdata++;
 213   2      
 214   2         }
 215   1      
 216   1       Stop();
 217   1       DelayMs(10);
 218   1      
 219   1      }
 220          /**********************************************************************************/
 221          
 222          
 223          
 224          /*********************************多字节读操作***************************************/
 225          /*************RamAddress为待将读出的数据所放的单片机的首地址,RomAddress*************/
 226          /***************为待读数据在存储卡的首地址,number为将读出的数据个数*****************/
 227          void Read24c02(uchar RomAddress,uchar num,uchar *RamAddress)
 228          
 229          {
 230   1       uchar i;
 231   1       Start();
 232   1       Write8Bit(WriteDeviceAddress);
 233   1       i=TestAck();
 234   1        if(i==1)
 235   1       {
 236   2        NACK=1;
 237   2        return;
 238   2       }
 239   1       Write8Bit(RomAddress); //子地址
 240   1       i=TestAck();
 241   1        if(i==1)
C51 COMPILER V8.02   24C01A                                                                03/10/2007 21:11:14 PAGE 5   

 242   1       {
 243   2        NACK=1;
 244   2        return;
 245   2       }
 246   1       Start();
 247   1       Write8Bit(ReadDviceAddress);
 248   1       i=TestAck();
 249   1        if(i==1)
 250   1       {
 251   2        NACK=1;
 252   2        return;
 253   2       }
 254   1       while(num!=1)
 255   1        {
 256   2       *RamAddress=Read8Bit();
 257   2       Ack();
 258   2       RamAddress++;
 259   2       num--;
 260   2       }
 261   1       *RamAddress=Read8Bit();
 262   1       NoAck();
 263   1       Stop();
 264   1      }
 265          /***************************************************************************/
 266          
 267          
 268          
 269          //-----------------------------------------------------------------
 270          //函数名称:DelayMS()
 271          //功能:实现廷时(number)mS
 272          //-----------------------------------------------------------------
 273          void DelayMs(uint number)
 274          {
 275   1       unsigned char temp;
 276   1       for(;number!=0;number--)
 277   1        {
 278   2            for(temp=125;temp!=0;temp--)
 279   2            {  }
 280   2        }
 281   1      }
 282          
 283          
 284          
 285           //--------------------------------------------------------------
 286           //函数名称:get_code
 287           //功能:获得对应的共阳极码
 288           //--------------------------------------------------------
 289          uchar get_code(uchar k)
 290          {
 291   1      unsigned char p;
 292   1                switch (k){
 293   2                      case  0:        p=0x3F; break;  /*0*/
 294   2              case  1:    p=0x06;     break;  /*1*/
 295   2              case  2:    p=0x5B;     break;  /*2*/
 296   2              case  3:    p=0x4F;     break;  /*3*/
 297   2              case  4:    p=0x66;     break;  /*4*/
 298   2              case  5:    p=0x6D;     break;  /*5*/
 299   2              case  6:    p=0x7D;     break;  /*6*/
 300   2              case  7:    p=0x07;     break;  /*7*/
 301   2              case  8:    p=0x7F;     break;  /*8*/
 302   2              case  9:    p=0x67;     break;  /*9*/
 303   2              case 10:    p=0x77;     break;  /*A*/
C51 COMPILER V8.02   24C01A                                                                03/10/2007 21:11:14 PAGE 6   

 304   2              case 11:    p=0x7C;     break;  /*B*/
 305   2              case 12:    p=0x39;     break;  /*C*/
 306   2              case 13:    p=0x5E;     break;  /*D*/
 307   2              case 14:    p=0x79;     break;  /*E*/
 308   2              case 15:    p=0x71;     break;  /*F*/
 309   2              case 16:    p=0x00;     break;  /*灭灯*/
 310   2                      default:                                break;}
 311   1                return (p);
 312   1      }
 313          
 314          
 315          //-----------------------------------------------------------
 316          //函数名称:display
 317          //功能:动态数码显示
 318          //-----------------------------------------------------------
 319          void display(uchar i,uchar j,uchar k,uchar l)
 320          {  uchar ii;
 321   1        for(ii=0;ii<250;ii++)
 322   1        {
 323   2        P0=get_code(i);
 324   2        P2=0x8F;
 325   2        DelayMs(2);
 326   2        P0=get_code(j);
 327   2        P2=0x4F;
 328   2        DelayMs(2);
 329   2        P0=get_code(k);
 330   2        P2=0x2F;
 331   2        DelayMs(2);
 332   2        P0=get_code(l);
 333   2        P2=0x1F;
 334   2        DelayMs(2);
 335   2        }
 336   1        P2=0x0F;
 337   1        }
 338          
 339          
 340          
 341          
 342          
 343          
 344          
 345          
 346          
 347          
 348          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    610    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       5
   IDATA SIZE       =     16    ----
   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 + -