51单片机数码管的动态扫描

文章介绍了共阴极数码管动态扫描的电路原理,通过74HC573芯片控制数码管显示。代码示例展示了如何编写控制数码管显示特定数字的程序,以及如何解决因数据切换产生的重影问题,通过加入延时函数消除残影,提高显示质量。
摘要由CSDN通过智能技术生成

此内容适合小白和初学者,数码管为共阴极数码管


46591b02aabe4adca2929d11012665a3.png


上图为数码管动态扫描的电路图,其中两个芯片都是74HC573(后面上面那个简称U2,而下面那个简称U3),U2是输出位码的,也就是控制数码管具体显示0~9的某个数,U3是输出段码的,用于控制具体在第几位显示,在写代码时一般是先写段码,再写位码


两个芯片中C端口为锁存端口(也可称为关卡),其作用为让芯片是否接收J3输入的数据,当C端口为高电平是为接收,低电平是为不接收,也就是C端口输入1时,芯片接收J3输入的数据,反之就不接收。


下面为具体代码

#include<reg52.h>      //头文件一般不用改
#define DataPort P0    //定义输出端口P0的名字,提高程序的可读性
sbit LATCH1=P2^1;      //定义锁存端口    位锁存
sbit LATCH2=P2^2;      //               段锁存
unsigned char wei[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};   //八个共阴极数码管0~9的16进制编码
unsigned char duan[8]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};             //八个编码分别对应八个数码管
void main()
{
    while(1)
    {
        DataPort=duan[0];  //控制P0输出0xF7
        LATCH2=1;          //打开U3的关卡;控制P0的输出数据输入到芯片U3中
        LATCH2=0;          //关闭关卡,断开P0输入的数据

        DataPort=wei[2];   //控制P0输出0x5B,在程序里排第一的序号为0
        LATCH1=1;          //打开U2的关卡;控制P0的输出数据输入到芯片U2中
        LATCH1=0;          //关闭关卡,断开P0输入的数据
    }
}

实验现象为数码管最右边显示2;部分因为线路不一样是最左边

 


 进阶代码:同时显示两个数字

#include<reg52.h>      //头文件一般不用改
#define DataPort P0    //定义输出端口P0的名字,提高程序的可读性
sbit LATCH1=P2^1;      //定义锁存端口    位锁存
sbit LATCH2=P2^2;      //               段锁存
void Despuley(unsigned char y,unsigned char m);    //声明函数
unsigned char wei[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};   //八个共阴极数码管0~9的16进制编码
unsigned char duan[8]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};             //八个编码分别对应八个数码管
void main()
{
    while(1)
    {
        Despulay(0,1);
        Despulay(1,2);
    }
}

void Despuley(unsigned char y,unsigned char m)
{
     DataPort=duan[y];  //控制P0输出0xF7
     LATCH2=1;          //打开U3的关卡;控制P0的输出数据输入到芯片U3中
     LATCH2=0;          //关闭关卡,断开P0输入的数据

     DataPort=wei[m];   //控制P0输出0x5B,在程序里排第一的序号为0
     LATCH1=1;          //打开U2的关卡;控制P0的输出数据输入到芯片U2中
     LATCH1=0;          //关闭关卡,断开P0输入的数据
}

该实验现象会有重影,而且亮度不高,实验现象这里就不展示了

要消除重影就要知道重影是怎么产生的:

        重影产生是因为芯片U2输入了一组数据后,当U3的数据更改时,U2的数据还在持续输出,例如红和蓝两种颜料要从一根管道流出,不能混合在一起,当其中一种颜料流过后在管道里面还会有残留,要把残留的先洗去,再流入另外一种颜料,这里就是要加入程序来洗掉残余的颜料

亮度不高是因为没有加入延时


下面是消除残影和加入延时

#include<reg52.h>      //头文件一般不用改
#define DataPort P0    //定义输出端口P0的名字,提高程序的可读性
sbit LATCH1=P2^1;      //定义锁存端口    位锁存
sbit LATCH2=P2^2;      //               段锁存
void Despuley(unsigned char y,unsigned char m);    //函数声明
void Delay(unsigned int t);                       //函数声明
unsigned char wei[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};   //八个共阴极数码管0~9的16进制编码
unsigned char duan[8]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};             //八个编码分别对应八个数码管
void main()
{
    while(1)
    {
        Despulay(0,1);
        Despulay(1,2);
    }
}

void Despuley(unsigned char y,unsigned char m)
{
    DataPort=duan[y];  //控制P0输出0xF7
    LATCH2=1;          //打开U3的关卡;控制P0的输出数据输入到芯片U3中
    LATCH2=0;          //关闭关卡,断开P0输入的数据

    DataPort=wei[m];   //控制P0输出0x5B,在程序里排第一的序号为0
    LATCH1=1;          //打开U2的关卡;控制P0的输出数据输入到芯片U2中
    LATCH1=0;          //关闭关卡,断开P0输入的数据
    Delay(50);         //用于延时

    DataPort=0x00;     //消除重影
    LATCH1=1;          //
    LATCH1=0;          //
}

void Delay(unsigned int t)
{
    while(t--);
}

好了,这次就讲到这,有什么错误或问题的可以评论或私信我,感谢!!!!

关注我后面会有更加深入的讲解。。。。。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值