打印
[51单片机]

STC15系列单片机驱动数码管亮度与消隐问题

[复制链接]
2109|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jianwei2030|  楼主 | 2017-10-7 21:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jianwei2030 于 2017-10-7 21:37 编辑

    自己做了块万年历的板子,使用STC15W408单片机,使用74HC573驱动数码管,数码管每一段采用三颗LED并联组成,采用共阳方式连接,共8位数码管。
    调时程序时发现无法解决消隐问题,单个位不该显示的段乱闪,如果刷新频率太高,数码管显示亮度过低,以至于白天不能分辨显示字符,请大家帮忙看看程序怎么改进下。
    其中:delay(MAX)\delay(PWM)分别是延时不同的时间。
                for(i = 0;i < 150;i++)
                {
                        xianshi_data();//读取DS1302时钟数据
                        du = 1; P1 = 0xff;        du = 0;        delay(PWM);
                        we = 1;          P1 = 0x00;   we = 0;        delay(MAX);
                        du = 1; P1 = duan[year/10];        du = 0;        
                        we = 1; P1 = 0x01; we = 0;        delay(SPEED);   //年的十位  1111 1110                                                      
//                                                
                        du = 1; P1 = 0xff;        du = 0;        delay(PWM);
                        we = 1;          P1 = 0x00;   we = 0;   delay(MAX);                                                
                        du = 1; P1 = duan[year%10];        du = 0;
                        we = 1; P1 = 0x02; we = 0;        delay(SPEED);        //年的个位  1111 1101
//                                                         
                        du = 1; P1 = 0xff;        du = 0;        delay(PWM);
                        we = 1;          P1 = 0x00;   we = 0;   delay(MAX);
                        du = 1;        P1 = 0x85; du = 0;                  
                        we = 1; P1 = 0x04;  we = 0;        delay(SPEED);         //间隔横线 1111 1011
//                                       
                        du = 1; P1 = 0xff;        du = 0;        delay(PWM);
                        we = 1;          P1 = 0x00;   we = 0;   delay(MAX);
                        du = 1; P1 = duan[mouth/10]; du = 0;
                        we = 1; P1 = 0x08;  we = 0;        delay(SPEED);          //月的十位 1111 0111
//                                       
                        du = 1; P1 = 0x0ff;        du = 0;        delay(PWM);
                        we = 1;          P1 = 0x00;   we = 0;   delay(MAX);
                        du = 1;P1 = duan[mouth%10];         du = 0;
                        we = 1;        P1 = 0x10; we = 0;        delay(SPEED);          //月的个位 1110 1111
//                                                
                        du = 1; P1 = 0xff;        du = 0;        delay(PWM);
                        we = 1;          P1 = 0x00;   we = 0;   delay(MAX);
                    du = 1;        P1 = 0xfd; du = 0;                  
                          we = 1; P1 = 0x20; we = 0;        delay(SPEED);          //间隔横线位 1101 1111
//                                                du = 1; P1 = 0x00;        du = 0;        delay(50);

                        du = 1; P1 = 0xff;        du = 0;        delay(PWM);
                        we = 1;          P1 = 0x00;   we = 0;   delay(MAX);
                        du = 1;        P1 = duan[day/10]; du = 0; ;
                          we = 1; P1 = 0x40; we = 0;        delay(SPEED);           //天的十位 1011 1111
//                                                du = 1; P1 = 0x00;        du = 0;        delay(50);

                        du = 1; P1 = 0xff;        du = 0;        delay(PWM);
                        we = 1;          P1 = 0x00;   we = 0;        delay(MAX);
                        du = 1;        P1 = duan[day%10]; du = 0;        
                          we = 1;P1 = 0x80;         we = 0;        delay(SPEED);                  //天的个位 0111 1111
//                                                du = 1; P1 = 0x00;        du = 0;        delay(50);
                }
        }
                                       

相关帖子

沙发
mcu5i51| | 2017-10-8 07:49 | 只看该作者
最好先把你的程序改为中断方式驱动的再说其它的;
给学校老师交作业就算了

使用特权

评论回复
板凳
xiaoxiong1988| | 2017-10-14 10:13 | 只看该作者
参考
for(i=0;i<8;i++)
{
    P0=temp;
    wm=1;
    wm=0;
    delay(1);
    P0=table[i];
    dm=1;
    dm=0;
    delay(1);
    temp=temp<<1;
    P0=0XFF;
    dm=1;
    dm=0;
}             
改变一下你送数据du和wei的方式  然后 送一个数据之后 清掉dm和P口数据

使用特权

评论回复
地板
xiaoxiong1988| | 2017-10-14 10:16 | 只看该作者
du = 1; P1 = 0xff;        du = 0;        delay(PWM);
we = 1;          P1 = 0x00;   we = 0;        delay(MAX)
截取你的程序,在we=1之前P1=0xff  在你置位we的时候 P1已经送出0xFF 在P1=0x00 你想想的 会不会出现乱码和重影?

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