当前位置:首页 > 单片机 > 单片机
[导读] 最开始学习C语言时,使用printf和scanf进行格式化输入输出十分方便。学习单片机有很长时间了,之前要再屏幕上显示一个变量或者通过串口传出一些变量值观测的话,需要进行一系列的取余取整运算,很是麻烦。最近又研究

 最开始学习C语言时,使用printf和scanf进行格式化输入输出十分方便。

学习单片机有很长时间了,之前要再屏幕上显示一个变量或者通过串口传出一些变量值观测的话,需要进行一系列的取余取整运算,很是麻烦。

最近又研究了一下keil中针对printf和scanf的实现机理,做了一些改动,实现了标准格式化输入输出,共大家参考。

1.printf函数在格式化输出时,向下调用了char putchar(char c);这个函数,在“stdio.h”里可以发现有这个函数,所以我们需要自己构造一个这样的函数,即通过串口putchar(),代码如下:

[cpp] view plain copychar putchar(char c)

{

hal_uart_putchar(c);

return c;

}

其中hal_uart_putchar(c);函数是我们比较熟悉的了,是51单片机通过串口发送一个字节的函数,具体代码如下:

[cpp] view plain copyvoid hal_uart_putchar(char i)

{

ES = 0;

TI = 0; //清空发送完中断请求标志位

SBUF = i; //将数据放入寄存器发送

while(TI == 0);//等待发送完毕,发送完毕 TI == 1

TI = 0; //清空发送完中断请求标志位

ES = 1;

}

有了这两个函数,在单片机启动后,首先进行串口初始化,接着就可以使用printf了……是不是很简单……

-------------------------------------------------------------------------------------------------------------------------------------

2.下面再看scanf的具体实现方法:

scanf函数在格式化输入时,向下掉用了char getkey(void);这个函数,在“stdio.h”里可以发现有这个函数,所以我们需要自己构造一个这样的函数,即通过串口getkey(),代码如下:

[cpp] view plain copychar _getkey (void)

{

return hal_uart_getchar();

}

其中hal_uart_getchar(); 稍稍复杂,但也很好理解,代码如下:

[cpp] view plain copychar hal_uart_getchar(void)

{

uchar ch;

//Wait until a character is available:

while(uart_rx_cnt == 0);

ES = 0;

ch = uart_rx[uart_rx_rp];

uart_rx_rp = (uart_rx_rp + 1) % UART_BUF_SIZE;

uart_rx_cnt--;

ES = 1;

return ch;

}

这个函数是从串口接收队列中取出队尾的一个字节。uart_rx_cnt 表示现在串口队列中的已有字节数,uart_rx_rp 指向队尾。

最后要介绍的一个函数是串口接收中断函数,代码如下:

[cpp] view plain copyvoid UART1InterruptReceive(void) interrupt 4

{

ES=0;//关串行口中断

if(RI)

{

RI=0;//接收中断信号清零,表示将继续接收

if(uart_rx_cnt < UART_BUF_SIZE)

{

uart_rx[uart_rx_wp] = SBUF;

uart_rx_wp = (uart_rx_wp + 1) % UART_BUF_SIZE;

uart_rx_cnt++;

}

}

ES=1;//开串行口中断

}

该函数实现了串口的中断接收,收到的新的字节存放在队首,即uart_rx_wp指向队列的首地址,每次收到一个新的字节,uart_rx_cnt增1。

至此,scanf函数也可以实现了。

测试截图:


注:串口接收的队列没有溢出检测……

这篇文章里实现的是对于串口的格式化输入输出,实际上,我们同样可以对hal_uart_getchar();和hal_uart_putchar(c);函数进行更改,实现在屏幕上的格式化输出等,思路都是一样的……

有不合理的地方,请大家批评指正。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

51单片机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对51单片机的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 单片机 51单片机

在嵌入式系统开发中,单片机是不可或缺的重要组成部分。其中,STM32单片机和51单片机是两种常见的单片机芯片。本文将对比分析这两种单片机的区别,并探讨STM32单片机的优势。

关键字: stm32单片 51单片机

51单片机是指由美国INTEL公司生产的一系列单片机的总称,这一系列单片机包括了许多品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基...

关键字: 51单片机 串行通信

51单片机是一种常见的微控制器,它具有串行通信接口(Serial Communication Interface,SCI)。通过串口通信接口,51单片机可以与其他设备或系统进行串行通信,实现数据传输和控制。

关键字: 51单片机 串口通信

Java语言和C语言是两种不同的编程语言,它们在语法、特性和应用领域上有许多差别。下面将详细介绍Java语言和C语言之间的差异以及它们各自的技术特点。

关键字: Java语言 C语言 编程

嵌入式系统是一种专门设计用于特定应用领域的计算机系统,它通常由硬件和软件组成,并且被嵌入到其他设备或系统中,以实现特定的功能。在嵌入式系统的开发过程中,选择适合的编程语言是至关重要的。C语言是一种被广泛应用于嵌入式系统开...

关键字: 嵌入式 计算机 C语言

C语言是一种广泛应用于软件开发领域的编程语言。它是由贝尔实验室的Dennis Ritchie在20世纪70年代初创建的,旨在为UNIX操作系统的开发提供一种高级编程语言。C语言具有简洁、高效、可移植性强等特点,因此成为了...

关键字: C语言 操作系统 应用程序

嵌入式系统是现代生活中无处不在的一部分。它们包括了我们的家电、汽车、智能手机、医疗设备等等。这些系统的工作必须高效、可靠,因为它们往往控制着生活中的关键方面。而C语言作为一种广泛用于嵌入式系统开发的编程语言,其质量和稳定...

关键字: 嵌入式系统 C语言 编程

在嵌入式系统开发领域中,C语言是使用最广泛的编程语言之一。它具有高效、灵活和可移植的特点,成为嵌入式系统设计师的首选语言。本文将介绍C语言编程的基本概念、特点以及在嵌入式系统开发中的应用。

关键字: 嵌入式系统 C语言 编程

C语言编译器是一种用于将C语言源代码转换为可执行程序的软件工具。它的主要功能是将C语言代码翻译成机器语言,以便计算机能够理解和执行。C语言编译器通常包括预处理器、编译器、汇编器和链接器等多个组件,它们协同工作以完成编译过...

关键字: C语言 编译器 Microsoft Visual C++
关闭
关闭