蓝桥杯-共阳数码管的静/动态显示

任务:八个数码管分别单独显示0~9的值,然后所有数码管一起显示0~F的值,反复执行。

效果如下:(不能上传视频大概就是这个效果然后循环显示)

原理图:

数码管:

按发光二极管单元连接方式可分为共阳极数码管 共阴极数码管 。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

1️⃣位选:简单来说就是选择8个数码管中的哪一个来显示数字。当对应的com口输出高电平时就选中了这个数码管来显示。

2️⃣段选:在图中可以看到每一个数码管实际上是由八个小的发光二极管组成,当不同的二极管亮起时数码管就可以显示不同的数字或者字母。而段选的意思就是选择哪几个发光二极管亮哪几个熄灭,从而控制数码管显示不同的数字。

其中由于数码管有共阴共阳之分,想要控制二极管的亮灭需要注意相应引脚电平的输入。

图中可以看出,共阴数码管的阴极连到一起,当相应的引脚输出高电平时二极管亮起,同理,共阳极数码管则需要相应引脚输出低电平二极管才能亮。

3️⃣段码:上面说了如何使数码管显示数字,但是如果逐个二极管去推它的状态的话未免也太麻烦了,所以就有了段码,方便我们编程时直接使用。

说了这么多那么怎么来实现这个任务呢:

第一步,通过三八译码器选择Y6,Y7来控制数码管的段选和位选。

第二步,将提前准备好的段码写入打开的数码管中。

.........

具体看代码部分。

代码实现:

#include"reg51.h"


sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;

unsigned char duanxuan[16] = 
{
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e
};

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

void ChooseHC138(unsigned int n)
{
    switch(n)
    {
        case 4:
        HC138_C = 1;
        HC138_B = 0;
        HC138_A = 0;//使Y4输出高电平
        break;
        case 5:
        HC138_C = 1;
        HC138_B = 0;
        HC138_A = 1;//使Y5输出高电平
        break;
        case 6:
        HC138_C = 1;
        HC138_B = 1;
        HC138_A = 0;//使Y6输出高电平
        break;
        case 7:
        HC138_C = 1;
        HC138_B = 1;
        HC138_A = 1;//使Y7输出高电平
        break;
    }
}

void showSEG(unsigned char all,unsigned int num)
{
    ChooseHC138(6);//位选
    P0 = 0x01 << all;
    ChooseHC138(7);//段选
    P0 = num;
}

void displaySEG()
{
    unsigned int i,j;
    for(i = 0; i < 8; i++)
    {
        for(j = 0; j < 10; j++)
        {
            showSEG(i,duanxuan[j]);
            Delay(60000);
            Delay(60000);
        }
    }
    for(j = 0; j < 16; j++)
    {
        ChooseHC138(6);//位选
        P0 = 0xff;
        ChooseHC138(7);//段选
        P0 = duanxuan[j];
        Delay(60000);
        Delay(60000);
    }
}

int main()
{
    while(1)
    {
        displaySEG();
    }
}

好了,以上就是代码实现部分,虽然没用什么高级的东西,但看起来还是比较容易理解的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值