之前一直用的是avr单片机,最近帮同学做毕业设计,用了51单片机,在使用C语言标准中的输入输出出现了问题
1.在atmage16上使用printf函数完全好用,在51出现错误
2.sprintf(*a,b,c);参数a在51单片机中不能是函数名,在avr单片机中我用过函数名,完全可以;
3.sprintf(*a,"%d%d%d",b,c,d);格式话输出的参数在51单片机中最多只能有两个,但在AVR上曾经用过4个好用。
上面的问题期待大虾回答
下面分享一些资料
printf.h文件
#ifndef __PRINTF_H
#define __PRINTF_H
#include <stdio.h>
void printf_init(void);
#endif
#include "printf.h"
#include "Qinux_io.h"
printf.c文件 //重定向标准输出流
static int z_putc(char c, FILE *stream);
static FILE z_stdout = FDEV_SETUP_STREAM(z_putc, NULL, _FDEV_SETUP_WRITE);
void printf_init(void)
{
stdout = &z_stdout;
}
static int z_putc(char c, FILE *stream)
{
Z_PUTC(c);
return 0;
}
Qinux_io.h文件
#ifndef __PRINTF_HD
#define __PRINTF_HD
#include "../usart/usart.h" //包含有硬件输出的文件,比如说串口,usart_tx_char(char c),
#define Z_PUTC(c) usart_tx_char(c) //只要将usart_tx_char(c)改一下就可以用了,比如说lcd1602
#endif
以上三个文件在是一起的,在atmega16上好用,改动之后放在51上不能用了。
使用printf函数需要重定向标准输出流,
使用sprintf的话就不需要了
只需要sprintf(usart_tx_char,"b=%d,c=%f,d=%ld",b,c,d); //在atmega16上好用,在51上不好用
在51上要变化一些
char date[32];
sprintf(date,"b=%d,c=%f,d=%ld",b,c,d) //在51上测试发现只能有两个,例如,b,c输出正确,d输出就不正确了
usart_tx_sting(date); //3句话的printf完成
求人指点,我是这个论坛的新人,慕名而来
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
这个估计是堆栈问题,其他的怎么回事,求人解决呀
一周热门 更多>