Преобразование кода ошибки в азбуку Морзе в 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
, а затем испустить эти цифры.