STM32-F401RE四位七段数码管显示0209时的八进制错误解决问询
问题解决:STM32四位七段数码管带前导零显示
错误原因
你遇到的invalid digit "9" in octal constant错误,是因为C语言里整数常量开头加0表示这是八进制数,而八进制数的有效数字只有0-7,0209里的9不符合八进制规则,所以编译报错。
实现带前导零显示的方案
要显示四位带前导零的数字(比如0209),不需要传递带前导零的整数,而是通过显示函数处理整数,自动补全前导零,具体有两种常用方式:
方式1:通过数值计算拆分四位数字
直接传递整数209,在显示函数内部计算出千位、百位、十位、个位的数值,不足四位的高位自动补0:
// 假设你使用的是16位无符号整数,范围0-9999 void num_display_func(uint16_t num) { // 确保数字在0-9999范围内,超出则取模保留后四位 num %= 10000; // 拆分四位数字 uint8_t thousand = num / 1000; // 千位(209的话为0) uint8_t hundred = (num / 100) % 10; // 百位(209的话为2) uint8_t ten = (num / 10) % 10; // 十位(209的话为0) uint8_t unit = num % 10; // 个位(209的话为9) // 以下是数码管显示逻辑(根据你的硬件电路调整) // 示例:依次点亮四位数码管,输出对应段码 // 1. 点亮千位数码管,输出thousand对应的段码 enable_digit(0); // 假设第0位是千位 set_segment(thousand); delay_ms(1); // 延时保证视觉暂留 disable_all_digits(); // 2. 点亮百位数码管,输出hundred对应的段码 enable_digit(1); set_segment(hundred); delay_ms(1); disable_all_digits(); // 3. 点亮十位数码管,输出ten对应的段码 enable_digit(2); set_segment(ten); delay_ms(1); disable_all_digits(); // 4. 点亮个位数码管,输出unit对应的段码 enable_digit(3); set_segment(unit); delay_ms(1); disable_all_digits(); }
调用时直接传num_display_func(209);,函数会自动补全千位的0,最终显示0209。
方式2:通过字符串格式化处理
利用sprintf将整数格式化为带前导零的四位字符串,再逐个解析字符为数字显示:
#include <stdio.h> void num_display_func(uint16_t num) { char num_str[5]; // 四位数字加结束符,共5个字符 // 格式化数字为四位带前导零的字符串 sprintf(num_str, "%04d", num); // 遍历字符串的每一位,转成数字后显示 for(int i=0; i<4; i++){ uint8_t digit = num_str[i] - '0'; // 字符转数字 enable_digit(i); set_segment(digit); delay_ms(1); disable_all_digits(); } }
调用同样是num_display_func(209);,%04d会自动把209格式化为"0209"字符串,再逐位显示。
额外提示:如果需要传递固定格式的数字
如果你的需求是直接传递类似0209的固定字符序列,可以修改函数参数为字符串类型:
void num_display_func(const char* num_str) { for(int i=0; i<4; i++){ // 确保字符串长度足够,避免越界 if(num_str[i] == '\0') break; uint8_t digit = num_str[i] - '0'; enable_digit(i); set_segment(digit); delay_ms(1); disable_all_digits(); } }
调用时传num_display_func("0209");即可直接显示带前导零的数字。
内容的提问来源于stack exchange,提问作者Theja
相关产品推荐
相关产品推荐

