leddisp.lst

来自「嵌入式系统中的一个显示器的驱动程序」· LST 代码 · 共 313 行

LST
313
字号
C51 COMPILER V6.12  LEDDISP                                                                01/29/2005 21:44:44 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE LEDDISP
OBJECT MODULE PLACED IN .\leddisp.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\leddisp.c DEBUG OBJECTEXTEND

stmt level    source

*** WARNING C500 IN LINE 1 OF .\LEDDISP.C: MISSING DEVICE (SECURITY KEY NOT FOUND)
   1          #include<head.h>
   2          
   3          void WordLoad(void);
   4          
   5          /*---------------------------------------------------------------------------------*/
   6          /*                         通讯用的函数                                            */
   7          /*---------------------------------------------------------------------------------*/
   8          void  COM(void);
   9          void  NAPCOMM(void);
  10          void  serial(void);
  11          void  WSBUF(unsigned char ch);
  12          void  ModbusCrc(unsigned char x);
  13          /*---------------------------------------------------------------------------------*/
  14          /*                         显示用的函数                                           */
  15          /*---------------------------------------------------------------------------------*/
  16          void OUT(unsigned char start,unsigned char size);
  17          /*---------------------------------------------------------------------------------*/
  18          /*                         通讯用的变量                                         */
  19          /*---------------------------------------------------------------------------------*/
  20          unsigned int  idata CRC2;
  21          unsigned int idata  yafslong=0,yifslong=0;
  22          unsigned char idata  comml=0,crc=0,modbus0=0;
  23          bit          yxfs=0;
  24          unsigned data T2MS=0;
  25          /*---------------------------------------------------------------------------------*/
  26          /*                        内部变量                                         */
  27          /*---------------------------------------------------------------------------------*/
  28          unsigned char data ledcs=1;
  29          unsigned char code dd[64]={0x02,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x0F,0xE0,0x08,0x20,0x0F,0xE0,0x00,0x00
             -,
  30          0x7F,0xFC,0x40,0x04,0x4F,0xE4,0x48,0x24,0x48,0x24,0x4F,0xE4,0x40,0x14,0x40,0x08,0x08,0x02,0x08,0x02,0x14,0
             -x12,0x13,0x12,0x21,0xD2,0x40,0x92,0xBF,0x12,0x21,0x12,
  31          0x21,0x12,0x25,0x12,0x22,0x12,0x20,0x82,0x20,0x82,0x20,0x8A,0x1F,0x84,0x00,0x00};
  32          unsigned char tempi=0;
  33          unsigned char temp=0;
  34          unsigned char timei=0;
  35          
  36          unsigned char str[3]="上";
  37          main()
  38          {
  39   1      AUXR=0x00;
  40   1      
  41   1      IE=0X9A;
  42   1      IP=0X02;
  43   1      TMOD=0X11;
  44   1      TH0=0XF8;TL0=0X2F;
  45   1      TH1=0X9E;TL0=0X58;
  46   1      TR0=1;TR1=1;
  47   1      
  48   1      P1=0Xff;
  49   1      XBYTE[0x2003]=0xff;
  50   1      XBYTE[0x2001]=0xff;
  51   1      XBYTE[0x2002]=0xFc;
  52   1      XBYTE[0x2003]=0x3;
C51 COMPILER V6.12  LEDDISP                                                                01/29/2005 21:44:44 PAGE 2   

  53   1      
  54   1      SCON=0x50;
  55   1      TL2=0;TH2=0;T2CON=0x34;  //串行口设置(用T2作为波特率发生定时器)
  56   1      RCAP2H=0xFF;RCAP2L=0xDC;RS485=1;
  57   1      
  58   1      de=1;
  59   1      RS485=1;
  60   1      
  61   1      WordCode[0]=0xb4;//str[0];
  62   1      WordCode[1]=0xb4;//str[1];
  63   1      
  64   1      
  65   1      for(;;){
  66   2      
  67   2             }
  68   1      }
  69          
  70          void TimeInt0(void) interrupt 1
  71          {
  72   1      
  73   1      TH0=0XF8;TL0=0X2F;
  74   1      P1=0XFF;
  75   1      
  76   1      
  77   1      XBYTE[0x2001]=Character[temp];//+tempi*32];
  78   1      XBYTE[0x2003]=Character[temp+8];//+1+tempi*32];
  79   1      XBYTE[0x2000]=Character[temp+16];//+16+tempi*32];
  80   1      XBYTE[0x2002]=Character[temp+24];///+17+tempi*32];
  81   1      
  82   1      temp++;
  83   1      P1=~ledcs;
  84   1      //WordLoad();
  85   1      ledcs=ledcs<<1;
  86   1      if(ledcs==0){ledcs=1;temp=0;}
  87   1      
  88   1      
  89   1      
  90   1      }
  91          void TimeInt1(void) interrupt 3
  92          {
  93   1      TH1=0X9E;TL0=0X58;
  94   1      modbus0++;
  95   1      if(modbus0 >= 200)  {comml=0;}     //5s内没有后续报文,清空前面的报文
  96   1      COM();
  97   1      timei++;
  98   1      //if(timei>80){timei=0;tempi=!tempi;}
  99   1      if(timei>40){ 
 100   2      				   char i;
 101   2      					char tempword;
 102   2      						timei=0;
 103   2      					tempword=Character[15];
 104   2      					for(i=15;i>0;i--)Character[i]=Character[i-1];Character[15]=tempword;
 105   2                     tempword=Character[31];
 106   2      					for(i=31;i>16;i--)Character[i]=Character[i-1];Character[31]=tempword;
 107   2      				 }
 108   1      
 109   1      					
 110   1      }
 111          
 112          void WordLoad(void)
 113          {
 114   1      }
