这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 咨询关于STC单片机驱动的LED数码管亮度不一致问题

共4条 1/1 1 跳转至

咨询关于STC单片机驱动的LED数码管亮度不一致问题

工程师
2020-09-16 14:52:36     打赏

现在是这样的,选了芯片6个IO口连上了6个数码管的共阳极,直连,没有任何电阻。然后我只点亮一个,共阳极电压为1.3.点亮3个,电压为0.9,点亮6个,电压为0.4.测量的都是平均电压,示波器测的共阳极电压为3V左右,大部分时间为低电平,只有开启那一会是高电平。简单来说波形是正常的。const char num[10]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};//数码管数字0-9,未点亮小数点,需点亮每个小数点则&0xdf

void Timer2Int(void) interrupt 5  //定时时间为2.5ms左右,数码管未发生闪烁。
{
        static char i=0;       
        TF2 = 0;   //溢出清零
//        flush_flag=1;       
        i++;
        switch(i){
                case 1:brighdig(1,1,(current/100));break;
                case 2:brighdig(1,2,(current/10)%10);break;
                case 3:brighdig(1,3,(current%10));break;
                case 4:brighdig(0,1,(n/100));break;
                case 5:brighdig(0,2,(n/10)%10);break;
                case 6:brighdig(0,3,(n%10));break;
        }
        if(i>=6) i=0;                          
}

void brighdig(unsigned char flag,unsigned char number,unsigned int cur)
{       
        DIG21=0;        //数码管共阳极
        DIG22=0;
        DIG23=0;
        DIG11=0;
        DIG12=0;
        DIG13=0;
        if(flag){
                switch(number){
                        case 1:        DIG21=1;
                                        display_num(num[cur]&0xdf);        //点亮小数点
                                        break;
                        case 2:        DIG22=1;
                                        display_num(num[cur]);
                                        break;
                        case 3:        DIG23=1;
                                        display_num(num[cur]);
                                        break;         
                }
        }
        else{
                 switch(number){
                        case 1:        DIG11=1;
                                        display_num(num[cur]&0xdf);
                                        break;         
                        case 2:        DIG12=1;
                                        display_num(num[cur]);       
                                        break;
                        case 3:        DIG13=1;
                                        display_num(num[cur]);
                                        break;
                }
        }       
}

void display_num(unsigned char num)
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                CLK=0;                  
                if(num&0X01)
                {
                        DAS=1;
                }
                else {
                        DAS=0;
                }               
                CLK=1;                          
                num=num>>1;
        }

}


关闭了其它中断,只有定时器中断在工作。供电电压为3V,显示就如图。只有0是暗的,其它数字很正常。扫描时间也改过,还是一样。然后3.3V供电的话亮度是比3V供电好点,现在就是想3V供电有没有扫描办法解决这个问题。
电路图:(LED与芯片,74HC164连接)


0很暗,其它数字很亮

所有的0都暗






关键词: STC单片机     数码管     亮度     LED         

工程师
2020-09-16 19:44:20     打赏
2楼

每次只点亮数码管的一段,6*8=48段一个循环,还有必须要接限流电阻


工程师
2020-09-16 19:52:21     打赏
3楼

试一下把显示部分直接放到while里面呢?不要放在定时器里面


工程师
2020-09-16 19:56:37     打赏
4楼

这种程序框架都不对,显示应该设置缓冲区,中断只管从缓冲区取数据显示,做简单的动作,主程序要显示什么就往缓冲区里填


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]