C程序从阵列中打印出LCD数字数字

时间:2014-06-15 19:40:31

标签: 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 感谢您的时间和帮助!

1 个答案:

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

输出:

 - - 
|   |

|   |
 - - 

  |  

  |  

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

|   |
 - - 
    |

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

    |

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