You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:24:56