STM32驱动OLED显示NTC温度:如何仅让数值闪烁避免整屏闪烁
问题解决:STM32 OLED显示NTC温度时仅数值闪烁、静态文本保持稳定
核心问题分析
你当前代码每次循环都调用SSD1306_Clear()清空整屏,再重新绘制所有内容,这是导致整屏闪烁的根本原因。要实现静态文本不动、仅数值更新时闪烁的效果,核心是只更新数值所在的局部区域,静态文本仅绘制一次。
解决方案代码
char staticText1[] = "Temp NTC1: "; char staticText2[] = "Temp NTC2: "; char tempStr1[32]; char tempStr2[32]; // 预计算数值区域的坐标与尺寸(适配Font_7x10字体) #define NUM1_X (10 + strlen(staticText1)*7) // 静态文本宽度=字符数×单字符宽度 #define NUM1_Y 10 #define NUM_WIDTH 60 // 预留足够宽度覆盖"%.2f °C"格式的内容 #define NUM_HEIGHT 10 // Font_7x10的字符高度 #define NUM2_X (10 + strlen(staticText2)*7) #define NUM2_Y 30 SSD1306_Init(); // 初始化OLED SSD1306_Clear(); // 初始化阶段仅清一次屏 // ---------- 静态文本仅绘制一次 ---------- SSD1306_GotoXY(10, 10); SSD1306_Puts(staticText1, &Font_7x10, SSD1306_COLOR_WHITE); SSD1306_GotoXY(10, 30); SSD1306_Puts(staticText2, &Font_7x10, SSD1306_COLOR_WHITE); SSD1306_UpdateScreen(); // 将静态文本刷入屏幕显存 while (1) { // --- NTC温度计算逻辑(自行补充)--- // temperature_ntc1 = 你的计算代码; // temperature_ntc2 = 你的计算代码; // 格式化温度数值为字符串 snprintf(tempStr1, sizeof(tempStr1), "%.2f °C", temperature_ntc1); snprintf(tempStr2, sizeof(tempStr2), "%.2f °C", temperature_ntc2); // ---------- 实现数值闪烁效果 ---------- // 第一步:显示最新数值 // 局部清除NTC1数值区域(用黑色覆盖旧内容) SSD1306_FillRect(NUM1_X, NUM1_Y, NUM_WIDTH, NUM_HEIGHT, SSD1306_COLOR_BLACK); SSD1306_GotoXY(NUM1_X, NUM1_Y); SSD1306_Puts(tempStr1, &Font_7x10, SSD1306_COLOR_WHITE); // 局部清除NTC2数值区域 SSD1306_FillRect(NUM2_X, NUM2_Y, NUM_WIDTH, NUM_HEIGHT, SSD1306_COLOR_BLACK); SSD1306_GotoXY(NUM2_X, NUM2_Y); SSD1306_Puts(tempStr2, &Font_7x10, SSD1306_COLOR_WHITE); SSD1306_UpdateScreen(); // 仅刷新数值区域 HAL_Delay(800); // 数值显示时长(可调整) // 第二步:隐藏数值(形成闪烁间隙) SSD1306_FillRect(NUM1_X, NUM1_Y, NUM_WIDTH, NUM_HEIGHT, SSD1306_COLOR_BLACK); SSD1306_FillRect(NUM2_X, NUM2_Y, NUM_WIDTH, NUM_HEIGHT, SSD1306_COLOR_BLACK); SSD1306_UpdateScreen(); HAL_Delay(200); // 隐藏时长(可调整,改变闪烁频率) }
关键修改说明
- 静态文本一次性绘制:将静态文本的绘制逻辑放在循环外,初始化后仅刷一次屏,后续不再修改这部分内容。
- 局部刷新替代整屏清除:使用
SSD1306_FillRect()仅清除数值所在的矩形区域,避免整屏刷新带来的闪烁。 - 闪烁逻辑控制:通过交替显示数值和清空数值区域,配合不同延时实现闪烁效果,可根据需求调整两个延时的时长。
- 坐标精准对齐:提前计算数值的起始X坐标,确保数值与静态文本完美对齐。
内容的提问来源于stack exchange,提问作者min_een
相关产品推荐
相关产品推荐

