#include
void tst_printf (void) {
char a = 1;
int b = 12365;
long c = 0x7FFFFFFF;
unsigned char x = 'A';
unsigned int y = 54321;
unsigned long z = 0x4A6F6E00;
float f = 10.0;
float g = 22.95;
char buf [] = "Test String";//不定长数组
char *p = buf;
printf ("char %bd int %d long %ld\n",a,b,c);
printf ("Uchar %bu Uint %u Ulong %lu\n",x,y,z);
printf ("xchar %bx xint %x xlong %lx\n",x,y,z);
printf ("String %s is at address %p\n",buf,p);
printf ("%f != %g\n", f, g);
printf ("%*f != %*g\n", (int)8, f, (int)8, g);
}
在Keil C51中这里的b表示
byte
,即1个字符,%bd
就是输出一个byte
宽度的整型数(char)。
%bu
输出一个
byte
宽度的无符号整型数,(unsigned char
)。
输出一个
long
宽度的,长整型数据
%d整型输出,%ld长整型输出,
%o以八进制数形式输出整数,
%x以十六进制数形式输出整数,
%u以十进制数输出unsigned型数据(无符号数)。
%c用来输出一个字符,
%s用来输出一个字符串,
%f用来输出实数,以小数形式输出
%.4f用来输出实数,保留小数点4位。
%e以指数形式输出实数,
%g根据大小自动选f格式或e格式,且不输出无意义的零。
一个单字节变量时要使用%bd
1.b八位
2.h十六位
3.l三十二位
%d 两个字节变量 int
%bd 单字节变量 char
%ld 四字节变量 long int
% <[>flags<]> <[>width<]> <[>.precision<]> <[>{b|B|l|L}<]> type
可选字符l或l可以紧接在type字符之前,分别为d、i、u、o、x和x指定长类型。
可选字符b或B可以紧接在类型字符之前,分别指定d、i、u、o、x和x的字符类型。
%%
”将一个百分号写入输出流。也就是说,使用C51的printf()函数打印%d/i/u/o/x/X格式时,你必须要指定该变量的存储格式l/L/b/B。
如果定义的变量c为char类型,可将相应的代码改为如下:
printf("%bd\n",c);
printf("%bu\n",c);
printf("%bx\n",c);
即可得到正确的结果。除此之外:
unsigned char rec_dat[4];
....
printf("DHT11 TEMP:%bd.%bd;Hum:%bd.%bd \n", rec_dat[0], rec_dat[1], rec_dat[2], rec_dat[3]);
printf("DHT11 TEMP:%d.%d;Hum:%d.%d \n", rec_dat[0], rec_dat[1], rec_dat[2], rec_dat[3]);
来输出是不正确的。以STC15W408AS作为演示
/*
串口通信
附:利用单片机和PC机的串口通信的工作方式1(波特率可变),(
已知晶振为11.0592MHZ)设置通信波特率为9600b/s,
*/
#include
//#include
#include
#define uint unsigned int
#define uchar unsigned char
/*------------------------------------------------
串口初始化函数,波特率9600
------------------------------------------------*/
void init_com(void)
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR &= 0xFB; //定时器时钟12T模式
T2L = 0xE8; //设置定时初始值
T2H = 0xFF; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
TI=1; // 很关键,使用printf函数时必须有此命令
ES = 1; //开启串口中断
EA=1; //开启总中断
}
void tst_printf (void) {
unsigned char str[4];
char a = 1;
int b = 12365;
long c = 0x7FFFFFFF;
unsigned char x = 'A';
unsigned int y = 54321;
unsigned long z = 0x4A6F6E00;
float f = 10.0;
float g = 22.95;
char buf [] = "Test String";
char *p = buf;
printf ("char %bd int %d long %ld\n",a,b,c);//这里的int整型数可以用%hd
printf ("Uchar %bu Uint %u Ulong %lu\n",x,y,z);
printf ("xchar %bx xint %x xlong %lx\n",x,y,z);
printf ("String %s is at address %p\n",buf,p);
printf ("%f != %g\n", f, g);
printf ("%*f != %*g\n", (int)8, f, (int)8, g);
str[0] = 95;
str[1] = 27;
str[2] = 0;
str[3] = 7;
printf("str=%bd%bd%bd%bd \n", str[0], str[1], str[2], str[3]);
}
void main(void)
{
// uint up=0,down=0,high=0;
// uint result ;
init_com();
tst_printf();
while(1);
{
// printf("********************************\r\n");
// printf("Please input up,dowm,high:\r\n");
// scanf("%d%d%d",&up,&down,&high) ;
// printf("\r\nResult=%d\r\n",result=(up+down)*high/2);
}
}
如果上面代码中打印定长数组的使用printf("str=%d%d%d%d \n", str[0], str[1], str[2], str[3]);
的输出结果:
printf("str=%s \n", str);
来打印,结果:时间,那是距离也是宽恕,它就让一些东西更清晰,让一些感情更加明白,让一切都是趋于平静。 |
---|