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

📄 smgprintf.lst

📁 EasyStudy51-II单片机开发系统的库函数源代码.包含了EasyStudy51-II硬件的全部驱动.
💻 LST
字号:
C51 COMPILER V7.06   SMGPRINTF                                                             11/06/2008 01:10:23 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE SMGPRINTF
OBJECT MODULE PLACED IN SMGprintf.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE c51\SMGprintf.c INCDIR(.\Target\INC\) DEBUG OBJECTEXTEND PRINT(.\SMGprintf.
                    -lst) OBJECT(SMGprintf.obj)

stmt level    source

   1          
   2          #include "AT89X52.h"
   3          #include "ES51_II.h"
   4          #include "ES51_II_LIB.h"
   5          #include <stdio.h>
   6          #include <stdarg.h>
   7          
   8          
   9          
  10          
  11          //      数码管显示函数
  12          //      如在数码管显示十进制数:         SMGprintf("%u",变量);
  13          //      若在数码管显示十六进制数:       SMGprintf("%x",变量);
  14          //      若在数码管显示浮点数:           SMGprintf("%f",变量);
  15          //                      或指定小数点:           SMGprintf("%0.xf",变量);数码管只能显示四位,所以对多余的小数将丢弃
  16          //      若在数码管显示字符串:           SMGprintf("%s","stri"); 其中字符串只能为0~F,对于A-F不区分大小写
  17          int SMGprintf(const char *fmstr, ...)
  18          {       
  19   1              static bit bsmgon = TRUE;
  20   1              //bit   bEA = EA;
  21   1              unsigned int u_arg;                             //      保存无符号十进制/十六进制数
  22   1              char c_arg;                                             //      保存字符型参数
  23   1              float f_arg;                                    //      保存浮点型参数
  24   1              char f_buff[6];                                 //      用于保存把浮点型参数转换为十六进制数组的值
  25   1              char *pstr;                                             //      保存字符串类型指针
  26   1              
  27   1              unsigned char i,j;
  28   1      
  29   1              va_list arg_ptr;                                //              
  30   1              va_start(arg_ptr,fmstr);                //      获取未定参数首地址
  31   1                                                                              //      以固定参数的地址为起点获得变参的内存起始地址
  32   1                                                                                      
  33   1              if( *fmstr == '%' )                             //      判断第一个字符是否是'%'
  34   1                      {               
  35   2                      switch( *(fmstr+1) )            //      取未定参数类型
  36   2                              {                                               //      根据参数类型进行不同的操作
  37   3                              case 'u': ////////////////      unsigned int 无符号十进制数
  38   3                                                                              //      获取无符号十进制数参数
  39   3                                              u_arg = va_arg(arg_ptr,unsigned int);
  40   3                                              //EA = 0;                       //      为何在这里不禁止中断,显示会有异常
  41   3                                                                                      //              在刷新数码管显示缓冲区出现中断造成?
  42   3                                                                                      //      是因为被中断而中断被指定了寄存器组,不对寄存器压栈,所以导致错误.
  43   3                                              SMG_BUFF[0] = SMG_TABLE[u_arg/1000];
  44   3                                              SMG_BUFF[1] = SMG_TABLE[u_arg%1000/100];
  45   3                                              SMG_BUFF[2] = SMG_TABLE[u_arg%100/10];
  46   3                                              SMG_BUFF[3] = SMG_TABLE[u_arg%10];
  47   3                                              break;
  48   3                              case 'x':                               //      unsigned int 无符号十六进制数
  49   3                                                                              //      获取无符号十六进制参数
  50   3                                              u_arg = va_arg(arg_ptr,unsigned int);
  51   3                                              //EA = 0;
  52   3                                              c_arg = u_arg;  //      低字节
  53   3                                              SMG_BUFF[3] = SMG_TABLE[c_arg&0x0f];
  54   3                                              c_arg >>= 4;
C51 COMPILER V7.06   SMGPRINTF                                                             11/06/2008 01:10:23 PAGE 2   

  55   3                                              SMG_BUFF[2] = SMG_TABLE[c_arg&0x0f];
  56   3                                              c_arg = u_arg>>8;
  57   3                                              SMG_BUFF[1] = SMG_TABLE[c_arg&0x0f];
  58   3                                              c_arg >>=4;
  59   3                                              SMG_BUFF[0] = SMG_TABLE[c_arg&0x0f];
  60   3                                              break;
  61   3                              case '0':                               //      .可能传入如"%0.2d"等参数
  62   3                                              if( *(fmstr+2) != '.' )
  63   3                                                      break;
  64   3                                              //      这里无break;
  65   3                              case 'f':                               //      float,只对大于0的float处理
  66   3                                                                              //      获取浮点型参数
  67   3                                      //      EA = 0;         
  68   3                                              f_arg = va_arg(arg_ptr,float);
  69   3                                              if( f_arg > 0 && f_arg < 10 )                                   
  70   3                                                      sprintf(f_buff,"%0.3f",f_arg);
  71   3                                              else if( f_arg >= 10 && f_arg < 100 )
  72   3                                                      sprintf(f_buff,"%0.2f",f_arg);
  73   3                                              else if( f_arg >= 100 && f_arg < 1000)
  74   3                                                      sprintf(f_buff,"%0.1f",f_arg);
  75   3                                              else if( f_arg >= 1000 && f_arg < 9999)
  76   3                                                      sprintf(f_buff,"%0.1f",f_arg);
  77   3                                              else
  78   3                                                      sprintf(f_buff,"%0.3f",0);              //      若大于999或小于0,显示0000                                                                       
  79   3                                              
  80   3                                              for( i=5,j=3; i>0; i--,j--)                     //      从缓冲区尾部开始处理    
  81   3                                                      {                                                               //      这样可以先检测到'.'
  82   4                                                      if( f_buff[i-1] != '.')
  83   4                                                              SMG_BUFF[j] = SMG_TABLE[f_buff[i-1] - '0'];
  84   4                                                      else
  85   4                                                              {
  86   5                                                              i--;
  87   5                                                              SMG_BUFF[j] = SMG_TABLE_DP[f_buff[i-1] - '0'];
  88   5                                                              }
  89   4                                              
  90   4                                                      }
  91   3                                              break;
  92   3                              case 's':                               //      float,只对大于0的float处理
  93   3                                                                              //      ......
  94   3                                                                              //      获取字符串首地址
  95   3                                              pstr = va_arg(arg_ptr,char*);
  96   3                                              //EA = 0;
  97   3                                              for( i=0; i<4; i++,pstr++ )
  98   3                                                      {
  99   4                                                      if( (*pstr <= '9') && (*pstr >= '0') )
 100   4                                                              SMG_BUFF[i] = SMG_TABLE[*pstr-'0'];
 101   4              
 102   4                                                      else if( (*pstr <= 'f') && ( *pstr >= 'a') )
 103   4                                                              SMG_BUFF[i] = SMG_TABLE[ *pstr - 'a' + 10 ];
 104   4              
 105   4                                                      else if( (*pstr <= 'F') && ( *pstr >= 'A') )
 106   4                                                              SMG_BUFF[i] = SMG_TABLE[ *pstr - 'A' + 10 ];
 107   4              
 108   4                                                      else                            //      不显示                  
 109   4                                                              SMG_BUFF[i] = 0xff;     
 110   4                                                      }
 111   3                                              break;
 112   3                              default:        ///////////////////////////
 113   3                                              ///////////////////////////////
 114   3                                              ///////////////////////////////
 115   3                                      break;
 116   3                              }
C51 COMPILER V7.06   SMGPRINTF                                                             11/06/2008 01:10:23 PAGE 3   

 117   2                      }
 118   1      
 119   1              //EA = bEA;
 120   1              if( bsmgon == TRUE)
 121   1                      {
 122   2                      SMGDisplayON();
 123   2                      bsmgon = FALSE;
 124   2                      }
 125   1      
 126   1              return;
 127   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    897    ----
   CONSTANT SIZE    =     18    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      34
   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 + -