单片机开发简单实现printf函数

1、编译器不支持标准stdio.h即printf函数条件下,可自己实现printf函数;

2、实现方式如下:

      

#include "usart.h"

typedef char *va_list;
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(char) - 1) & ~(sizeof(char) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )

//#define UartSendData(Data)	do{while(_tidle != 0){_txr_rxr = *Data;}} while(0);	
#define UartSendData(Data)	do{while(_utidle == 0);_utxr_rxr = *Data;} while(0);	

/**********************************************************************/
//Description:		sky_itoa															  
//Parameters:       ��int������תΪ2��8��10��16�����ַ���
//Return:   																  
//Date:            
//author:		quanwu.xu 
/**********************************************************************/
static char *sky_itoa(int value, char *str, unsigned int radix)
//static char *sky_itoa(long value, char *str, unsigned int radix)
{
	const char list[] = "0123456789ABCDEF";
	unsigned int tmp_value;
//	unsigned long tmp_value;
	
	int i = 0, j, k = 0;

	if (NULL == str)
	{
		return NULL;
	}

	if (2 != radix && 8 != radix && 10 != radix && 16 != radix) 
	{	
		return NULL;
	}

	if (radix == 10 && value < 0) 
	{
		//ʮ������Ϊ����
		tmp_value = (unsigned int)(0 - value);
//		tmp_value = (unsigned long)(0 - value);		
		str[i++] = '-';
		k = 1;
	}
	else 
	{
		tmp_value = (unsigned int)value;	
//		tmp_value = (unsigned long)value;
	}

	//����ת��Ϊ�ַ���������洢

	do {
		str[i ++] = list[tmp_value%radix];
		tmp_value /= radix;
	} while(tmp_value);

	str[i] = '\0';

	//�������ַ���ת��Ϊ����
	char tmp;
	for (j = k; j < (i+k)/2; j++)
	{
		tmp = str[j];
		str[j] = str[i-j-1+k];
		str[i-j-1+k] = tmp;
	}

	return str;
}

/**********************************************************************/
//Description:		Printf														  
//Parameters:                        												  
//Return:   											
//Date:  
//author:		quanwu.xu 
/**********************************************************************/
void printf(char * Data, ...)
{
	const char *s;
	int d;  
	char buf[16];
	uint8 txdata;
	va_list ap;
	va_start(ap, Data);
  	while ( * Data != 0 ) 
	{				                          
    		if ( * Data == 0x5c ) 
		{									  
      			switch ( *++Data ) 
			{
				case 'r':							          
					txdata = 0x0d;
					UartSendData((const char *)&txdata);
					Data ++;
					break;

				case 'n':							          
					txdata = 0x0a;
					UartSendData((const char *)&txdata);
					Data ++;
					break;

			        default:
			          Data ++;
			          break;

     			 }			 
    		}
		else if ( * Data == '%')
		{									  
      			switch ( *++Data ) 
			{				
      				case 's':										 
        				s = va_arg(ap, const char *);
        				for ( ; *s; s++) 
					{
          					UartSendData((const char*)s);
        				}				
        				Data++;				
        				break;

			      case 'd':			
					d = va_arg(ap, int );							
					sky_itoa(d, buf, 10);					
					for (s = buf; *s; s++) {
						UartSendData((const char*)s);
					}					
					Data++;				
					break;

				case 'x': 
				{
					d = va_arg(ap, int);	
					sky_itoa(d, buf, 16);					
					for (s = buf; *s; s++) 
					{
						UartSendData((const char*)s);
					}					
					Data++;			
					break;
				}
#ifdef PRINTF_FLAOT_TYPE
			      case 'f':
				{
					double num = va_arg(ap, double);					
					sky_ftoa(num, buf, 4);
					for (s = buf; *s; s++) 
					{
						UartSendData(s);
					}					

						Data++;			
					break;
      				}
#endif
			      default:
					Data++;				
					break;				

      			}		 

	    	}
		else 
		{
	        	UartSendData((const char*)Data);
	        	Data++;
	  	}
  	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值