stc单片机串口重定向(基于stc15单片机库函数)

本文介绍了如何在STC单片机开发中遇到不便时,通过修改32位代码实现串口输出重定向,提供了一个实用的printfDebug函数,便于调试和日志记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源

写stc单片机的时候发现串口用的不方便,就用32的代码,改了一个重定向过来。

代码如下

#include "stdarg.h"
#include "stdio.h"
#include "USART.h"

#define CONSOLEBUF_SIZE 64

void PrintfDebug(const char *fmt, ...)
{
	u8 xdata Uart_buf[CONSOLEBUF_SIZE];
	va_list args;
	va_start(args, fmt);
	vsprintf(Uart_buf, fmt, args);
	va_end(args);
	
	PrintString1(Uart_buf);
}

以下是基于STC89C52单片机的0.96寸OLED显示屏的库函数代码: ```c #include <reg52.h> #include <intrins.h> #define OLED_SCL P1_0 // OLED时钟 #define OLED_SDA P1_1 // OLED数据 #define OLED_RST P1_2 // OLED复位 // OLED初始化函数 void OLED_Init() { // 复位OLED OLED_RST = 0; delay_ms(200); OLED_RST = 1; delay_ms(200); // 设置OLED显示模式 OLED_WriteCmd(0xAE); // 关闭OLED显示 OLED_WriteCmd(0x00); // 设置低位列地址 OLED_WriteCmd(0x10); // 设置高位列地址 OLED_WriteCmd(0x40); // 设置开始行地址 OLED_WriteCmd(0x81); // 设置对比度 OLED_WriteCmd(0xCF); OLED_WriteCmd(0xA1); // 设置段重定向 OLED_WriteCmd(0xC8); // 设置行重定向 OLED_WriteCmd(0xA6); // 设置正常显示 OLED_WriteCmd(0xA8); // 设置多路复用比 OLED_WriteCmd(0x3F); OLED_WriteCmd(0xD3); // 设置显示偏移 OLED_WriteCmd(0x00); OLED_WriteCmd(0xD5); // 设置时钟分频 OLED_WriteCmd(0x80); OLED_WriteCmd(0xD9); // 设置预充电周期 OLED_WriteCmd(0xF1); OLED_WriteCmd(0xDA); // 设置COM硬件扫描方式 OLED_WriteCmd(0x12); OLED_WriteCmd(0xDB); // 设置VCOMH电压倍率 OLED_WriteCmd(0x40); OLED_WriteCmd(0x8D); // 设置电荷泵 OLED_WriteCmd(0x14); OLED_WriteCmd(0xAF); // 打开OLED显示 } // 向OLED写命令 void OLED_WriteCmd(unsigned char cmd) { unsigned char i; OLED_SCL = 0; OLED_SDA = 0; OLED_SCL = 1; OLED_SCL = 0; OLED_SCL = 0; OLED_SDA = 0; OLED_SCL = 1; OLED_SCL = 0; OLED_SCL = 0; OLED_SDA = 1; OLED_SCL = 1; OLED_SCL = 0; for(i = 0; i < 8; i++) { OLED_SCL = 0; OLED_SDA = (cmd & 0x80) >> 7; OLED_SCL = 1; OLED_SCL = 0; cmd <<= 1; } } // 向OLED写数据 void OLED_WriteData(unsigned char dat) { unsigned char i; OLED_SCL = 0; OLED_SDA = 0; OLED_SCL = 1; OLED_SCL = 0; OLED_SCL = 0; OLED_SDA = 1; OLED_SCL = 1; OLED_SCL = 0; OLED_SCL = 0; OLED_SDA = 1; OLED_SCL = 1; OLED_SCL = 0; for(i = 0; i < 8; i++) { OLED_SCL = 0; OLED_SDA = (dat & 0x80) >> 7; OLED_SCL = 1; OLED_SCL = 0; dat <<= 1; } } // 清屏 void OLED_Clear() { unsigned char i, j; for(i = 0; i < 8; i++) { OLED_WriteCmd(0xB0 + i); // 设置页地址 OLED_WriteCmd(0x00); // 设置低位列地址 OLED_WriteCmd(0x10); // 设置高位列地址 for(j = 0; j < 128; j++) { OLED_WriteData(0x00); // 清空每个像素 } } } // 在指定位置显示一个字符 void OLED_ShowChar(unsigned char x, unsigned char y, unsigned char chr) { unsigned char c = 0, i = 0; c = chr - 32; if(x > 120) { x = 0; y++; } OLED_WriteCmd(0xB0 + y); // 设置页地址 OLED_WriteCmd(((x & 0xF0) >> 4) | 0x10); // 设置高位列地址 OLED_WriteCmd(x & 0x0F); // 设置低位列地址 for(i = 0; i < 8; i++) { OLED_WriteData(F6x8[c][i]); // 在指定位置显示一个字符 } } // 在指定位置显示一串字符 void OLED_ShowString(unsigned char x, unsigned char y, unsigned char *str) { unsigned char i = 0; while(str[i] != '\0') { OLED_ShowChar(x, y, str[i]); x += 8; i++; } } // 在指定位置显示一个数字 void OLED_ShowNum(unsigned char x, unsigned char y, unsigned int num, unsigned char len) { unsigned char t, i; for(i = 0; i < len; i++) { t = (num / pow(10, len - i - 1)) % 10 + '0'; // 将数字转换为字符 OLED_ShowChar(x + i * 8, y, t); // 在指定位置显示一个字符 } } ``` 其中,`OLED_SCL`、`OLED_SDA`、`OLED_RST`分别对应OLED显示屏的时钟、数据和复位引脚。`OLED_Init()`函数用于初始化OLED,`OLED_ShowChar()`、`OLED_ShowString()`和`OLED_ShowNum()`函数用于在OLED上显示字符、字符串和数字,`OLED_Clear()`函数用于清屏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入一下?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值