?? my_printf.c
字號:
/* * my_printf.c - a sample printf * * Author: <zgxgoo@gmail.com> * Date: 2007-10-31 */#include <stdarg.h>#include "my_printf.h"#include "uart.h"/* * transfer the num to 10 or 16 and ouput it */void output_int( unsigned int num, const int base ){ const char *digit = "0123456789ABCDEF"; unsigned int buf[32]; int i = 0; /*transfer the num to 10*/ if (base == 10) { do { buf[i] = num % 10; num = num / 10; i++; } while ( num > 0 ); } /*transfer the num to 16*/ if (base == 16) { do { buf[i] = num % 16; num = num / 16; i++; } while ( num > 0 ); } while ( --i >= 0 ) { uart_putchar( UART0_BASE, digit[ buf[i] ] ); }}void output_float ( float i){ const char *digit = "0123456789ABCDEF"; unsigned int buf[32]; float k = i; int numb, j, kk; j = i; numb = 0; for (; k*10 != (float) j*10; ) { k = k*10; j = k; numb++; } kk = 0; do { buf[kk] = j % 10; j = j / 10; kk++; } while ( j > 0 ); for (; --kk >= 0; ) { uart_putchar( UART0_BASE, digit[ buf[kk] ] ); if ( kk == numb ) uart_putchar( UART0_BASE, '.'); } if ( numb == 0 ) uart_putchar( UART0_BASE, '0' ); } void my_printf( char *fmt_buf, ... ){ va_list unnamed_p; /* point to named argument */ char *p, *sval; unsigned int value_i; double value_j; /* unnamed_p point to first unnamed argument */ va_start( unnamed_p, fmt_buf ); for ( p=fmt_buf; *p; p++ ) { if ( *p != '%' ) { uart_putchar( UART0_BASE, *p ); continue; } switch ( *++p ) { case 'd': value_i = va_arg( unnamed_p, unsigned int ); output_int( value_i, 10 ); break; case 's': for (sval = va_arg( unnamed_p, char*); *sval; sval++) uart_putchar( UART0_BASE, *sval ); break; case 'x': value_i = va_arg( unnamed_p, unsigned int ); output_int( value_i, 16 ); break; case 'f': value_j = va_arg( unnamed_p, double); output_float( value_j ); break; default: uart_putchar( UART0_BASE, *p ); break; } } va_end( unnamed_p );}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -