[c]代码库
#include "stdarg.h"
typedef enum{
dec = 0, //10进制
hex, //16进制(小写字母)
HEX //16进制(大写字母)
}Radix_TypeDef;
void Uart_SendByte(u8 byte)
{
//code...
}
void Uart_SendStr(u8* str)
{
while(*str != '\0')
{
Uart_SendByte(*str++);
}
}
/**
* @brief 整型数据转化为字符串
* @param buf 存放字符串的指针
* digit 需要转化的整型数据
* radix 进制
* dec:十进制
* hex:十六进制(小写字母)
* HEX:十六进制(大写字母)
* @retval 返回字符的字节数
*/
int itoa(u8 *buf, int digit, Radix_TypeDef radix)
{
u32 i;
u8 temp;
u8 flag = 0;
int retval = 0;;
if(digit==0)
{
*buf = '0';
retval = 1;
return retval;
}
if(digit < 0)
{
*buf++ = '-';
digit *= -1;
}
switch(radix)
{
case dec:
for(i=1000000000; i>0; i/=10)
{
temp = digit/i;
if(temp || flag)
{
flag = 1;
*buf++ = '0' + temp;
digit -= temp * i;
retval++;
}
}
break;
case hex:
case HEX:
for(i=0x10000; i>0; i/=0x10)
{
temp = digit/i;
if(temp || flag)
{
flag = 1;
digit -= temp*i;
if(temp < 10)
*buf++ = '0' + temp;
else
{
if(radix == hex)
*buf++ = 'a' + temp - 10;
else
*buf++ = 'A' + temp - 10;
}
retval++;
}
}
break;
}
return retval;
}
/**
* @brief 使用类似printf的格式输出串口
* @param
* 转义字符: \n 回车 \t 空三格
* %d 带符号10进制整型 %X 带符号16进制整型(大写字母)
* %c 字符 %x 带符号16进制整型(小写字母)
* %s 字符串
* 支持格式:%d、%x、%X 三种转义字符支持数据前面补0或补空格。如 %9d, %09d, %9x, %09x, %9X, %09X
* @retval 返回打印字节数
*/
u16 My_printf(const char* format, ...)
{
u8 i;
u8 flag;
u8 buf[10];
int digit; //数字
char *s;
char c;
u16 retval = 0; //返回值,返回打印字节数
u8 num;
u8 num_tk_up = 0; //补缺数,(补空格或补0)
va_list ap;
va_start(ap,format);
while(*format != '\0')
{
switch(*format)
{
case '%':
//空缺补0或补空格
if(format[1]>='0' && format[1]<='9')
{
//补0
if(format[1] == '0')
{
if(format[2]>'0' && format[2]<='9')
{
flag = 1;
format += 3;
}
}
//补空格
else
{
flag = 0;
format += 2;
}
digit = va_arg(ap,int);
num = 0;
switch(*format++)
{
case 'd':
num = itoa(buf, (u8)digit, dec);
break;
case 'x':
num = itoa(buf, (u8)digit, hex);
break;
case 'X':
num = itoa(buf, (u8)digit, HEX);
break;
}
*(buf+num) = '\0';
num_tk_up = 0;
if(*(format - 2) -'0' > num)
{
num_tk_up = *(format - 2) - '0' - num;
}
for(i=0; i<num_tk_up; i++)
{
if(flag)
Uart_SendByte('0');
else
Uart_SendByte(' ');
}
Uart_SendStr(buf);
retval += num_tk_up + num;;
}
else
{
num = 0;
switch(*++format)
{
case 'd':
digit = va_arg(ap,int);
num = itoa(buf, digit, dec);
*(buf+num) = '\0';
Uart_SendStr(buf);
break;
case 'x':
digit = va_arg(ap,int);
num = itoa(buf, digit, hex);
*(buf+num) = '\0';
Uart_SendStr(buf);
break;
case 'X':
digit = va_arg(ap,int);
num = itoa(buf, digit, HEX);
*(buf+num) = '\0';
Uart_SendStr(buf);
break;
case 'c':
c = va_arg(ap, char);
num = 1;
Uart_SendByte(c);
break;
case 's':
s = va_arg(ap, char*);
for(num=0; s[num]!='\0'; num++);
Uart_SendStr((u8*)s);
break;
}
format++;
retval += num;
}
break;
case '\\':
case '\t':
case '\n':
case '\r':
default:
Uart_SendByte(*format++);
retval++;
break;
}
}
va_end(ap);
return retval;
}
by: 发表于:2017-08-10 09:24:45 顶(0) | 踩(0) 回复
??
回复评论