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

📄 24c01.lst

📁 24c01的读写程序
💻 LST
字号:
C51 COMPILER V7.06   24C01                                                                 02/28/2006 10:27:07 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 24C01
OBJECT MODULE PLACED IN 24c01.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 24c01.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /**************************************************
   2          ;    平凡单片机工作室
   3          ;  http://www.mcustudio.com
   4          ;   (c) Copyright 2003 Pingfan's McuStudio
   5          ;    All rights Reserved
   6          ;24C01.C
   7          ;作者:周坚   
   8          ;功能描述:
   9          ;PC端发送3个数据 n0,n1,n2
  10          ;n0=0,写,将n1写入n2地址中
  11          ;n0=1,读,读出n1地址中的数据,n2不起作用,但必须有
  12          ;收到一个字节后,将其地址值显示在数码管第1、2位上,数值显示在第5、6位上
  13          ;读出一个字节后,将其地址值显示在数码管第1、2位上,读出的值显示在第5、6位上
  14          ;**************************************************/
  15          #define uchar unsigned char
  16          #define uint  unsigned int
  17          #define Slaw    0x0a;   //写命令字
  18          #define Slar    0xa1;   //读命令字
  19          #include "reg52.h"
  20          #include "intrins.h"
  21          
  22                  sbit    Scl=P3^6;       //串行时钟
  23                  sbit    Sda=P3^7;       //串行数据
  24          
  25          
  26                  bit     Rec;            //接收到数据的标志
  27                  uchar   RecBuf[3];      //接收缓冲区
  28          
  29          #define Hidden 0x10;    //消隐字符在字形码表中的位置
  30          uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};
  31          uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF
             -};
  32          uchar DispBuf[6];       //6字节的显示缓冲区
  33          
  34          uchar code TH0Val=63266/256;
  35          uchar code TL0Val=63266%256;//当晶振为11.0592时,定时2.5ms的定时器初值
  36          
  37          //以下是中断程序,用于显示
  38          void Timer0() interrupt 1
  39          {       uchar tmp;
  40   1              static uchar    dCount; //计数器,显示程序通过它得知现正显示哪个数码管
  41   1              TH0=TH0Val;
  42   1              TL0=TL0Val;     
  43   1              tmp=BitTab[dCount];             //根据当前的计数值取位值
  44   1              P2=P2|0xfc;                             //P2与11111100B相或,将高6位置1
  45   1              P2=P2&tmp;                              //P2与取出的位值相与,将某一位清零
  46   1              tmp=DispBuf[dCount];    //根据当前的计数值取显示缓冲待显示值    
  47   1              tmp=DispTab[tmp];               //取字形码
  48   1              P0=tmp;                                 //送出字形码
  49   1              dCount++;                               //计数值加1
  50   1              if(dCount==6)                   //如果计数值等于6,则让其回0
  51   1                      dCount=0;       
  52   1      }
  53          
  54          /*发送起始条件*/
