效果


  1. keil5工程设置,这一步很重要:
  2. 在任意的源文件里重写int fputc(int ch, FILE* f)函数

代码:

print.h

#ifndef __PRINT_H__
#define __PRINT_H__#include "stm32f10x.h"
#include "stdio.h"/* 打印输出到那里 */
#define PUT_USART   0x01    // 串口输出
#define PUT_LCD1_44 0x02    // 输出到Lcd1.44屏幕
#define IS_PUT_VALUE(V) (V == PUT_USART || V == PUT_LCD1_44)/* 重定向方向 */
extern uint8_t PRINT_FOR;#define SET_PRINT_FOR(__T)  PRINT_FOR = IS_PUT_VALUE(__T) ? __T : PUT_USART/* 使用Lcd输出时的参数 */
typedef struct
{uint8_t x;  // 坐标xuint8_t y;  // 坐标yuint16_t Back_color;    // 背景颜色uint16_t Point_color;   // 字体颜色uint8_t mode;   // 叠加选择
} Lcd_Put_value;void fputc_lcd_value(uint8_t x, uint8_t y, uint16_t fontColor, uint16_t breakColor, uint8_t mode);
int fputc(int ch, FILE *f);#endif

print.c

#include "print.h"
#include "LCD1_44.h"/* printf重定向到哪里 */
uint8_t PRINT_FOR = PUT_USART;  // 默认串口/* Lcd屏参数值 */
Lcd_Put_value Lcd_fValue = {0x00, 0x00, 0x0000, 0xFFFF, 0};/* Lcd屏设置参数时是否正确,不正确则不会输出 */
uint8_t Lcd_value_corr = 1;/*** @brief 设置重定向后输出到Lcd屏的各种参数* **/
void fputc_lcd_value(uint8_t x, uint8_t y, uint16_t fontColor, uint16_t breakColor, uint8_t mode) {if (Lcd_assert_param(x, y)) {Lcd_value_corr = 0;return;}else Lcd_value_corr = 1;Lcd_fValue.x = x;Lcd_fValue.y = y;Lcd_fValue.Back_color = breakColor;Lcd_fValue.Point_color = fontColor;Lcd_fValue.mode = mode;
}/*** @brief 重定向printf函数* **/
int fputc(int xch, FILE *f) {/* 因为这个中文字符占2个字节所以要记录是否为第二个字节 */static uint8_t firstChinese[2] = {0x00, 0x00};uint8_t ch = (uint8_t)xch;/* 串口打印 */if (PRINT_FOR == PUT_USART) {USART_SendData(USART1, (char)ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);}/* 输出到Lcd1.44屏幕 */else {if (!Lcd_value_corr) {  // 参数设置错误return xch;}if (Lcd_fValue.y+16 > LCD_Y_MAX_PIXEL) {Lcd_value_corr = 0;return xch;}// 判断是否为中文if (ch > 0x80) {if (Lcd_fValue.x+16 > LCD_X_MAX_PIXEL) {Lcd_fValue.y += 16;if (Lcd_fValue.y >= LCD_Y_MAX_PIXEL) {Lcd_value_corr = 0;return xch;}Lcd_fValue.x = 0;}// 如果是第一个字节if (!firstChinese[0]) {firstChinese[0] = ch;return xch;}firstChinese[1] = ch;Lcd_DrawFont16(Lcd_fValue.x, Lcd_fValue.y, firstChinese, Lcd_fValue.Point_color, Lcd_fValue.Back_color, Lcd_fValue.mode);firstChinese[0] = 0x00;Lcd_fValue.x += 16;}else {if(ch == 0x0A) { // 换行符号Lcd_fValue.x = 0;Lcd_fValue.y += 16;if (Lcd_fValue.y >= LCD_Y_MAX_PIXEL) {Lcd_value_corr = 0;}return xch;}if (Lcd_fValue.x+8 > LCD_X_MAX_PIXEL) {Lcd_fValue.y += 16;if (Lcd_fValue.y >= LCD_Y_MAX_PIXEL) {Lcd_value_corr = 0;return xch;}Lcd_fValue.x = 0;}Lcd_Putchar(Lcd_fValue.x, Lcd_fValue.y, ch, Lcd_fValue.Point_color, Lcd_fValue.Back_color, Lcd_fValue.mode);Lcd_fValue.x += 8;}}return xch;
}

main.c

#include "delay.h"
#include "LCD1_44.h"
#include "stm32f10x.h"
#include "font.h"
#include "tim.h"
#include "usart.h"
#include "stdio.h"
#include "GUI.h"
#include "DS18B20.h"
#include "print.h"/*** @brief 板载LED,使用的管脚为PC13*          低电平LED亮* **/
void LED_Init(void) {GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_13;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStruct);GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 点亮
}int main(void)
{uint8_t i;delay_init();LED_Init();TIM2_Init(200-1, 360-1);    // ((arr+1)/72000000)*(psc+1) = (200/72000000)*360 = 1msUsart_Init(115200);Lcd_Init();Lcd_Clear(0x0000);// 设置屏幕方向Lcd_SetDisplayDirection(LCD_REVERSALVERTICAL);Lcd_Print(1, 17, "023456789)(<{}>ABC中#文啊DEF%$试&GHjkl.mnopq^*MZyakg&@d;..测", WHITE, BLACK, 1);for (i=0; i < 2; i++) delay_ms(1000);Lcd_Clear(0x0000);// 设置printf重定向方向SET_PRINT_FOR(PUT_LCD1_44);fputc_lcd_value(0, 20, WHITE, BLACK, 0);printf("当Apsod&前*Hnldskd09wjr温度\nfds中)");for (i=0; i < 4; i++) delay_ms(1000);while (1){fputc_lcd_value(0, 20, WHITE, BLACK, 0);printf("当前温度:%.3f", ReadTemperature());for (i=0; i < 5; i++)delay_ms(1000);}
}

最后,printf是真滴香。

keil5 stm32f03c8t6 printf重定向到串口和TFT 1.44 LCD屏相关推荐

  1. c语言输入输出重定向到串口,关于printf重定向到串口的问题分析 - 全文

    关于printf重定向到串口的问题 简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosTIng(半主机模式), 标准库函数的默认输出设备是显示器,要实现在串口 ...

  2. stm32中如何进行printf重定向用于串口调试输出

    1 在main中包含stdio.h 文件 2 Target选项框里选Use MicroLib 选项 3 在main中添加UART1_Configuration()初始化的代码 Uart1初始化, vo ...

  3. STM32中printf重定向到串口

    学习STM32过程中,经常打交道的莫过于串口,你可以将任何信息,当然重要的是调试信息打印到串口中输出,总是用一个字节发送函数或者字符串发送函数 总是有些不放便,之前编程中熟悉的莫过于printf了,下 ...

  4. STM32使用printf重定向到USART(串口)并打印数据到串口助手

    STM32使用sprintf打印数据到串口助手 一.背景知识 二. 重定向printf到USART1 三.使用printf打印hello,world到串口助手 3.1 usart.c 3.2 usar ...

  5. arduino tft 方向_怎样将TFT 1.44与Arduino Nano结合使用

    步骤1:下载所需的库 将以下库添加到Arduino: https://github.com/adafruit/Adafruit- GFX库 https://github.com/adafruit/Ad ...

  6. STC15单片机-串口打印printf重定向

    printf函数重定向为往串口打印信息 在UART.h.UART1.h和UART.c文件的内容编写好后,在main函数中实现通过串口发送一串字符串和一个不断加1的变量 方法一: 使用sprintf函数 ...

  7. 【RTT实现printf重定向——Keil5】

    RTT实现printf重定向--Keil5 概论 Keil5环境下通过printf()使用RTT 概论 这里的RTT不是RT-Thread,而是Real Time Transfer(实时传输). 链接 ...

  8. STM32 - Printf重定向使用微库、不使用微库(Keil) (转载)

    Stm32芯片调试中经常用到串口来打印一些数据,因此如果能使用类似windows的Console中的printf就很完美了~ 方法1--使用微库: 1.使用微库(平台式keil-MDK),点击&quo ...

  9. Stm32 - Printf重定向(不)使用微库(Keil MDK)

    #define DEBUG_USART USART1 stm32芯片调试中经常用到串口来打印一些数据,因此如果能使用类似windows的Console中的printf就很完美了~ 方法1--使用微库: ...

最新文章

  1. python正则表达式语法-python正则表达式语法大全讲解教程实例一
  2. Juicer 中文文档
  3. Cordova入门系列(三)Cordova插件调用 转发 https://www.cnblogs.com/lishuxue/p/6018416.html...
  4. 弹框alertView
  5. Static allocator 3
  6. spring 配置版本问题
  7. 通俗易懂的Monte Carlo积分方法(一)
  8. window消息机制
  9. 希望相对路径关于background-image:url()在样式表里设置后有不管用的办法
  10. bzoj 1036: [ZJOI2008]树的统计Count(树链剖分 点权)
  11. 推荐10个高效好用的办公软件,极大提升效率
  12. java watir_watir webdriver 安装
  13. ftp上传工具 免安装,3款最好用的ftp上传工具 免安装
  14. 小学计算机机器人大赛,2019年花都区中小学电脑机器人竞赛活动
  15. js 计算个人所得税
  16. xcode-select --install选择安装安装失败:下载失败网络问题(2:散列问题解决方案)
  17. Terraria泰拉瑞亚服务器搭建
  18. GL-Currencies-Rates-Daily:Error:APP-FND-01206: This record already exists-文档 ID 292731.1
  19. 使用stream报错:stream has already been operated upon or closed
  20. ps如何把自己的图与样机结合_ps小白想知道怎样使用样机素材?

热门文章

  1. 企业如何提前规划国家高新认定?
  2. 注意了!谷歌搜索新规定,对只有PC版本的网页将不再收录
  3. Non-local算法代码解析
  4. AOSP的编译及刷机
  5. 风控案例 | 宁波通商银行背后的科技力量
  6. ffmpeg_分割一个mp4文件到多个小的mp4文件
  7. 【Django 开发】面试招聘信息网站(用户登录注册投在线递简历)
  8. 01---两列波在相遇处发生干涉的条件
  9. 关于网线接法和测试器的亮灯顺序
  10. Android 开发环境下载地址