📄 smgprintf.c
字号:
#include "AT89X52.h"
#include "ES51_II.h"
#include "ES51_II_LIB.h"
#include <stdio.h>
#include <stdarg.h>
// 数码管显示函数
// 如在数码管显示十进制数: SMGprintf("%u",变量);
// 若在数码管显示十六进制数: SMGprintf("%x",变量);
// 若在数码管显示浮点数: SMGprintf("%f",变量);
// 或指定小数点: SMGprintf("%0.xf",变量);数码管只能显示四位,所以对多余的小数将丢弃
// 若在数码管显示字符串: SMGprintf("%s","stri"); 其中字符串只能为0~F,对于A-F不区分大小写
int SMGprintf(const char *fmstr, ...)
{
static bit bsmgon = TRUE;
//bit bEA = EA;
unsigned int u_arg; // 保存无符号十进制/十六进制数
char c_arg; // 保存字符型参数
float f_arg; // 保存浮点型参数
char f_buff[6]; // 用于保存把浮点型参数转换为十六进制数组的值
char *pstr; // 保存字符串类型指针
unsigned char i,j;
va_list arg_ptr; //
va_start(arg_ptr,fmstr); // 获取未定参数首地址
// 以固定参数的地址为起点获得变参的内存起始地址
if( *fmstr == '%' ) // 判断第一个字符是否是'%'
{
switch( *(fmstr+1) ) // 取未定参数类型
{ // 根据参数类型进行不同的操作
case 'u': //////////////// unsigned int 无符号十进制数
// 获取无符号十进制数参数
u_arg = va_arg(arg_ptr,unsigned int);
//EA = 0; // 为何在这里不禁止中断,显示会有异常
// 在刷新数码管显示缓冲区出现中断造成?
// 是因为被中断而中断被指定了寄存器组,不对寄存器压栈,所以导致错误.
SMG_BUFF[0] = SMG_TABLE[u_arg/1000];
SMG_BUFF[1] = SMG_TABLE[u_arg%1000/100];
SMG_BUFF[2] = SMG_TABLE[u_arg%100/10];
SMG_BUFF[3] = SMG_TABLE[u_arg%10];
break;
case 'x': // unsigned int 无符号十六进制数
// 获取无符号十六进制参数
u_arg = va_arg(arg_ptr,unsigned int);
//EA = 0;
c_arg = u_arg; // 低字节
SMG_BUFF[3] = SMG_TABLE[c_arg&0x0f];
c_arg >>= 4;
SMG_BUFF[2] = SMG_TABLE[c_arg&0x0f];
c_arg = u_arg>>8;
SMG_BUFF[1] = SMG_TABLE[c_arg&0x0f];
c_arg >>=4;
SMG_BUFF[0] = SMG_TABLE[c_arg&0x0f];
break;
case '0': // .可能传入如"%0.2d"等参数
if( *(fmstr+2) != '.' )
break;
// 这里无break;
case 'f': // float,只对大于0的float处理
// 获取浮点型参数
// EA = 0;
f_arg = va_arg(arg_ptr,float);
if( f_arg > 0 && f_arg < 10 )
sprintf(f_buff,"%0.3f",f_arg);
else if( f_arg >= 10 && f_arg < 100 )
sprintf(f_buff,"%0.2f",f_arg);
else if( f_arg >= 100 && f_arg < 1000)
sprintf(f_buff,"%0.1f",f_arg);
else if( f_arg >= 1000 && f_arg < 9999)
sprintf(f_buff,"%0.1f",f_arg);
else
sprintf(f_buff,"%0.3f",0); // 若大于999或小于0,显示0000
for( i=5,j=3; i>0; i--,j--) // 从缓冲区尾部开始处理
{ // 这样可以先检测到'.'
if( f_buff[i-1] != '.')
SMG_BUFF[j] = SMG_TABLE[f_buff[i-1] - '0'];
else
{
i--;
SMG_BUFF[j] = SMG_TABLE_DP[f_buff[i-1] - '0'];
}
}
break;
case 's': // float,只对大于0的float处理
// ......
// 获取字符串首地址
pstr = va_arg(arg_ptr,char*);
//EA = 0;
for( i=0; i<4; i++,pstr++ )
{
if( (*pstr <= '9') && (*pstr >= '0') )
SMG_BUFF[i] = SMG_TABLE[*pstr-'0'];
else if( (*pstr <= 'f') && ( *pstr >= 'a') )
SMG_BUFF[i] = SMG_TABLE[ *pstr - 'a' + 10 ];
else if( (*pstr <= 'F') && ( *pstr >= 'A') )
SMG_BUFF[i] = SMG_TABLE[ *pstr - 'A' + 10 ];
else // 不显示
SMG_BUFF[i] = 0xff;
}
break;
default: ///////////////////////////
///////////////////////////////
///////////////////////////////
break;
}
}
//EA = bEA;
if( bsmgon == TRUE)
{
SMGDisplayON();
bsmgon = FALSE;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -