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

📄 smgprintf.c

📁 EasyStudy51-II单片机开发系统的库函数源代码.包含了EasyStudy51-II硬件的全部驱动.
💻 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 + -