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

📄 serial.lst

📁 uCOS-II 2.52在51上的移植程序(大模式).rar
💻 LST
📖 第 1 页 / 共 2 页
字号:
 213   1              //EA=0;
 214   1      //入临界区
 215   1      #pragma ASM
 216   1          PUSH IE;
 217   1          CLR EA;
 218   1      #pragma ENDASM
 219   1              insidePrintWord(Word);
 220   1              //EA=1;
 221   1      //出临界区
 222   1      #pragma ASM
 223   1          POP IE;
 224   1      #pragma ENDASM
 225   1      }
 226          
 227          void PrintLong(unsigned long LongWord) reentrant//以十六进制格式显示1个长字数据
 228          {
 229   1              //EA=0;
 230   1      //入临界区
 231   1      #pragma ASM
 232   1          PUSH IE;
 233   1          CLR EA;
 234   1      #pragma ENDASM
 235   1              insidePrintWord(LongWord>>16);
 236   1              insidePrintWord(LongWord&0xFFFF);
 237   1              //EA=1;
 238   1      //出临界区
 239   1      #pragma ASM
 240   1          POP IE;
 241   1      #pragma ENDASM
C51 COMPILER V7.50   SERIAL                                                                02/10/2003 23:00:30 PAGE 5   

 242   1      }
 243          
 244          void PrintStr(unsigned char *str) reentrant//显示字符串
 245          {
 246   1              int i;
 247   1              unsigned char j;
 248   1              unsigned char ch;
 249   1              
 250   1              //EA=0;
 251   1      //入临界区
 252   1      #pragma ASM
 253   1          PUSH IE;
 254   1          CLR EA;
 255   1      #pragma ENDASM
 256   1              for(i=0;i<MaxLenStr;i++){
 257   2                      ch=*(str+i);
 258   2                      if(ch=='\0') break;
 259   2                      else if(ch=='\n'){PrintChar(10);PrintChar(13);} 
 260   2                      else if(ch=='\t'){
 261   3                              for(j=0;j<TABNum;j++)
 262   3                                      PrintChar(' ');
 263   3                      }
 264   2                      else PrintChar(ch);
 265   2              }
 266   1              //EA=1;
 267   1      //出临界区
 268   1      #pragma ASM
 269   1          POP IE;
 270   1      #pragma ENDASM
 271   1      }
 272          
 273          void clrscr() reentrant//清屏
 274          {        
 275   1              PrintStr("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");//25个回车换行清屏幕。
 276   1      }
 277          
 278          //============================================================================================
 279          //
 280          //============================================================================================
 281          void yyprintf(char *fmt,...) reentrant  //自编简单printf等效函数
 282          {
 283   1          void *p;  //任意指针,可以指向任何类型,C语法不对其严格要求。
 284   1          char ch;
 285   1          unsigned char j;
 286   1      
 287   1          p=&fmt;
 288   1          p=(char **)p+1;  //此处p是指向指针的指针,fmt是字符串指针,p是指向fmt的指针
 289   1      
 290   1      //入临界区
 291   1      #pragma ASM
 292   1          PUSH IE;
 293   1          CLR EA;
 294   1      #pragma ENDASM
 295   1      
 296   1          while(1){
 297   2              while((ch=*fmt++)!='%'){
 298   3                  if(ch=='\0'){
 299   4      //出临界区
 300   4      #pragma ASM
 301   4          POP IE;
 302   4      #pragma ENDASM
 303   4                      return;
C51 COMPILER V7.50   SERIAL                                                                02/10/2003 23:00:30 PAGE 6   

 304   4                  }
 305   3                  else if(ch=='\n'){PrintChar(10);PrintChar(13);}
 306   3                  else if(ch=='\t'){
 307   4                      for(j=0;j<TABNum;j++)
 308   4                          PrintChar(' ');
 309   4                  }
 310   3                  else PrintChar(ch);
 311   3              }
 312   2              ch=*fmt++;
 313   2              switch(ch){
 314   3                  case 'c':
 315   3                      PrintChar(*((char *)p));
 316   3                      p=(char *)p+1;
 317   3                      break;
 318   3                  case 'd':
 319   3                      PrintN(*((int *)p),10);
 320   3                      p=(int *)p+1;
 321   3                      break;
 322   3                  case 'x':
 323   3                      PrintN(*((int *)p),16);
 324   3                      p=(int *)p+1;
 325   3                      break;
 326   3                  case 'o':
 327   3                      PrintUN(*((int *)p),8);
 328   3                      p=(int *)p+1;
 329   3                      break;
 330   3                  case 'b':
 331   3                      PrintUN(*((int *)p),2);
 332   3                      p=(int *)p+1;
 333   3                      break;
 334   3                  case 'l':
 335   3                      ch=*fmt++;
 336   3                      switch(ch){
 337   4                          case 'd':
 338   4                              PrintLN(*((long *)p),10);
 339   4                              p=(long *)p+1;
 340   4                              break;
 341   4                          case 'o':
 342   4                              PrintLUN(*((long *)p),8);
 343   4                              p=(long *)p+1;
 344   4                              break;
 345   4                          case 'u':
 346   4                              PrintLUN(*((unsigned long *)p),10);
 347   4                              p=(unsigned long *)p+1;
 348   4                              break;
 349   4                          case 'b':
 350   4                              PrintLUN(*((long *)p),2);
 351   4                              p=(long *)p+1;
 352   4                              break;
 353   4                          case 'x':
 354   4                              PrintLN(*((long *)p),16);
 355   4                              p=(long *)p+1;
 356   4                              break;
 357   4                          default:
 358   4      //出临界区
 359   4      #pragma ASM
 360   4          POP IE;
 361   4      #pragma ENDASM
 362   4                              return;
 363   4                      }
 364   3                      break;
 365   3                  case 'f':
C51 COMPILER V7.50   SERIAL                                                                02/10/2003 23:00:30 PAGE 7   

 366   3                      DispF(*((float *)p));
 367   3                      p=(float *)p+1;
 368   3                      break;
 369   3                  case 'u':
 370   3                      PrintUN(*((unsigned int *)p),10);
 371   3                      p=(unsigned int *)p+1;
 372   3                      break;
 373   3                  case 's':
 374   3                      PrintStr(*((char **)p));
 375   3                      p=(char **)p+1;
 376   3                      break;
 377   3                  case '%':
 378   3                      PrintChar('%');
 379   3                      p=(char *)p+1;
 380   3                      break;
 381   3                  default:
 382   3      //出临界区
 383   3      #pragma ASM
 384   3          POP IE;
 385   3      #pragma ENDASM
 386   3                      return;
 387   3              }
 388   2          }
 389   1      }
 390          
 391          void PrintN(int n,int b) reentrant  //十进制显示整形数
 392          {
 393   1          if(b==16){PrintWord(n);return;}
 394   1              if(n<0){PrintChar('-');n=-n;}
 395   1              if(n/b)
 396   1                  PrintN(n/b,b);
 397   1              PrintChar(n%b+'0');
 398   1      }
 399          
 400          void PrintUN(unsigned int n,unsigned int b) reentrant  //十进制显示无符号整形数
 401          {
 402   1          if(b==16){PrintWord(n);return;}
 403   1              if(n/b)
 404   1                  PrintUN(n/b,b);
 405   1              PrintChar(n%b+'0');
 406   1      }
 407          
 408          
 409          void PrintLN(long n,long b) reentrant  //十进制显示长整形数
 410          {
 411   1          if(b==16){PrintLong(n);return;}
 412   1              if(n<0){PrintChar('-');n=-n;}
 413   1              if(n/b)
 414   1                  PrintLN(n/b,b);
 415   1              PrintChar(n%b+'0');
 416   1      }
 417          
 418          void PrintLUN(unsigned long n,unsigned long b) reentrant  //十进制显示无符号长整形数
 419          {
 420   1          if(b==16){PrintLong(n);return;}
 421   1              if(n/b)
 422   1                  PrintLUN(n/b,b);
 423   1              PrintChar(n%b+'0');
 424   1      }
 425          
 426          //============================================================================================
 427          //KEIL C51的float类型采用IEEE-754标准存储,占4字节。
C51 COMPILER V7.50   SERIAL                                                                02/10/2003 23:00:30 PAGE 8   

 428          //    S E E E E E E E E E (1) M M M M M M M M M M M M M M M M M M M M M M M
 429          //  S    1bit    正负标志位0=正;1=负
 430          //  E    8bit    二进制阶码=(EEEEEEEE)-127
 431          //  M   23bit    24bit尾数,只存储23位,最高位固定为1。此方法用最较少的位数实现了较高的有效数,提高了精度

⌨️ 快捷键说明

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