C51 COMPILER V6.12  LEDDISP                                                                01/29/2005 21:44:44 PAGE 3   

 115          
 116          
 117          void serial(void) interrupt 4
 118          {
 119   1      
 120   1      
 121   1      unsigned  char ch;
 122   1      if(RI)
 123   1         {       //RTU模式接收
 124   2              ch=SBUF;RI=0;modbus0=0;
 125   2              if((comml==0)&&(ch!=de)) {return;}   
 126   2              if(comml < 255)commd[comml++]=ch;// {commd[comml]=ch;comml++;}
 127   2         }
 128   1      else if(TI)
 129   1         {TI=0; 
 130   2          if(yxfs)
 131   2            {SBUF=ssbuf[yifslong++];
 132   3             if(yifslong==(yafslong+1))
 133   3                {
 134   4                  yifslong=0;yafslong=0;
 135   4                  yxfs=0;RS485=1;
 136   4                }
 137   3      
 138   3            }
 139   2         }
 140   1      
 141   1      }
 142          
 143          void  COM(void)
 144          {
 145   1      unsigned  int     chh,addr,ch1;
 146   1      unsigned  char    leng1,ch10;
 147   1      
 148   1      while(comml>6)
 149   1           {
 150   2                 if(commd[0]==de && (commd[1]==0x03 || commd[1]==0x06) ) {if(comml>=8) leng1 = 8; else return;}
 151   2                 else if(commd[0]==de && commd[1]==0x10 && commd[6]<0x60 ) {if(comml>=commd[6]+9) leng1=commd[6]
             -+9;else return;}
 152   2                 else { NAPCOMM(); continue;}
 153   2                 for(ch1=0,CRC2=0xFFFF;ch1<leng1-2;ch1++) ModbusCrc(commd[ch1]);         //计算crc
 154   2                 if((commd[comml-1]!=CRC2/256)||(commd[comml-2]!=CRC2%256)) {NAPCOMM();} 
 155   2      			  else  {break;}
 156   2           }
 157   1      
 158   1      if (comml<=6)       {return;}
 159   1      
 160   1      addr=((commd[2]*256+commd[3]))*2;                                  //开始地址
 161   1      
 162   1      
 163   1      switch(commd[1])
 164   1         {case 0x03:RS485=0;                                                //开始发送数据
 165   2                    crc=0;                                            //开始冒号
 166   2                    WSBUF(de);crc+=de;                                          //设备号
 167   2                    WSBUF(0x03);crc+=3;                                         //功能码
 168   2                    chh=2*(commd[4]*256+commd[5]);crc+=chh;WSBUF(chh);          //
 169   2                    for(ch1=0;ch1<chh;ch1++)
 170   2                       {
 171   3                       //  if(addr>=0x0040&&addr<=0x00A0)                              //浮点数字节倒序
 172   3                        //   {if(addr%2==0) {ch10=XBYTE[0x8000+addr+1];}
 173   3                       //     else       {ch10=XBYTE[0x8000+addr-1];}
 174   3                          // }
 175   3                        //else {  
C51 COMPILER V6.12  LEDDISP                                                                01/29/2005 21:44:44 PAGE 4   

 176   3                       ch10=XBYTE[0x8000+addr];//}
 177   3                       crc+=ch10;WSBUF(ch10);
 178   3                       addr=addr+1;
 179   3      
 180   3                       }                 //数据
 181   2                   
 182   2                    for(ch1=0,CRC2=0xFFFF;ch1<yafslong;ch1++)
 183   2                            ModbusCrc(ssbuf[ch1]);
 184   2                    WSBUF(CRC2%256);WSBUF(CRC2/256);
 185   2                    SBUF=ssbuf[0];yifslong=1;yxfs=1;
 186   2                    break;
 187   2      
 188   2               case 0x06:
 189   2                   if(addr == 0x00)
 190   2                   {}
 191   2                   else
 192   2                   {XBYTE[0x8000+addr]=commd[4];             //数据
 193   3                    XBYTE[0x8000+addr+1]=commd[5];}
 194   2                      OUT(0,1); 
 195   2      
 196   2                    RS485=0;
 197   2                    crc=0;                                            //开始冒号
 198   2                    WSBUF(de);crc+=de;                                          //设备号
 199   2                    WSBUF(0x06);crc+=6;                                         //功能码
 200   2                    ch1=commd[2];crc+=ch1;WSBUF(ch1);                           //开始地址
 201   2                    ch1=commd[3];crc+=ch1;WSBUF(ch1);
 202   2                    ch1=commd[4];crc+=ch1;WSBUF(ch1);                          //开始地址
 203   2                    ch1=commd[5];crc+=ch1;WSBUF(ch1);
 204   2                    
 205   2      				  for(ch1=0,CRC2=0xFFFF;ch1<yafslong;ch1++)
 206   2                            ModbusCrc(ssbuf[ch1]);
 207   2                    WSBUF(CRC2%256);WSBUF(CRC2/256);
 208   2                     
 209   2                     
 210   2                    SBUF=ssbuf[0];yifslong=1;yxfs=1;
 211   2                  
 212   2                    break;
 213   2         case 0x10:
 214   2                    RS485=0;           //开始发送数据
 215   2                    crc=0;                                            //开始冒号
 216   2                    WSBUF(de);crc+=de;                                          //设备号
 217   2                    WSBUF(0x10);crc+=0x10;                                         //功能码
 218   2                    ch1=commd[2];crc+=ch1;WSBUF(ch1);
 219   2                    ch1=commd[3];crc+=ch1;WSBUF(ch1);
 220   2                    ch1=commd[4];crc+=ch1;WSBUF(ch1);
 221   2                    ch1=commd[5];crc+=ch1;WSBUF(ch1);
 222   2                    
 223   2      		        for(ch1=0,CRC2=0xFFFF;ch1<yafslong;ch1++)
 224   2                            ModbusCrc(ssbuf[ch1]);
 225   2                    WSBUF(CRC2%256);WSBUF(CRC2/256);
 226   2                    
 227   2                    SBUF=ssbuf[0];yifslong=1;yxfs=1;
 228   2                    chh=commd[6];
 229   2                    for(ch1=0;ch1<chh;ch1++)
 230   2                     {
 231   3                       /* if(addr>=0x0040&&addr<=0x00A0)                              //浮点数字节倒序
 232   3                          {
 233   3                            tempaddr = addr + ch1;
 234   3                            if(tempaddr >= 0x0040 && tempaddr < 0x0060)
 235   3                            {       if(ch1%2==0) {XBYTE[tempaddr+1+0x8000]=commd[7+ch1];}
 236   3                                    else       {XBYTE[tempaddr-1+0x8000]=commd[7+ch1];}     }
 237   3                            else if(tempaddr >= 0x0060 && tempaddr < 0x00A0)
C51 COMPILER V6.12  LEDDISP                                                                01/29/2005 21:44:44 PAGE 5   

 238   3                            {
 239   3                            }
 240   3      
 241   3                           }
 242   3                        else {*/
 243   3                     XBYTE[addr+ch1+0x8000]=commd[7+ch1];//}
 244   3                     }     
 245   2                    break;
 246   2         }
 247   1      comml=0;
 248   1      }
 249          
 250          void NAPCOMM(void)               //将现在的报文第一个字符除去,并且找出后面第一个为站号的字符并且修整数组
 251          {
 252   1       unsigned int i14,pos1;
 253   1       pos1 = 0;
 254   1       
 255   1       for(i14=1;i14<comml;i14++) {if(commd[i14]==de) {pos1=i14;break;} }
 256   1       if(pos1>0) {
 257   2                   for(i14=pos1;i14<comml;i14++) commd[i14-pos1]=commd[i14]; comml-=pos1; }
 258   1       else {comml=0;}
 259   1       
 260   1      }
 261          
 262          void WSBUF(unsigned char ch)          //单字节发送
 263           {if(yafslong<0xff)ssbuf[yafslong++]=ch;}
 264          
 265          
 266          void ModbusCrc(unsigned char x)
 267          // modbus协议CRC校验, R7为输入校验字节,CRC2为校验字
 268          {
 269   1      unsigned char k,v;
 270   1      CRC2=CRC2^x;
 271   1      for(k=0;k<8;k++)
 272   1            {
 273   2            v=CRC2 %2;
 274   2            CRC2=CRC2>>1;
 275   2            if(v==1) {CRC2=CRC2^0xa001;}
 276   2            }
 277   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1681    ----
   CONSTANT SIZE    =     64    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      9      12
   IDATA SIZE       =      9    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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