8.0 标准库printf函数实现

时间:2021-02-15 19:48:42

实例6---程序调试助手printf-----程序目的:如何利用标准库实现printf函数

printf函数称为格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。

printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中,printf函数调用的一般形式为:
printf(“格式控制字符串”, 输出表列)
其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如:
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x或者%X 无符号以十六进制表示的整数,小写则输出小写,大写则输出大写
%o 无符号以八进制表示的整数
%g 自动选择合适的表示法
%p 输出地址符
如果这个是在VC环境下,printf就可以直接使用。那在MSP430的平台下如何实现,下面我们就来编写程序,首先确定的就是printf我们调用的是IAR环境下的标准库函数,那么我们只要写个底层就可以了,也是就我们写个putchar函数即可,不了解putchar函数的同学自己问下度娘,putchar函数如下:

//向终端输出一个字符
int putchar(int c)
{
        if(c == '\n') 
        { 
                  UCA0TXBUF = '\r';
                  while(!(IFG2 & UCA0TXIFG));
        }
        UCA0TXBUF = c;
        while(!(IFG2 & UCA0TXIFG));
        
        return c;
}
注意形式参数与函数类型都是int型,不要更改这个数据类型,否则不兼容。这个我们可以看下printf的声明
__EFF_NW1    __PRINTFPR __ATTRIBUTES  int  printf(const char *_Restrict, ...);


下面我们看演示程序:
在我们上节课的uart.c的文件里我们添加putchar函数
//UART0底层驱动文件


#include <msp430f249.h>
#include "uart.h"

//串口0初始化 波特率9600
void Uart0_Init(void)
{
        P3SEL |= 0x30;//设置P3.4与P3.5为串口TXD/RXD
        UCA0CTL1 |= UCSSEL0 + UCSWRST;//设置串口0时钟为ACLK,置位UCSWRST,初始化所有的USCI寄存器
        UCA0BR0 = 0x03;//32768Hz/9600=3.41
        UCA0BR1 = 0x00;
        UCA0MCTL = UCBRS1 + UCBRS0;//UCBRSx=0.41*8=3.28
        UCA0CTL1 &= ~UCSWRST;//清除UCSWRST位
        IE2 |= UCA0RXIE;//接收中断使能位
}


//串口0发送数据
void Uart0_Send_Byte(u8 data)
{
        while(!(IFG2&UCA0TXIFG));//发送寄存器空的时候发送数据
        UCA0TXBUF = data;
}


//向终端输出一个字符
int putchar(int c)
{
        if(c == '\n') 
        { 
                  UCA0TXBUF = '\r';
                  while(!(IFG2 & UCA0TXIFG));
        }
        UCA0TXBUF = c;
        while(!(IFG2 & UCA0TXIFG));
        
        return c;
}


//串口0接收中断
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
        u8 data=0;
        
        data = UCA0RXBUF;//接收到的数据存起来
        Uart0_Send_Byte(data);//将接收到的数据再发送出去
}


//主函数
#include <msp430f249.h>
#include "msp430type.h"
#include "system.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "uart.h"

//主函数
void main(void)
{        
        Wdt_Off();//关闭看门狗
        Clock_Init();//系统时钟初始化
        Led_Init();//led灯初始化
        Key_Init();//按键初始化
        Uart0_Init();//串口0初始化 波特率9600
        
        _BIS_SR(GIE);//使能总中断
        
        while(1)
        {
                printf("标准库printf函数发送数据到终端测试\r\n");
                LED_L;//点亮led灯
                Delay_ms(200);
                LED_H;//熄灭led灯
                Delay_ms(200);                
        }
}

主函数很简单,就是不断发送字符串,led灯不断闪烁。上图看下串口调试助手有没有收到数据。
 8.0 标准库printf函数实现

其他的格式输出大家自己去验证,这里就不一一演示了。

printf函数实现课程完结。源程序: 8.0 标准库printf函数实现 006 uart-printf.rar (347.8 KB, 下载次数: 0)       学习讨论Q群:167390222     2014年7月5日