您的位置:首页 > 其它

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

2012-04-18 10:34 330 查看
当然,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。显示效果更佳。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: