很抱歉,如果这是重复的问题。但是这一次我想让我的问题清楚,我希望我的输出如何。我给出了一个项目来创建一个C程序,从阵列列表中打印出LCD数字显示数字,这些数字将以文本文件的形式输出。我是这方面的新秀,我希望你能帮助我。它应该使用12个元素打印而不是普通的7元素LCD显示屏,与此图像完全相同:
这是我的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define COL 12
#define ROW 10
int main(void)
{
int i, j;
const int arr2 [ROW][COL] = {{1,1,1,0,0,0,1,1,1,0,1,1}, //0
{0,0,0,0,1,0,0,0,0,1,0,0}, //1
{1,1,0,1,0,1,1,1,1,0,1,0}, //2
{1,1,0,1,0,1,1,0,1,0,1,1}, //3
{0,0,1,1,0,1,1,0,0,0,0,1}, //4
{1,1,1,1,0,1,0,0,1,0,1,1}, //5
{1,1,1,1,0,1,0,1,1,0,1,1}, //6
{1,1,1,0,0,0,1,0,0,0,0,1}, //7
{1,1,1,1,0,1,1,1,1,0,1,1}, //8
{1,1,1,1,0,1,1,0,1,0,1,1}}; //9
/* The print functions should go here.
If array = 1, it should print out either this: _ or |
to print out the digital numbers.
Else, if array = 0, it will print out nothing */
这是我尝试的代码,但失败了。我没有完成代码,因为它没有正常工作。我在for循环中使用了if语句。所以我很困惑,我需要你的帮助。
for (i = 0; i < (sizeof(arr2)/sizeof(arr2[0][0])/COL); i++)
{
if (arr2[i][0] == 1)
{
printf("| ");
} else if (arr2[i][0] == 0)
{
printf("\t");
}
if (arr2[i][1] == 1)
{
printf("|");
} else if (arr2[i][1] == 0)
{
printf("\t\n");
}
if (arr2[i][2] == 1)
{
printf("|");
} else if (arr2[i][2] == 0)
{
printf("\t");
}
if (arr2[i][3] == 1)
{
printf("|");
} else if (arr2[i][3] == 0)
{
printf("\t");
}
if (arr2[i][4] == 1)
{
printf("|");
} else if (arr2[i][4] == 0)
{
printf("\t");
}
if (arr2[i][5] == 1)
{
printf("|");
} else if (arr2[i][5] == 0)
{
printf("\t");
}
if (arr2[i][6] == 1)
{
printf("|");
} else if (arr2[i][6] == 0)
{
printf("\t");
}
if (arr2[i][7] == 1)
{
printf("|");
} else if (arr2[i][7] == 0)
{
printf("\t");
}
if (arr2[i][8] == 1)
{
printf("|");
} else if (arr2[i][8] == 0)
{
printf("\t");
}
if (arr2[i][9] == 1)
{
printf("|");
} else if (arr2[i][9] == 0)
{
printf("\t");
}
if (arr2[i][10] == 1)
{
printf("|");
} else if (arr2[i][10] == 0)
{
printf("\t");
}
if (arr2[i][11] == 1)
{
printf("|");
} else if (arr2[i][11] == 0)
{
printf("\t");
}
for (j = 0; j < (sizeof(arr2)/sizeof(arr2[0][0])/ROW); j++)
{
if (arr2[0][j] == 1)
{
printf("_");
} else if (arr2[0][j] == 0)
{
printf("\t");
}
if (arr2[1][j] == 1)
{
printf("_");
} else if (arr2[1][j] == 0)
{
printf("\t");
}
if (arr2[2][j] == 1)
{
printf("_");
} else if (arr2[2][j] == 0)
{
printf("\t");
}
}
return 0;
}
编译时,它会一直显示:
感谢您的时间和帮助!
答案 0 :(得分:1)
12个细分中的每一个都由-
或|
表示;你应该有一个数组(字符串?),用于标识段被“点亮”时要打印的正确字符。如果段未亮起,则应打印空白而不是制表符。您的数组名称(arr2
)并非全部信息。
表面上看,代码可能是这些内容:
char segment[] = "--|||--|||--";
for (int digit = 0; digit < 10; digit++)
{
for (int segnum = 0; segnum < 12; segnum++)
{
if (arr2[digit][segnum] == 1)
putchar(segment[segnum]);
else
putchar(' ');
if (segnum == 1 || segnum == 4 || segnum == 6 || segnum == 9 || segnum == 11)
putchar('\n');
}
}
当需要换行符时,还有其他可能更好的编码方式。如果你发现自己一遍又一遍地编写几乎相同的代码(如小规模的if (segnum == 1 …)
行,或大规模的打印代码),那么你可能做错了。
但是,如果仔细查看数字0,1和2,您会发现每个都是5x5矩阵的打印位置(我使用x
来强调需要处理的点)。顶部的最后一个字符显示12个段的位置;这里的x将永远是空白(根据我的演示方案,这绝对不是你想要的)。
x-x-x xxxxx x-x-x x-x-x
|xxx| xx|xx xxxx| |x|x|
xxxxx xxxxx x-x-x x-x-x
|xxx| xx|xx |xxxx |x|x|
x-x-x xxxxx x-x-x x-x-x
- - - - - -
| | | | | | |
- - - -
| | | | | | |
- - - - - -
请注意,如果您使用_
代替-
,则会产生奇怪的效果。在解释1时,我选择了两个垂直段。您必须定义想要获得所需结果的输出。
可行代码
此解决方案包含5个阵列:数据阵列的错误修复版本,上面显示的字符串用于显示的字形,两个数组用于标识字符在5x5网格中出现的位置(x,y),以及包含显示数据的5x5字符矩阵。显示设置为所有空白,然后代码使用其他数组将正确的字符放在当前数字的正确位置。通常,我会使用一个结构数组而不是3个数组,但如果你只是学习数组,那么你可能还没有覆盖结构。
/* SO 24233419 - 12-segment LCD digits */
/* Assuming no structures - simplifying assignment to display[y][x] */
#include <stdio.h>
#include <string.h>
enum { COL = 12 };
int main(void)
{
const int lcd_segment[][COL] =
{
{ 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1 }, // 0
{ 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1
{ 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1 }, // 2
{ 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1 }, // 3
{ 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0 }, // 4
{ 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1 }, // 5
{ 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1 }, // 6
{ 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 }, // 7
{ 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1 }, // 8
{ 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1 }, // 9
};
const char segment_c[] = "--|||--|||--";
const char segment_x[] = { 1, 3, 0, 2, 4, 1, 3, 0, 2, 4, 1, 3 };
const char segment_y[] = { 0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4 };
char display[5][5];
for (int digit = 0; digit < 10; digit++)
{
memset(display, ' ', sizeof(display));
for (int segnum = 0; segnum < 12; segnum++)
{
if (lcd_segment[digit][segnum] == 1)
{
int x = segment_x[segnum];
int y = segment_y[segnum];
display[y][x] = segment_c[segnum];
}
}
for (int y = 0; y < 5; y++)
{
for (int x = 0; x < 5; x++)
putchar(display[y][x]);
putchar('\n');
}
}
return 0;
}
输出:
- -
| |
| |
- -
|
|
- -
|
- -
|
- -
- -
|
- -
|
- -
| |
- -
|
- -
|
- -
|
- -
- -
|
- -
| |
- -
- -
|
|
- -
| |
- -
| |
- -
- -
| |
- -
|
- -