打印

问一个不用蕊片控制100个LED显示字的问题

[复制链接]
2801|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
无聊小子|  楼主 | 2009-7-29 21:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟问一个不用蕊片控制100个LED显示字的问题。。。小弟不想用蕊片控制LED,用89S51和十个三极管作开关控制100个LED,电路图原理像键盘扫描差不多(图画得好烂各位大侠请多多包涵)当扫描时间为一秒时可精确控制每一个LED闪烁。。。但扫描时间很快时(利用视觉XX使字显示)显示出的字不停抖动而且亮度很差。。为什么呢??有什么解救方法。。。。

#include <reg51.h>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
void OFF();
void del();
void lll(char *a);
sbit D0=P0^0;
sbit D1=P0^1;
sbit D2=P0^2;
sbit D3=P0^3;
sbit D4=P0^4;
sbit D5=P0^5;
sbit D6=P0^6;
sbit D7=P0^7;
sbit D8=P1^0;
sbit D9=P1^1;
sbit X8=P1^2;
sbit X9=P1^3;
sbit X0=P2^0;
sbit X1=P2^1;
sbit X2=P2^2;
sbit X3=P2^3;
sbit X4=P2^4;
sbit X5=P2^5;
sbit X6=P2^6;
sbit X7=P2^7; 
char a[10][10]={'0','0','0','0','1','1','0','0','0','0',
                '0','0','0','0','1','1','0','0','0','0',
                    '0','0','0','0','1','1','0','0','0','0',
                    '0','0','0','0','1','1','0','0','0','0',
                    '1','1','1','1','1','1','1','1','1','1',
                    '0','0','0','0','1','1','0','0','0','0',
                    '0','0','0','0','1','1','0','0','1','0',
                    '0','0','0','0','1','0','0','0','0','0',
                    '1','1','1','1','0','0','1','1','1','1'
                };
             
main()
{OFF();

   while(1)
     {   lll(a);

     }
}
void del()  //延时
{int i,j;
for(i=0;i<10;i++)
for(j=0;j<1000;j++);
}
void OFF()    //全部关闭
{P0=0xFF;
D8=TRUE;
D9=TRUE;
P2=0x00;
X8=FALSE;
X9=FALSE;
}

void lll(char a[10][10])    //在数组里面扫描使LED亮
{int i,j;
    for(i=0;i<10;i++)
       for(j=0;j<10;j++)
          { 
                del();      //延时
               OFF();     //关闭灯
             
           switch(j)
                {case 0: X0=TRUE;break;
                case 1: X1=TRUE;break;
                case 2: X2=TRUE;break;
                case 3: X3=TRUE;break;
                case 4: X4=TRUE;break;
                case 5: X5=TRUE;break;
                case 6: X6=TRUE;break;
                case 7: X7=TRUE;break;
                case 8: X8=TRUE;break;
                case 9: X9=TRUE;break;
            }
        if(a[j]=='1'&&i==0) 
             D0=FALSE;
          if(a[j]=='0'&&i==0) 
               D0=TRUE;
        if(a[j]=='1'&&i==1) 
               D1=FALSE;    
        if(a[j]=='0'&&i==1) 
               D1=TRUE;     
         if(a[j]=='1'&&i==2) 
             D2=FALSE;
          if(a[j]=='0'&&i==2) 
               D2=TRUE;
                if(a[j]=='1'&&i==3) 
             D3=FALSE;
          if(a[j]=='0'&&i==3) 
               D3=TRUE;
        if(a[j]=='1'&&i==4) 
             D4=FALSE;
          if(a[j]=='0'&&i==4) 
               D4=TRUE;    
            if(a[j]=='1'&&i==5) 
             D5=FALSE;
          if(a[j]=='0'&&i==5) 
               D5=TRUE; 
            if(a[j]=='1'&&i==6) 
             D6=FALSE;
          if(a[j]=='0'&&i==6) 
               D6=TRUE;    
            if(a[j]=='1'&&i==7) 
             D7=FALSE;
          if(a[j]=='0'&&i==7) 
               D7=TRUE;    
            if(a[j]=='1'&&i==8) 
             D8=FALSE;
          if(a[j]=='0'&&i==8) 
               D8=TRUE;    
            if(a[j]=='1'&&i==9) 
             D9=FALSE;
          if(a[j]=='0'&&i==9) 
               D9=TRUE;    
                }
                }

相关帖子

沙发
无聊小子|  楼主 | 2009-7-29 21:53 | 只看该作者

呜呜呜

大侠呢????呜呜呜呜

使用特权

评论回复
板凳
highgear| | 2009-7-29 23:03 | 只看该作者

电路设计的问题。

不能用io 口直接驱动LED, 否则就会出现亮度不均的问题,因为8个亮时的吸入电流不会是只有一个亮时的8倍。

解救方法:列用PNP,P2.0, P2.1可以接74HC164驱动8个NPN

使用特权

评论回复
地板
keasy| | 2013-11-4 13:10 | 只看该作者
动态扫描驱动电流不足、刷新频率不够时出问题的可能很大

使用特权

评论回复
5
zwz7219| | 2013-11-4 16:24 | 只看该作者
你的问题我碰到过,是扫描的时间不准确造成,一味地增加扫描频率没有太大的改善。我当时做那个项目,是用模拟 PWM 进行调光,占空比分别是100%、50%、25% 和 12.5%,扫描频率在 122Hz,闪动的明显,尤其在低占空比的情况下,频率提高到 244Hz 都不行,后来改为在中断里面做,61Hz 时看上去已经十分稳定。

对于你的情况,也类似,在中断里面做,并且端口设定完成后,立即把下次显示的数据准备好(如 BCD 转 7 段),而不是下一次进中断后,先关显示,然后转换数据,接着更新端口,打开显示,这样会造成相邻两帧数据显示的时间不同,即使扫描时间准确(进入中断时间准确),也会闪烁。

同样,进入中断后,先做显示更新工作,再做其它的,如定时器更新等,以免帧与帧之间的时间不准确,更不可以在显示更新程序前面加入执行时间不确定的语句。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

10

帖子

0

粉丝