如何将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类型,通常由两种情况导致:
- 未包含
<sstream>头文件; - 变量名冲突(比如定义了
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
相关产品推荐
相关产品推荐

