51单片机实现 printf 和scanf函数

实现的原理:就是找到 printf 和scanf函数的输入/输出端的接口函数把它修改定向到串口。

/** @copyright  Copyright(c)2014-2011 XXXX Co.,Ltd. All rights reserved.
  ******************************************************************************
  * @file       uart_format.c
  * @brief      
  * @details    
  * @author     匠在江湖(ID:1234)
  * @version    V1.0
  * @date       2014/05/08
  ******************************************************************************
  * @attention
  * 
  * @par 修改日志:
  * <table>
  * <tr><th>Date        <th>Version <th>Author(ID:xxxxxx)   <th>Description</tr>
  * <tr><td>2014/05/08  <td>V1.0    <td>匠在江湖(ID:1234)   <td>创建初始版本</tr>
  * </table>
  ******************************************************************************
  */


/* Includes *******************************************************************/
#include <stdio.h>
#include "mcu.h"
/* Private typedef ************************************************************/
/* Private constants **********************************************************/
/* Private macro **************************************************************/
#define UART_FORMAT_TDR             SBUF //发送数据寄存器
#define UART_FORMAT_TDIF_READ()     TI //发送数据寄存器为空置1,反之0。写 发送数据寄存器 清该标志
#define UART_FORMAT_TDIF_CLR()      TI = 0 //清发送数据完成中断标志

#define UART_FORMAT_RDR             SBUF //接收数据寄存器
#define UART_FORMAT_RDIF_READ()     RI //接收数据寄存器不为空置1,反之0。读 接收数据寄存器 清该标志
#define UART_FORMAT_RDIF_CLR()      RI = 0 //清接收数据完成中断标志
/* Private variables **********************************************************/
/* Private function prototypes ************************************************/


/**
  ******************************************************************************
  * @brief   重定向<stdio.h>库 输出端口 函数
  * @param   ch 待发送数据
  * @return  返回发送数据
  * @note    printf到串口
  ******************************************************************************
  */
char putchar(char ch) 
{
    UART_FORMAT_TDIF_CLR(); //清TDIF标志
	UART_FORMAT_TDR = ch; //写 发送数据寄存器
	while( !UART_FORMAT_TDIF_READ() ); //等待 发送数据寄存器 为空
	return ch; //返回发送数据
}

/**
  ******************************************************************************
  * @brief   重定向<stdio.h>库 输入端口 函数
  * @param   None
  * @return  返回接收数据
  * @note    串口到scanf
  ******************************************************************************
  */
char _getkey(void)
{
    char ch;
	while( !UART_FORMAT_RDIF_READ() ); //等待 接收数据寄存器 不为空
    ch = UART_FORMAT_RDR; //读 接收数据寄存器
    UART_FORMAT_RDIF_CLR(); //RDIF标志
	return ch; //返回接收数据
}

/********************************* END OF FILE ********************************/

猜你喜欢

转载自blog.csdn.net/weixin_46672094/article/details/121485328