我正在尝试编写一个程序,它会(最终)使LED闪烁,以指示摩尔斯电码中的错误代码。
现在我(大多数时候)陷入困境,想知道如何从左到右阅读错误代码。
目前我只是试图让程序的基础失效。使用错误代码调用该函数 - >将摩尔斯电码打印到控制台。
这就是我所拥有的:
#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)) {...}
是我从一个从左到右阅读char *的例子。我真的很想在不创建新变量来保存数据的情况下这样做。
我考虑过用模数/除法从右到左读取数字并用反向错误代码调用函数但是我不愿意这样做,因为这可能会导致一些混淆。
那么如何创建一个带有u-int值并从左到右抓取每个数字的函数呢?
我最好将值作为字符串传递并将每个char转换为int?
答案 0 :(得分:1)
您需要将整数转换为数字序列。你可以用一个简单的递归div / mod循环来做到这一点:
void LEDMorseCode(unsigned errorCode) {
if (unsigned r = errorCode/10) {
LEDMorseCode(r);
printf(LED_SHORT_GAP); }
LEDMorseDigit(errCode % 10);
}
或者您可以使用sprintf
将数字转换为ASCII字符串,然后发出这些数字。