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

📄 serial.lst

📁 本人于2005年初开始准备将&micro C/OS-II嵌入式实时操作系统移植到8051单片机上
💻 LST
📖 第 1 页 / 共 2 页
字号:
 208   1          PUSH IE;
 209   1          CLR EA;
 210   1      #pragma ENDASM
 211   1              insidePrintWord(Word);
 212   1              //EA=1;
 213   1      //出临界区
 214   1      #pragma ASM
 215   1          POP IE;
 216   1      #pragma ENDASM
 217   1      }
 218          
 219          void PrintLong(unsigned long LongWord) reentrant//以十六进制格式显示1个长字数据
 220          {
 221   1              //EA=0;
 222   1      //入临界区
 223   1      #pragma ASM
 224   1          PUSH IE;
 225   1          CLR EA;
 226   1      #pragma ENDASM
 227   1              insidePrintWord(LongWord>>16);
 228   1              insidePrintWord(LongWord&0xFFFF);
 229   1              //EA=1;
 230   1      //出临界区
 231   1      #pragma ASM
 232   1          POP IE;
 233   1      #pragma ENDASM
 234   1      }
 235          
 236          void PrintStr(unsigned char *str) reentrant//显示字符串
 237          {
 238   1              int i;
 239   1              unsigned char j;
 240   1              unsigned char ch;
 241   1              
C51 COMPILER V7.10   SERIAL                                                                09/04/2007 10:27:37 PAGE 5   

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

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

 366   3                      PrintStr(*((char **)p));
 367   3                      p=(char **)p+1;
 368   3                      break;
 369   3                  case '%':
 370   3                      PrintChar('%');
 371   3                      p=(char *)p+1;
 372   3                      break;
 373   3                  default:
 374   3      //出临界区
 375   3      #pragma ASM
 376   3          POP IE;
 377   3      #pragma ENDASM
 378   3                      return;
 379   3              }
 380   2          }
 381   1      }
 382          
 383          void PrintN(int n,int b) reentrant  //十进制显示整形数
 384          {
 385   1          if(b==16){PrintWord(n);return;}
 386   1              if(n<0){PrintChar('-');n=-n;}
 387   1              if(n/b)
 388   1                  PrintN(n/b,b);
 389   1              PrintChar(n%b+'0');
 390   1      }
 391          
 392          void PrintUN(unsigned int n,unsigned int b) reentrant  //十进制显示无符号整形数
 393          {
 394   1          if(b==16){PrintWord(n);return;}
 395   1              if(n/b)
 396   1                  PrintUN(n/b,b);
 397   1              PrintChar(n%b+'0');
 398   1      }
 399          
 400          
 401          void PrintLN(long n,long b) reentrant  //十进制显示长整形数
 402          {
 403   1          if(b==16){PrintLong(n);return;}
 404   1              if(n<0){PrintChar('-');n=-n;}
 405   1              if(n/b)
 406   1                  PrintLN(n/b,b);
 407   1              PrintChar(n%b+'0');
 408   1      }
 409          
 410          void PrintLUN(unsigned long n,unsigned long b) reentrant  //十进制显示无符号长整形数
 411          {
 412   1          if(b==16){PrintLong(n);return;}
 413   1              if(n/b)
 414   1                  PrintLUN(n/b,b);
 415   1              PrintChar(n%b+'0');
 416   1      }
 417          
 418          //============================================================================================
 419          //KEIL C51的float类型采用IEEE-754标准存储,占4字节。
 420          //    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
 421          //  S    1bit    正负标志位0=正;1=负
 422          //  E    8bit    二进制阶码=(EEEEEEEE)-127
 423          //  M   23bit    24bit尾数,只存储23位,最高位固定为1。此方法用最较少的位数实现了较高的有效数,提高了精度

⌨️ 快捷键说明

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