📄 smgprintf.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 + -