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

优化LCD显示uint16数值代码:替代长if/else及ASCII转换失效问题

问题解决:替换LCD数字显示的冗长if/else语句

你的问题出在直接用初始化列表{0x30 + temp, '\0'}作为字符串参数传递——C语言不允许这种写法,编译器无法将这个初始化列表转换为const char*类型的有效指针,导致函数接收到无效的内存地址,自然无法正常显示。

下面是几种简洁可行的替代方案:

方案1:使用临时字符数组

声明一个长度为2的字符数组,专门存储单个数字的字符串(数字字符+终止符),这是最通用、兼容性最好的写法:

uint8_t loop = 0;
uint16_t cycles_1 = cycles; // 拷贝原变量避免修改原始数据
char num_str[2]; // 存储单个数字的字符串

while (cycles_1 > 0) {
    uint8_t temp = cycles_1 % 10;
    num_str[0] = '0' + temp; // '0'的ASCII值等于0x30,可读性更强
    num_str[1] = '\0'; // 添加字符串终止符
    lcd_string(36 - (6 * loop), 6, font_6x8_num, num_str);
    
    cycles_1 /= 10;
    loop++;
}

// 处理cycles_1初始为0的情况(原循环不会执行,需额外显示0)
if (loop == 0) {
    lcd_string(36, 6, font_6x8_num, "0");
}

方案2:使用C99复合字面量

如果你的编译器支持C99或更高标准,可以直接用复合字面量创建临时字符串,写法更紧凑:

uint8_t loop = 0;
uint16_t cycles_1 = cycles;

while (cycles_1 > 0) {
    uint8_t temp = cycles_1 % 10;
    // 复合字面量创建临时2字符数组,直接传递其地址
    lcd_string(36 - (6 * loop), 6, font_6x8_num, (char[2]){'0' + temp, '\0'});
    
    cycles_1 /= 10;
    loop++;
}

// 处理初始为0的情况
if (loop == 0) {
    lcd_string(36, 6, font_6x8_num, "0");
}

复合字面量的临时数组生命周期会持续到当前语句块结束,在while循环的每次迭代中,函数调用完成前它都是有效的,不用担心内存问题。

方案3:使用数字字符串索引

提前定义包含所有数字的字符串字面量,直接通过索引获取单个数字的字符串指针,写法最简洁:

const char* digit_strs = "0123456789"; // 字符串字面量末尾自带'\0'
uint8_t loop = 0;
uint16_t cycles_1 = cycles;

while (cycles_1 > 0) {
    uint8_t temp = cycles_1 % 10;
    // &digit_strs[temp]指向对应数字的字符,从该位置到末尾是合法字符串
    lcd_string(36 - (6 * loop), 6, font_6x8_num, &digit_strs[temp]);
    
    cycles_1 /= 10;
    loop++;
}

// 处理初始为0的情况
if (loop == 0) {
    lcd_string(36, 6, font_6x8_num, "0");
}

内容的提问来源于stack exchange,提问作者Benjamin Shover

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:50:51