C51 COMPILER V7.06   24C01                                                                 02/28/2006 10:27:07 PAGE 2   

  55          void Start(void)        /*起始条件*/
  56          {
  57   1              Sda=1;
  58   1              Scl=1;
  59   1              _nop_ ();
  60   1              _nop_ ();
  61   1              _nop_ ();
  62   1              _nop_ ();
  63   1              Sda=0;
  64   1              _nop_ ();
  65   1              _nop_ ();
  66   1              _nop_ ();
  67   1              _nop_ ();
  68   1      }
  69          void Stop(void) /*停止条件*/
  70          {
  71   1              Sda=0;
  72   1              Scl=1;
  73   1              _nop_ ();
  74   1              _nop_ ();
  75   1              _nop_ ();
  76   1              _nop_ ();
  77   1              Sda=1;
  78   1              _nop_ ();
  79   1              _nop_ ();
  80   1              _nop_ ();
  81   1              _nop_ ();
  82   1      }
  83          void Ack(void)  /*应答位*/
  84          {
  85   1              Sda=0;
  86   1              _nop_ ();
  87   1              _nop_ ();
  88   1              _nop_ ();
  89   1              _nop_ ();
  90   1              Scl=1;
  91   1              _nop_ ();
  92   1              _nop_ ();
  93   1              _nop_ ();
  94   1              _nop_ ();
  95   1              Scl=0;
  96   1      }
  97          void  NoAck(void)       /*反向应答位*/
  98          {
  99   1              Sda=1;
 100   1              _nop_ ();
 101   1              _nop_ ();
 102   1              _nop_ ();
 103   1              _nop_ ();
 104   1              Scl=1;
 105   1              _nop_ ();
 106   1              _nop_ ();
 107   1              _nop_ ();
 108   1              _nop_ ();
 109   1              Scl=0;
 110   1      }
 111          void Send(uchar Data)   /*发送数据子程序,Data为要求发送的数据*/
 112          {
 113   1              uchar BitCounter=8;       /*位数控制*/
 114   1              uchar temp;     /*中间变量控制*/
 115   1              do
 116   1              {
C51 COMPILER V7.06   24C01                                                                 02/28/2006 10:27:07 PAGE 3   

 117   2                 temp=Data;
 118   2                 Scl=0;
 119   2                 _nop_ ();
 120   2                 _nop_ ();
 121   2                 _nop_ ();
 122   2                 _nop_ ();
 123   2                 if((temp&0x80)==0x80)/* 如果最高位是1*/
 124   2                      Sda=1;
 125   2                 else
 126   2                      Sda=0;
 127   2                 Scl=1;
 128   2                 temp=Data<<1;        /*RLC*/
 129   2                 Data=temp;
 130   2                 BitCounter--;
 131   2               }while(BitCounter);
 132   1               Scl=0;
 133   1      }
 134          uchar Read(void) /*读一个字节的数据,并返回该字节值*/
 135          {
 136   1              uchar temp=0;
 137   1              uchar temp1=0;
 138   1              uchar BitCounter=8;
 139   1              Sda=1;
 140   1              do{
 141   2                Scl=0;
 142   2                _nop_ ();
 143   2                _nop_ ();
 144   2                _nop_ ();
 145   2                _nop_ ();
 146   2                Scl=1;
 147   2                _nop_ ();
 148   2                _nop_ ();
 149   2                _nop_ ();
 150   2                _nop_ ();
 151   2                if(Sda)       /*如果Sda=1;*/
 152   2                      temp=temp|0x01;  /*temp的最低位置1*/
 153   2                else
 154   2                      temp=temp&0xfe;  /*否则temp的最低位清0*/
 155   2                if(BitCounter-1)
 156   2                {   temp1=temp<<1;
 157   3                    temp=temp1;
 158   3                }
 159   2                BitCounter--;
 160   2              }while(BitCounter);
 161   1              return(temp);
 162   1      }
 163          void WrToROM(uchar Data[],uchar Address,uchar Num)
 164          {
 165   1           uchar i=0;
 166   1           uchar *PData;
 167   1           PData=Data;
 168   1           Start();        
 169   1           Send(0xa0);    
 170   1           Ack();
 171   1           Send(Address);  
 172   1           Ack();
 173   1           for(i=0;i<Num;i++)
 174   1           {
 175   2              Send(*(PData+i));
 176   2              Ack();
 177   2           }
 178   1           Stop();
C51 COMPILER V7.06   24C01                                                                 02/28/2006 10:27:07 PAGE 4   

 179   1      }
 180          void  RdFromROM(uchar Data[],uchar Address,uchar Num)
 181          {
 182   1           uchar i=0;
 183   1           uchar *PData;
 184   1           PData=Data;
 185   1           for(i=0;i<Num;i++)
 186   1           {
 187   2              Start();
 188   2              Send(0xa0);
 189   2              Ack();
 190   2              Send(Address+i);
 191   2              Ack();
 192   2              Start();
 193   2              Send(0xa1);
 194   2              Ack();
 195   2              *(PData+i)=Read();
 196   2              Scl=0;
 197   2              NoAck();
 198   2              Stop();
 199   2         }
 200   1      }
 201          
 202          void Recive() interrupt 4       //串行中断程序
 203          {       static uchar Count=0;
 204   1              if(TI)
 205   1              {       TI=0;
 206   2                      return; //如果是发送中断,直接退出
 207   2              }
 208   1              RI=0;           //清RI标志
 209   1              RecBuf[Count]=SBUF;
 210   1              Count++;
 211   1              Rec=0;
 212   1              if(Count>=3)
 213   1              {       Count=0;
 214   2                      Rec=1;          //置位标志
 215   2              }
 216   1      }
 217          
 218          void Init()
 219          {       TMOD=0x21;
 220   1              RI=0;
 221   1              TH1=0xfd;
 222   1              TL1=0xfd;
 223   1              PCON|=0x80;
 224   1              TR1=1;
 225   1              SCON=0x50;
 226   1      
 227   1              TH0=TH0Val;
 228   1              TL0=TL0Val;     
 229   1              ET0=1;                          //开T0中断
 230   1              EA=1;                           //开总中断
 231   1              ES=1;
 232   1              TR0=1;                          //T0开始运行
 233   1              TR1=1;
 234   1      }
 235          
 236          void Calc(uchar Dat1,uchar Dat2)        //第一个参数放在第1、2位,第二个参数放入第5、6位
 237          {       DispBuf[0]=Dat1/16;
 238   1              DispBuf[1]=Dat1%16;
 239   1      
 240   1              DispBuf[4]=Dat2/16;
C51 COMPILER V7.06   24C01                                                                 02/28/2006 10:27:07 PAGE 5   

 241   1              DispBuf[5]=Dat2%16;
 242   1      }
 243                  
 244          void main()
 245          {       uchar   RomDat[4];
 246   1              Init();                                                 //初始化
 247   1              DispBuf[2]=Hidden;
 248   1              DispBuf[3]=Hidden;
 249   1              for(;;)
 250   1              {                       
 251   2                      Calc(RecBuf[1],RomDat[0]);      //分别显示地址和数据
 252   2                      if(Rec)                                         //接收到数据
 253   2                      {       Rec=0;                                  //清除标志
 254   3                              if(RecBuf[0]==0)                //第一种功能,写入
 255   3                              {       RomDat[0]=RecBuf[2];
 256   4                                      WrToROM(RomDat,RecBuf[1],1);
 257   4                                      SBUF=RomDat[0]; 
 258   4                              }
 259   3                              else
 260   3                              {       RdFromROM(RomDat,RecBuf[1],1);
 261   4                                      SBUF=RomDat[0];
 262   4                              }
 263   3                      }
 264   2              }
 265   1      }       
 266          
 267          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    517    ----
   CONSTANT SIZE    =     25    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     11      20
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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