单片机学习小组
直播中

王兰

13年用户 850经验值
擅长:基础元器件
私信 关注

如何去实现八位数码管的动态扫描呢

八位数码管的原理是什么?

如何去实现八位数码管的动态扫描呢?


回帖(1)

韩香茹

2022-2-23 09:21:25
八位数码管原理图如下:



通过原理图,我们可以知道,数码管和led灯存在公用的线路。要使led灯能发亮,P2.3引脚就要置“1”,但是P2.3引脚为“1”时,数码管是不能正常显示的,所以要使数码管正常显示,要对P2.3引脚置“0”。

同时P2.0、P2.1和P2.2引脚对数码管显示也很重要(位置选择),三个引脚的状态(0或1)对应的三位二进制数可以表示0~7(分别对应从左到右的数码管) 。

与led灯一样,只要通过对P0口赋不同的值就可以显示不同的字符。

不同的段(A、B、C、D、E、F、G、DP)对应不同的引脚

A:P0^0        B:P0^1        C:P0^2        D:P0^3        E:P0^4        F:P0^5        

G:P0^6        DP:P0^7

置“0”该段不亮,置“1”该段亮。如想要显示一个“1”,需要B段和C段亮,其他段不亮,所以P0口赋值为0x06。


         DP/P0^7    G/P0^6    F/P0^5    E/P0^4    D/P0^3    C/P0^2    B/P0^1    A/P0^0

二进制    0          0         0         0         0         1         1         0

0x                        0  //前四位转换16进                      6  //后四位转换16进制

同理要想显示“7”,P0口就赋值为0x07(0000 0111)。

以下显示代码(效果为从左至右显示0~8)

#include
#define uint unsigned int
#define uchar unsigned char

uint i=0;
uchar duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
uchar weixuan[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};

void Init()
{
    P2M0=0xff;
           P2M1=0x00;
    P0M0=0xff;
    P0M1=0x00;
}

void Delay(int n)
{
        while(n--);
}

void main()
{
    Init();
        while(1)
        {
                for(i=0;i<8;i++)
                {
                        P0=0;
                        P2=weixuan;
                        P0=duanxuan;
                        Delay(600);
                }
        }
}
虽然8个数码管都亮了,但并不是同时亮的,而是快速地选择不同的数码管(位选)点亮熄灭,也就是动态扫描。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分