错误:八进制常量中的数字“9”无效

问题描述 投票:0回答:2

我正在尝试使用 STM32-F401RE 编写一段代码,用于在四位七段显示器上显示数字。问题出在 while(1) 循环。
这是代码:

void num_display_func(uint16_t numtodisplay);
void displayDigit(uint8_t number);

int main(void){
while (1)
  {
    /* USER CODE END WHILE */
      num_display_func(0209);
    /* USER CODE BEGIN 3 */
  }


void num_display_func(uint16_t numtodisplay){

    uint8_t digit_extract[4];

    digit_extract[0] = numtodisplay%10;       //extract the last digit of the number
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, SET);
    displayDigit(digit_extract[0]);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, RESET);

    HAL_Delay(10);

    digit_extract[1] = (numtodisplay/10)%10;  //extract the second last digit
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, SET);
    displayDigit(digit_extract[1]);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, RESET);

    HAL_Delay(10);

    digit_extract[2] = (numtodisplay/100)%10; //extract the third last digit
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, SET);
    displayDigit(digit_extract[2]);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, RESET);

    HAL_Delay(10);

    digit_extract[3] = (numtodisplay/1000)%10; //extract the fourth last digit
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, SET);
    displayDigit(digit_extract[3]);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, RESET);

    HAL_Delay(10);

}

void displayDigit(uint8_t number){


    GPIOC->ODR |= GPIOx_SEGMENTS_MASK;  //Clear the segment bits (Setting the bits to HIGH for common Anode config)

    uint8_t digit = segmentCodes[number];

    GPIOC->ODR |= (digit & GPIOx_SEGMENTS_MASK );

}

当我尝试运行代码时,出现错误:

./Core/Src/main.c:115:21: error: invalid digit "9" in octal constant
  115 |    num_display_func(0209);
      |                     ^~~~

据我所知,如果删除 0 就可以解决这个问题。但在这种情况下,我如何显示数字 0209 或任何其他以零开头的数字?

如果我把号码中的0去掉,可能会显示209而不是0209。如何解决这个问题?

c embedded stm32 microcontroller
2个回答
1
投票

这里

0209
是数的源代码演示,为了程序员的利益,没有别的。它与某些 GUI 中的用户演示无关。

正如您所注意到的,

0
是用于八进制数的前缀,因此仅适用于特殊场景。

您的显示例程输出的内容完全取决于其内部的迭代次数:也就是说,您使用

% 10
提取数字然后将该数字除以
/ 10
的次数。

i=0   209 % 10 = 9
i=1    20 % 10 = 0
i=2     2 % 10 = 2
i=3     0 % 10 = 0
...
i=n     0 % 10 = still 0

1
投票

C 中的数字前缀为

0x
(表示十六进制)和
0
(表示八进制)。

但是在这种情况下,我如何显示数字 0209 或任何其他以零开头的数字?

这是一个完全不同的误解。你的问题确实应该是关于这个的。该值是一个整数,它将作为 4 个字节的 32 位二进制值存储在您的目标内存中。代码中的十进制(或八进制)表示形式不会被保留或表示,无论您添加多少个前导零或使用什么基数,它只是一个

int
文字常量。

如果您打算以带前导零的四位数字来呈现该值,那么这是一个呈现问题,而不是表示问题。就是你在显示的时候就决定了如何显示。

在您的情况下,您只需测试第一个数字的

n < 1000
,如果为真则输出零,而不是
(numtodisplay/10)%10
。然后分别比较第二个和第三个数字的 100 和 10。

© www.soinside.com 2019 - 2024. All rights reserved.