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

如何将DS1302读取的时间值转为整数格式解决OLED显示异常?

问题解决:DS1302时间显示异常与编译错误修复

一、显示异常(+0000000013格式)的根源与解决

你遇到的显示问题核心是DS1302返回的时间值是BCD编码格式,而非直接的十进制整数。之前尝试的类型转换(直接赋值、位掩码、static_cast)都未处理BCD到十进制的转换,导致显示函数把原始BCD值当成普通二进制整数格式化输出,出现多余的符号和前导零。

解决方案:BCD转十进制

对每个时间字段(时、分、秒)执行BCD到十进制的转换,逻辑为:(BCD值 >> 4) * 10 + (BCD值 & 0x0F),再将转换后的十进制整数传给显示函数。

代码示例:

BYTE hour_bcd, minute_bcd, second_bcd;
get_time(hour_bcd, minute_bcd, second_bcd);

// 转换BCD编码为十进制整数
int hour = (hour_bcd >> 4) * 10 + (hour_bcd & 0x0F);
int minute = (minute_bcd >> 4) * 10 + (minute_bcd & 0x0F);
int second = (second_bcd >> 4) * 10 + (second_bcd & 0x0F);

// 输出到OLED
print(0, 0, hour);
print(3, 0, ":");
print(5, 0, minute);
print(8, 0, ":");
print(10, 0, second);

二、stripped_time函数编译错误修复

编译报错Member reference base type 'std::stringstream' (aka int) is not a structure or union,原因是代码中std::stringstream被错误识别为int类型,通常由两种情况导致:

  1. 未包含<sstream>头文件;
  2. 变量名冲突(比如定义了int stringstream;这类重名变量)。

正确实现示例

如果仍需手动处理格式,可参考以下代码:

#include <sstream>
#include <string>

std::string stripped_time(int value) {
    std::stringstream ss;
    ss << value;
    std::string str = ss.str();
    
    // 去除前导的+和0
    size_t start_pos = str.find_first_not_of("+0");
    if (start_pos == std::string::npos) {
        return "0"; // 处理全0的情况
    }
    return str.substr(start_pos);
}

// 调用方式(转成const char*传给字符串版print)
print(5, 0, stripped_time(minute).c_str());

内容的提问来源于stack exchange,提问作者KE Keronei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:11:13