从你的代码中可以看出.你想使用sprintf打印功能..
你这种方式是实现不了 在你的函数内部调用sprintf功能的.
除非sprintf有linux累死的 vsprintf版本
vsprintf 原型
int vsprintf(char *string, char *format, va_list param);
最好的办法是.你自己实现一个vsprintf功能..或者干脆自己写一个LCD12864_Printf 格式化版本
嵌入式用.一般都不能用到所有sprintf里面的功能.自己实现其中的一部分就好了.
而且.占用堆栈,代码空间还小,
好人做到底.....给你个我早期写的串口命令行, 适当的自己修改一下吧...............
void uart_printf(const char *src,...)
{
unsigned int tmp;
va_list lst;
va_start(lst, src);
while(*src) {
if (*src != '%'){
uart_push(*src);
}
else {
switch (*++src) {
case 'c': uart_push(va_arg(lst, char)); break;
case 'd': dec_to_str(va_arg(lst, int), 0); break;
case 'u': dec_to_str(va_arg(lst, int), 1); break;
case 's': push_str(va_arg(lst, char*)); break;
case 'x': push_word_hex(va_arg(lst, int)); break;
case 'X':
tmp = va_arg(lst, unsigned char);
uart_push(tab[tmp>>4& 0xf]);
uart_push(tab[tmp & 0xf]);
break;
case 'l':
push_word_hex(va_arg(lst, int));
push_word_hex(va_arg(lst, int));
break;
case 'b':
tmp = va_arg(lst,char);
push_str(bin_tab[tmp>>4]);
uart_push('_');
push_str(bin_tab[tmp&15]);
break;
case 'B':
tmp = va_arg(lst, int);
push_str(bin_tab[tmp>>12]);
uart_push('_');
push_str(bin_tab[tmp>>8&15]);
uart_push('_');
push_str(bin_tab[tmp>>4&15]);
uart_push('_');
push_str(bin_tab[tmp&15]);
break;
default:
uart_push(*src);
break;
}
}
src++;
}
uart_send();
}
|