Преобразование кода ошибки в азбуку Морзе в c

Я пытаюсь написать программу, которая (в конце концов) будет мигать светодиодом, чтобы указать код ошибки в азбуке Морзе.

Прямо сейчас я застрял (в основном) на выяснении, как я могу прочитать код ошибки слева направо.

В данный момент я просто пытаюсь разобраться в программе. Вызовите функцию с кодом ошибки -> распечатайте азбуку Морзе на консоли.

Вот что у меня есть:

#define LED_DIT '.'
#define LED_DAH '-'
#define LED_INTER_GAP "" /* Delays within a letter */
#define LED_SHORT_GAP " " /* Delay between letters */
#define LED_MEDIUM_GAP "\n" /* Delay between words */

#include <stdio.h>
#include <stdint.h>

char morseDigits[10][5] = {
    {LED_DAH, LED_DAH, LED_DAH, LED_DAH, LED_DAH}, // 0
    {LED_DIT, LED_DAH, LED_DAH, LED_DAH, LED_DAH}, // 1
    {LED_DIT, LED_DIT, LED_DAH, LED_DAH, LED_DAH}, // 2
    {LED_DIT, LED_DIT, LED_DIT, LED_DAH, LED_DAH}, // 3
    {LED_DIT, LED_DIT, LED_DIT, LED_DIT, LED_DAH}, // 4
    {LED_DIT, LED_DIT, LED_DIT, LED_DIT, LED_DIT}, // 5
    {LED_DAH, LED_DIT, LED_DIT, LED_DIT, LED_DIT}, // 6
    {LED_DAH, LED_DAH, LED_DIT, LED_DIT, LED_DIT}, // 7
    {LED_DAH, LED_DAH, LED_DAH, LED_DIT, LED_DIT}, // 8
    {LED_DAH, LED_DAH, LED_DAH, LED_DAH, LED_DIT} // 9
};

void LEDMorseDigit(uint8_t digit) {
    uint8_t i;

    for(i=0; i<5; i++) {
        printf(morseDigits[digit][i]);
        printf(LED_INTER_GAP);
    }
}

void LEDMorseCode(uint8_t errorCode) {

    uint8_t i = 0;

    // Play error sequence of digits, left to right
    while(*(errorCode + i)) {
        LEDMorseDigit(errorCode[i++]);
        printf(LED_SHORT_GAP);
    }
    printf(LED_MEDIUM_GAP);

}

int main(void) {
    LEDMorseCode(1);
    LEDMorseCode(23);
    LEDMorseCode(123);

    return 0;
}

while(*(errorCode + i)) {...} это то, что я взял из примера чтения символа * слева направо. Я действительно хотел бы сделать это без создания новых переменных для хранения данных.

Я подумал о том, чтобы просто прочитать число справа налево по модулю / делению и вызвать функцию с обратным кодом ошибки, но я бы предпочел этого не делать, так как это может привести к некоторой путанице.

Итак, как я могу создать функцию, которая принимает значение u-int и захватывает каждую цифру слева направо?

Мне лучше просто передать значение в виде строки и преобразовать каждый символ в int?

1 ответ

Решение

Вам необходимо преобразовать целое число в последовательность цифр. Вы можете сделать это с помощью простого рекурсивного цикла div/mod:

void LEDMorseCode(unsigned errorCode) {
    if (unsigned r = errorCode/10) {
        LEDMorseCode(r);
        printf(LED_SHORT_GAP); }
    LEDMorseDigit(errCode % 10);
}

или вы можете преобразовать число в строку ASCII с помощью sprintf, а затем испустить эти цифры.

Другие вопросы по тегам