keil5 stm32f03c8t6 printf重定向到串口和TFT 1.44 LCD屏
效果
- keil5工程设置,这一步很重要:
- 在任意的源文件里重写
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屏相关推荐
- c语言输入输出重定向到串口,关于printf重定向到串口的问题分析 - 全文
关于printf重定向到串口的问题 简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosTIng(半主机模式), 标准库函数的默认输出设备是显示器,要实现在串口 ...
- stm32中如何进行printf重定向用于串口调试输出
1 在main中包含stdio.h 文件 2 Target选项框里选Use MicroLib 选项 3 在main中添加UART1_Configuration()初始化的代码 Uart1初始化, vo ...
- STM32中printf重定向到串口
学习STM32过程中,经常打交道的莫过于串口,你可以将任何信息,当然重要的是调试信息打印到串口中输出,总是用一个字节发送函数或者字符串发送函数 总是有些不放便,之前编程中熟悉的莫过于printf了,下 ...
- STM32使用printf重定向到USART(串口)并打印数据到串口助手
STM32使用sprintf打印数据到串口助手 一.背景知识 二. 重定向printf到USART1 三.使用printf打印hello,world到串口助手 3.1 usart.c 3.2 usar ...
- arduino tft 方向_怎样将TFT 1.44与Arduino Nano结合使用
步骤1:下载所需的库 将以下库添加到Arduino: https://github.com/adafruit/Adafruit- GFX库 https://github.com/adafruit/Ad ...
- STC15单片机-串口打印printf重定向
printf函数重定向为往串口打印信息 在UART.h.UART1.h和UART.c文件的内容编写好后,在main函数中实现通过串口发送一串字符串和一个不断加1的变量 方法一: 使用sprintf函数 ...
- 【RTT实现printf重定向——Keil5】
RTT实现printf重定向--Keil5 概论 Keil5环境下通过printf()使用RTT 概论 这里的RTT不是RT-Thread,而是Real Time Transfer(实时传输). 链接 ...
- STM32 - Printf重定向使用微库、不使用微库(Keil) (转载)
Stm32芯片调试中经常用到串口来打印一些数据,因此如果能使用类似windows的Console中的printf就很完美了~ 方法1--使用微库: 1.使用微库(平台式keil-MDK),点击&quo ...
- Stm32 - Printf重定向(不)使用微库(Keil MDK)
#define DEBUG_USART USART1 stm32芯片调试中经常用到串口来打印一些数据,因此如果能使用类似windows的Console中的printf就很完美了~ 方法1--使用微库: ...
最新文章
- python正则表达式语法-python正则表达式语法大全讲解教程实例一
- Juicer 中文文档
- Cordova入门系列(三)Cordova插件调用 转发 https://www.cnblogs.com/lishuxue/p/6018416.html...
- 弹框alertView
- Static allocator 3
- spring 配置版本问题
- 通俗易懂的Monte Carlo积分方法(一)
- window消息机制
- 希望相对路径关于background-image:url()在样式表里设置后有不管用的办法
- bzoj 1036: [ZJOI2008]树的统计Count(树链剖分 点权)
- 推荐10个高效好用的办公软件,极大提升效率
- java watir_watir webdriver 安装
- ftp上传工具 免安装,3款最好用的ftp上传工具 免安装
- 小学计算机机器人大赛,2019年花都区中小学电脑机器人竞赛活动
- js 计算个人所得税
- xcode-select --install选择安装安装失败:下载失败网络问题(2:散列问题解决方案)
- Terraria泰拉瑞亚服务器搭建
- GL-Currencies-Rates-Daily:Error:APP-FND-01206: This record already exists-文档 ID 292731.1
- 使用stream报错:stream has already been operated upon or closed
- ps如何把自己的图与样机结合_ps小白想知道怎样使用样机素材?