如何将数字末位转为字符在STM8 LCD显示及整数显示功能实现
原有实现无法运行的问题原因
- 字符常量误用:双引号
"0"是字符串常量指针,数字转ASCII需要加单引号字符常量'0'获取ASCII偏移 - 参数类型不匹配:
LCD_GLASS_WriteChar第一个入参要求是uint8_t*指针,直接传递字符值会被识别为非法内存地址,导致运行异常 - 显示顺序倒置:取余运算先得到整数的最低位,按显示位序号递增写入会导致数字倒序显示
- 0值无输出:输入整数为0时循环条件不成立,不会执行显示逻辑
- 运算符不规范:循环条件用按位与
&替代逻辑与&&,存在潜在逻辑风险
方案1:整数转字符串复用原有显示接口(推荐,代码复用性高)
无需修改原有显示函数,自行实现纯C无库依赖的整数转字符串工具函数即可:
/** * @brief uint16_t整数转字符串,无额外库依赖 * @param num 输入待转换的16位无符号整数 * @param buff 输出字符串缓冲区,建议长度≥6字节(uint16最大值为65535,加结束符共6字节) */ void uint16_to_str(uint16_t num, uint8_t *buff) { uint8_t i = 0; // 处理0值特殊场景 if (num == 0) { buff[i++] = '0'; buff[i] = '\0'; return; } // 按低位到高位暂存数字 while (num > 0 && i < 5) { buff[i++] = '0' + (num % 10); num /= 10; } // 反转字符串得到正序 uint8_t start = 0, end = i - 1; while (start < end) { uint8_t temp = buff[start]; buff[start] = buff[end]; buff[end] = temp; start++; end--; } // 补充字符串结束符 buff[i] = '\0'; }
调用示例:
uint8_t lcd_buf[6]; uint16_t target_num = 5678; uint16_to_str(target_num, lcd_buf); // 直接调用原有显示函数即可 LCD_GLASS_DisplayString(lcd_buf);
方案2:独立整数显示函数
无需转字符串步骤,直接实现专用的整数显示接口:
void LCD_GLASS_DisplayINT(uint16_t integer) { uint8_t i = 0x01; uint8_t digits[5]; // 存储各位数字的ASCII值,uint16最大为5位 uint8_t digit_cnt = 0; LCD_GLASS_Clear(); // 处理0值场景 if (integer == 0) { uint8_t zero_char = '0'; LCD_GLASS_WriteChar(&zero_char, FALSE, FALSE, i); return; } // 提取所有位的数字ASCII值 while (integer > 0 && digit_cnt < 5) { digits[digit_cnt++] = '0' + (integer % 10); integer /= 10; } // 从最高位开始依次写入LCD for (int8_t j = digit_cnt - 1; j >= 0 && i < 8; j--) { LCD_GLASS_WriteChar(&digits[j], FALSE, FALSE, i); i++; } }
扩展说明
如果需要显示有符号整数,仅需增加负数判断逻辑,先显示负号'-'再转换绝对值部分即可;如果需要固定位数前导零补全,在数字提取完成后补够对应位数的'0'即可。
内容的提问来源于stack exchange,提问作者rajeev
相关产品推荐
相关产品推荐

