51单片机——数码管的显示(静态和动态)

 一.硬件知识。

首先,我们要理解数码管亮灭的原理。如图所示:

如图,a——g和.DP为一个数码管”8“的一部分。数码管分为共阴极(上)和共阳极接法(下),无论是哪种接法,要让二极管导通,即某一段led亮,都要使阴极为0,阳极为一。

下面以共阴极接法为例,原理图如下:

74HC138译码器控制哪个数码管亮(C为最高位),译码的结果直接是低电平0。

74HC245则控制某一数码管哪段亮

二.代码实现解析

1.静态数码管的显示

1.简单使某个数码管亮。

#include <REGX52.H>
void main()
{
    P2_2=1;
    P2_3=1;
    P2_4=0;//使CAB=011,即Y3’=LED4=0,使LED4亮
    P0=0x4F;//使LED4显示3,P2=01001111。
    while(1)
    {
    }
}
结果:

LED灯也会亮是因为P2口也是接LED的模块的,无关紧要。

2.小练习:用独立按键控制LED7,按下K1时,LED4显示3,松开K1时,LED4显示8。

代码实现:

#include <REGX52.H>
void main()
{
    while(1)
    {
        if(P3_1==0)
        {P2_2=1;
        P2_3=1;
        P2_4=0;
        P0=0x4F;
        }
    else
    {
    P2_2=1;
    P2_3=1;
    P2_4=0;
    P0=0xFF;
    }
    }
}

结果展示:

松开K1时:

按下 K1时:

2.动态数码管的显示

让每一个数码管依次亮

#include <REGX52.H>
void Delay(unsigned char xms)    //@12.000MHz
{
    unsigned char data i, j;
while(xms--)
{i = 2;
    j = 239;
    do
    {
        while (--j);
    } while (--i);
}
}
//自定义延时函数

unsigned char arr[8]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07};//用数组存下数码管显示0-7的八种情况
void sel(unsigned char Location,number)
{
    switch(Location)
    {
        case 1:P2_4=0,P2_3=0,P2_2=0;break;
        case 2:P2_4=0,P2_3=0,P2_2=1;break;
        case 3:P2_4=0,P2_3=1,P2_2=0;break;
        case 4:P2_4=0,P2_3=1,P2_2=1;break;
        case 5:P2_4=1,P2_3=0,P2_2=0;break;
        case 6:P2_4=1,P2_3=0,P2_2=1;break;
        case 7:P2_4=1,P2_3=1,P2_2=0;break;
        case 8:P2_4=1,P2_3=1,P2_2=1;break;
    }
    P0=arr[number];
}
//定义一个函数,用于控制哪个灯亮(输入Location),和显示的数字(输入number)
void main()
{
    while(1)
    {   sel(1,0);
        Delay(200);
        sel(2,1);
        Delay(200);
        sel(3,2);
        Delay(200);
        sel(4,3);
        Delay(200);
        sel(5,4);
        Delay(200);
        sel(6,5);
        Delay(200);
        sel(7,6);
        Delay(200);
        sel(8,7);
        Delay(200);
//让数码管从LED1到LED8依次亮且从0到7
     
    
    }
}

拓展:使数码管亮灭的时间间隔很短,人的眼睛就会看不出数码管会灭,即人眼看到的是常亮的数码管

修改上述代码

sel(1,0);
        Delay(1);
        sel(2,1);
        Delay(1);
        sel(3,2);
        Delay(1);
        sel(4,3);
        Delay(1);
        sel(5,4);
        Delay(1);
        sel(6,5);
        Delay(1;
        sel(7,6);
        Delay(1);
        sel(8,7);
        Delay(1);

结果如图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值