当前位置:WooYun(白帽子技术社区) >> 开源硬件 >> 想自己由头到尾做这么一个玩意儿~~控制一个三维发光二极管矩阵

想自己由头到尾做这么一个玩意儿~~控制一个三维发光二极管矩阵

专业查水表 (我是"J.L"的代言人o(`ω´ )o) | 2013-04-13 15:21

看到个“电子水立方”的玩意,就是一个三维的发光二极管矩阵,通过编程控制其发光组成不同的发光图形,然后自己也想做一个。
自己只有C语言、C#的基础和php的web开发基础....
应该怎么入手?
是不是要学单片机?是不是有相应的硬件语言的??
求指导谢谢~~~

就好像下面视频这个,不过我不需要那么复杂,大概10*10*10的二极管数量就够了,然后二极管也只需要是发一种光就行了(淘宝这种就差不多了http://item.taobao.com/item.htm?spm=a230r.1.14.76.3GfESz&id=21316384066
参考视频http://v.ku6.com/show/1Q3utUeLK_e0O3-3.html?nr=1

分享到:
  1. 1#
    回复此人 感谢
    VIP (Fatal error: Call to undefined function getwb() in /data1/www/htdocs/106/wzone/1/index.php on line 10|@齐迹@小胖子@z7y@nauscript|昨晚做梦梦见了一个ecshop注射0day,醒来后忘记在哪了。|预留广告位) | 2013-04-13 17:01

    推荐Arduino,简单易懂。

  2. 2#
    回复此人 感谢
    z@cx (日复一日,年复一年) | 2013-04-13 17:41

    这个的确不错呀。楼主要是做好了给教程呀!!!

  3. 3#
    回复此人 感谢
    核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2013-04-13 18:02

    搜索:LED 立方体

  4. 4#
    回复此人 感谢
    whirlwind (别打开http://198.15.216.171/) | 2013-04-13 18:52

    Arduino啊

  5. 5#
    回复此人 感谢
    二哥三摆手 | 2013-04-23 13:27

    这个要学数电吧。。

  6. 6# 感谢(2)
    回复此人 感谢
    gainover (">_< ' / & \ 看啥,没见过跨站字符么) | 2013-04-23 13:30

    看起来挺酷~~

  7. 7#
    回复此人 感谢
    erevus | 2013-05-10 10:47

    // ShowDigit.cpp : Defines the entry point for the console application.
    //

    #include "stdafx.h"
    #include "stdlib.h"
    #include "conio.h"
    #include "string.h"

    /*
    这是每个数字对应的数码管号的矩阵
    例如第一行表示数字0所对应的数码管的标号为0 1 2 3 5 6 7
    也就是说只有3号数码管是暗的,其它的数码管都是点亮的
    再如:数字8所对应的所有数码管都是亮的。
    数码管的标号是按照从上到下,从左到右的顺序进行的,
    下列示意图:

    0000
    1    2
    1    2
    3333
    4    5
    4    5
    6666
    */

    static int MX[10][7] =
    {
      {1,1,1,0,1,1,1},
      {0,0,1,0,0,1,0},
      {1,0,1,1,1,0,1},
      {1,0,1,1,0,1,1},
      {0,1,1,1,0,1,0},
      {1,1,0,1,0,1,1},
      {1,1,0,1,1,1,1},
      {1,0,1,0,0,1,0},
      {1,1,1,1,1,1,1},
      {1,1,1,1,0,1,1}
    };

    /*
    这是用于模拟显示效果的缓冲
    因为无法驱动真正的数码管,我们把要驱动的数码管所在的位置“描绘”到缓冲区中
    每个缓冲区只能描绘1个数字,缓冲区“像素”数为:7x4
    比如,3号数码管在缓冲区中的描绘为:
    ....
    ....
    ....
    @@@@
    ....
    ....
    ....
    再比如,5号管描述为:
    ....
    ....
    ....
    ...@
    ...@
    ...@
    ...@
    注意,不同数码管所占据的模拟位置稍有重叠,这并不影响效果。
    */
    static char BUF1[7][4];
    static char BUF2[7][4];
    static char BUF3[7][4];


    void init_buf(char p[][4])
    {
      for(int i=0; i<7; i++){
        for(int j=0; j<4; j++){
          p[i][j] = '.';
        }
      }
    }


    void write_one_to_buf(char buf[][4], int n)
    {
      int i;
      switch(n){
      case 0:
        for(i=0; i<4; i++)
          buf[0][i] = '@';
        break;
      case 1:
        for(i=0; i<4; i++)
          buf[i][0] = '@';
        break;
      case 2:
        for(i=0; i<4; i++)
          buf[i][3] = '@';
        break;
      case 3:
        for(i=0; i<4; i++)
          buf[3][i] = '@';
        break;
      case 4:
        for(i=0; i<4; i++)
          buf[i+3][0] = '@';
        break;
      case 5:
        for(i=0; i<4; i++)
          buf[i+3][3] = '@';
        break;
      case 6:
        for(i=0; i<4; i++)
          buf[6][i] = '@';
        break;
      }
    }


    void show_buf()
    {
      printf("\n");
      for(int i=0; i<7; i++){
        for(int j=0; j<4; j++){
          printf( "%c", BUF1[i][j]);
        }
        printf("   ");
        for(j=0; j<4; j++){
          printf( "%c", BUF2[i][j]);
        }
        printf("   ");
        for(j=0; j<4; j++){
          printf( "%c", BUF3[i][j]);
        }

        printf("\n");
      }
    }

    // lk: 水平放大系数, hk: 垂直放大系数
    void show_buf_big(int lk, int hk)
    {
      // 限制参数的幅度
      if(lk<1)  lk = 1;
      if(lk>5)  lk = 5;
      if(hk<1)  hk = 1;
      if(hk>5)  hk = 5;

      printf("\n");
      for(int i=0; i<7; i++){
        for(int k1=0; k1<hk; k1++){
          for(int j=0; j<4; j++){
            for(int k2=0; k2<lk; k2++)
              printf( "%c", BUF1[i][j]);
          }
          printf("   ");
          for(j=0; j<4; j++){
            for(int k2=0; k2<lk; k2++)
              printf( "%c", BUF2[i][j]);
          }
          printf("   ");
          for(j=0; j<4; j++){
            for(int k2=0; k2<lk; k2++)
              printf( "%c", BUF3[i][j]);
          }
          printf("\n");
        }
      }
    }


    void show_buf_lean()
    {
      printf("\n");
      for(int i=0; i<7; i++){
        
        for(int k=0; k<7-i; k++){
          printf(" ");
        }

        for(int j=0; j<4; j++){
          printf( "%c", BUF1[i][j]);
        }
        printf("   ");
        for(j=0; j<4; j++){
          printf( "%c", BUF2[i][j]);
        }
        printf("   ");
        for(j=0; j<4; j++){
          printf( "%c", BUF3[i][j]);
        }
        printf("\n");
      }
    }


    void write_to_buf(char buf[7][4], int digit)
    {
      // 某个数字由那些根数码管组成?
      for(int i=0; i<7; i++){
        if(MX[digit][i] == 1)
          write_one_to_buf(buf, i);
      }
    }


    int main(int argc, char* argv[])
    {
      for(;;){
        printf("请输入要显示的3位整数(100-999), 输入exit退出: ");
        char buf[100];
        gets(buf);
        
        if(strcmp(buf,"exit")==0) break;

        int n = atoi(buf);
        if(n<100 || n>999){
          printf("输入的数字无效!重新输入...\n");
          continue;
        }

        // 分解为:千位、百位、个位
        int a = n / 100;  
        int b = n / 10 % 10;
        int c = n % 10;

        init_buf(BUF1);
        init_buf(BUF2);
        init_buf(BUF3);

        //在实际应用中,只要知道了需要显示哪些数码管,就可以直接控制它们,
        //在此处,我们通过刷新到一个用于输出的缓冲区来模拟这个过程:
        //不亮的位置,我们用“.”来表示,点亮的位置,我们用“@”来表示
        write_to_buf(BUF1, a);  
        write_to_buf(BUF2, b);
        write_to_buf(BUF3, c);

        show_buf();  // 显示模拟缓冲区中的内容

        printf("按任意键继续..");
        getch();
        show_buf_lean();  // 倾斜显示

        printf("按任意键继续..");
        getch();
        show_buf_big(2,3);  // 水平放大2倍,垂直放大3倍

        printf("按任意键继续..");
        getch();
        show_buf_big(5,1);  // 水平放大5倍,垂直放大1倍(垂直不放大)
      }

      return 0;
    }

  8. 8#
    回复此人 感谢
    erevus | 2013-05-10 10:58

    上面那个是N年前的全国软件大赛题控制7个二极管
    个人觉得 写这种东西要求思维太高了T.T
    题目:我们给出了一个用于模拟这个显示过程的程序,并提供了源代码。输入数字,可以在控制台示意这些数字的对应数码管显示的效果,亮的管显示为“@”, 不亮的管显示为“.”。
    程序的主要用途是:决定哪个数字由哪些点亮的数码管组成。因为不能控制真的数码管,所以采用了一个字符缓冲区来模拟效果。

  9. 9#
    回复此人 感谢
    专业查水表 (我是"J.L"的代言人o(`ω´ )o) | 2013-05-10 12:18

    @erevus 妹子没了,不做了

  10. 10#
    回复此人 感谢
    党中央 ()()()()()()() | 2013-05-10 12:33

    @专业查水表 就是没妹子才要做啊.. 生日礼物送一个 倍儿有面子,说不定一个妹子就到手了~

添加新回复

登录 后才能参与评论.

WooYun(白帽子技术社区)

网络安全资讯、讨论,跨站师,渗透师,结界师聚集之地

登录

其它内容

  • 暂无