传统数码管动态驱动程序的改进
科学人2011/12/25电子技术 IP:北京
    /*本贴纯属原创,如有雷同不胜荣幸*/
    这是用C51编写的数码管动态显示驱动程序:


#include"reg51.h"

#define uchar unsigned char    
#define uint unsigned int

sbit duan=P2^0;    
sbit wei=P2^1;    

void delay(uint);

uchar code numbers[]=
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};

void main()
{
    while(1)
    {
        duan=1;    
        P1=numbers[1];
        duan=0;
        P1=0xff;
        wei=1;
        P1=0xfe;
        wei=0;
        delay(10);
        duan=1;    
        P1=numbers[2];
        duan=0;
        P1=0xff;
        wei=1;
        P1=0xfd;
        wei=0;
        delay(10);

        duan=1;    
        P1=numbers[3];
        duan=0;
        P1=0xff;
        wei=1;
        P1=0xfb;
        wei=0;
        delay(10);

        duan=1;    
        P1=numbers[4];
        duan=0;
        P1=0xff;
        wei=1;
        P1=0xf7;
        wei=0;
        delay(10);

        duan=1;    
        P1=numbers[5];
        duan=0;
        P1=0xff;
        wei=1;
        P1=0xef;
        wei=0;
        delay(10);

        duan=1;    
        P1=numbers[6];
        duan=0;
        P1=0xff;
        wei=1;
        P1=0xdf;
        wei=0;
        delay(10);

        duan=1;    
        P1=numbers[7];
        duan=0;
        P1=0xff;
        wei=1;
        P1=0xbf;
        wei=0;
        delay(10);

        duan=1;    
        P1=numbers[8];
        duan=0;
        P1=0xff;
        wei=1;
        P1=0x7f;
        wei=0;
        delay(10);
    }
}

void delay(uint a)
{
    uchar b;
    uint c;
    for(c=a;c>0;c--)
        for(b=200;b>0;b--);
}
    
   乍一看好像没什么问题,这不就是书上的例程吗?不错,这就是在书上、网上能够找到的最普遍的使用锁存器驱动数码管的C程序,大家已经很习惯了。
    如果我告诉你还有比它更好的程序,你会不会很惊讶?不用惊讶,下面请看我的分析。
    为了使显示清晰,设计者加入了“消影”。想必大家已经知道“消影”的概念了:在送完段选数据之后,I/O 口仍然保持该状态。若直接打开位选,原来的段选数据就会被送入位选,虽然持续时间短暂,但在高速显示的状态下仍会相互重叠,产生“影子”。加上消影后,使I/O 口在位选打开之前变成FF,这样哪一位也不会亮,“影子”问题也就解决了。
    问题真的解决了吗?我们将这个程序下载至单片机:嗯,比不加消影好多了,可是还感觉不太稳定,能不能把延时调短呢?将延时调短,下载至单片机,效果如图所示。
IMG_0062.jpg
   重影出现了,它从哪里来呢?原因如下:段选打开之后,上次的位选还没有清除,虽然单片机反应很快,但延时的减少使其在高速下变得非常明显。
    针对以上问题,本人编写了一个程序,既能保证数码管显示流畅,又解决了所有重影问题:

#include"reg51.h"    //头文件

#define uchar unsigned char    //宏定义
#define uint unsigned int

sbit duan=P2^0;    //段选端
sbit wei=P2^1;    //位选端

void delay(uint);    //延时函数声明

uchar code numbers[]=    //数码数组
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};

void main()
{
    while(1)
    {
        P1=numbers[1];
        duan=1;        //数据入锁存
        duan=0;
        P1=0xfe;
        wei=1;
        wei=0;
        delay(10);

        P1=0xff;    //11111111
        wei=1;
        wei=0;
        P1=numbers[2];
        duan=1;
        duan=0;
        P1=0xfd;
        wei=1;
        wei=0;
        delay(10);

        P1=0xff;
        wei=1;
        wei=0;
        P1=numbers[3];
        duan=1;
        duan=0;
        P1=0xfb;
        wei=1;
        wei=0;
        delay(10);

        P1=0xff;
        wei=1;
        wei=0;
        P1=numbers[4];
        duan=1;
        duan=0;
        P1=0xf7;
        wei=1;
        wei=0;
        delay(10);

        P1=0xff;
        wei=1;
        wei=0;
        P1=numbers[5];
        duan=1;
        duan=0;
        P1=0xef;
        wei=1;
        wei=0;
        delay(10);

        P1=0xff;
        wei=1;
        wei=0;
        P1=numbers[6];
        duan=1;
        duan=0;
        P1=0xdf;
        wei=1;
        wei=0;
        delay(10);

        P1=0xff;
        wei=1;
        wei=0;
        P1=numbers[7];
        duan=1;
        duan=0;
        P1=0xbf;
        wei=1;
        wei=0;
        delay(10);

        P1=0xff;
        wei=1;
        wei=0;
        P1=numbers[8];
        duan=1;
        duan=0;
        P1=0x7f;
        wei=1;
        wei=0;
        delay(10);
    }
}

void delay(uint a)
{
    uchar b;
    uint c;
    for(c=a;c>0;c--)
        for(b=10;b>0;b--);    //数值越小,亮度越低。
}
  
[size=4][color=#FF9900]原理就不说了,大家都看得懂吧。有一点需要注意:延时并非越短越好,因为单片机每次关闭输出需要一定时间,延时太短会降低占空比,导致亮度减弱。
对比如图:
[/size] IMG_0061.jpg
   总之,大家在学习时不要迷信权威,要勤动脑,这样才能把别人的知识变成自己的。
+100  科创币    ehco    2011/12/25 动态scan中,必须有消隐,尤其在LED点阵应用上。
+100  科创币    1989sean    2011/12/25
+100  科创币    delete    2011/12/25 支持下,做过LED阵列屏的深有体会......
+1  学术分    虎哥    2011/12/25 大神辛苦了。
来自:电子信息 / 电子技术
10
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
科学人 作者
12年6个月前 IP:未同步
347755
回 2楼(jrcsh) 的帖子
谢谢!我的方法还是以牺牲亮度和资源为代价的。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
科学人
学者 笔友
文章
178
回复
1739
学术分
1
2011/07/24注册,6年4个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}