C程序从数组中打印出LCD数字

标签 c arrays lcd

很抱歉,如果这是重复的问题。但这一次我想弄清楚我的问题以及我希望我的输出如何。我接到一个项目,创建一个 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;
    }

编译时,它一直显示: arrays error 感谢您的时间和帮助!

最佳答案

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;
}

输出:

 - - 
|   |

|   |
 - - 

  |  

  |  

 - - 
    |
 - - 
|    
 - - 
 - - 
    |
 - - 
    |
 - - 

|   |
 - - 
    |

 - - 
|    
 - - 
    |
 - - 
 - - 
|    
 - - 
|   |
 - - 
 - - 
    |

    |

 - - 
|   |
 - - 
|   |
 - - 
 - - 
|   |
 - - 
    |
 - - 

关于C程序从数组中打印出LCD数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24233419/

相关文章:

c - 当一个字符串只包含 '\0' 时会发生什么? C

java - 如何在android中将一个字符串添加到另一个字符串数组?

javascript - React 将数组从父状态传递到子状态

用于防止液晶屏幕上出现 "burn-in"问题的 Javascript

c - LCD 库 - MPLAB X

c - 如何在C中仅释放链表中的单个节点?

io - 如何在 C 中调用 execvp 后将错误消息传递给文件

python - 高效的一维数组比较、缩放和求和

c - 向 LCD 函数发送字符串,它是如何工作的?

c - 将 `int_least8_t` 转换为 `char` 时如何发出警告?