在大程序中怎么样显示LED点阵

来源:互联网 发布:淘宝的详情页怎么制作 编辑:程序博客网 时间:2024/04/28 14:26

   当然,LED点阵的显示在网上有很多简单的方法,我总结了一下,大多都是用死延时的方法来扫描LED的行或者是列,,,一般的方法都是如下如写的:

   以8*8点阵为例:

   byte code tab[] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

   byte hang;

    void writeDataTo595(byte data)

   {

             byte i;

              led_OE_CLK = 0;

              for(i=0;i<8;i++)

             {

                          led_clk = 0;

                          if(data&0x80)     led_data = 1;

                         else                        led_data = 0;

                           led_clk = 1;

             }

              led_OE_CLK =1;

   }

  void display()

{

         byte i;

          for(i=0;i<8;i++) 

         {

                  writeDataTo595(tab[i]);

                   hang = 0x01<<i;

                   delay();

                  hang = 0x00;

         }      

}

void main()

{

          display();

}

显然这种方法只适合用于学习点阵原理,不适合用于实际的工程。在实际做工程时,点阵的显示是比较复杂的,而大工程中,点阵显示有可能只是工程中的一小部分,如果用这种方法来扫描点阵的话。那程序就没有方法做其他的任务了。。原因为几个方面:

1.大程序中,主循环一般是不可以放延时程序的。。。当以上的dislay()放到man()里实时循环的话。整个程序系统将不稳定。。

2 若用死延时的方法处理点阵,那么工程中其他的任务将有可能被延时。导致系统不能实时的处理。

3 点阵的扫描靠的是不段的驱动来完成的。扫描的过程是不可以被中断的。。一旦中断的时间长一些,必会导致扫描速度变慢而导致点阵显示有闪烁。如果有死延时的方法来扫描点阵的话。大工程中很难做到让点阵实时扫描。。

综上所述,点阵扫描不能用死延时方法完成。下面我来介绍一下另一种较为可靠的方法,状态机扫描方法。

程序如下:

   void display()

{

     switch(state)

      {

               case 0:   hang = 0x00;

                               writeDataTo595(tab[state]);

                                hang = 0x01<<state;

                                break;

               case 1 :  hang = 0x00;

                               writeDataTo595(tab[state]);

                                hang = 0x01<<state;

                               break;

                case 2:   hang = 0x00;

                               writeDataTo595(tab[state]);

                                hang = 0x01<<state;

                                break;

               case 3 :  hang = 0x00;

                               writeDataTo595(tab[state]);

                                hang = 0x01<<state;

                               break;

                case 4:   hang = 0x00;

                               writeDataTo595(tab[state]);

                                hang = 0x01<<state;

                                break;

               case 5:  hang = 0x00;

                               writeDataTo595(tab[state]);

                                hang = 0x01<<state;

                               break;

                case 6:   hang = 0x00;

                               writeDataTo595(tab[state]);

                                hang = 0x01<<state;

                                break;

               case 7:  hang = 0x00;

                               writeDataTo595(tab[state]);

                                hang = 0x01<<state;

                               break;

    }

 

}

 

void interrput timer ()

{

            state++;

          if(state>=8)

                state = 0;

}

这个状态机的方法处理点阵扫描时没有用到delay的死延时方式。而是用中断的方式改变状态的方法来扫描点阵中的每一行,能使程序实时性更高。若大工程中有其他的任务刚性需要延时,可以在延时程序中加入display而不会影响程序。更好的让display不段的驱动led。显示效果更佳。

 

原创粉丝点击