51单片机学习笔记:数码管的静态扫描(第一次点亮)


在点亮了LED后,我们来到了数码管。

关于数码管,我只会用数码管锁存器点亮数码管,应该还有其他方法,请大神指点。

 

我们来看一看清翔51板的原理图的数码管部分:

我们看到这个数码管由两部分组成,其中锁存器模块又有两个74HC573锁存器。

74HC573锁存器又是干什么的呢?

当LE输入高电平时,D端和Q端是同步的,当LE输入低电平时,Q端的状态会被锁定,那么我们就可以通过这个特性来控制数码管。

通过观察引脚,我们发现编号为U8的锁存器管理的是位选,也就是选择哪个8字形的单位量。(这里解释的不是很专业)

而编号为U9的锁存器管理的是段选,也就是控制最小单位的LED的。

 通过下面的图我们就可以进行段选。

也就是说我们要第一个数码管显示1,就对P0赋值0x06(00000110)。

以此类推。

 

代码如下:

#include<reg51.h>
sbit wela = P2^7;
sbit dula = P2^6;
void main()
{
        wela = 1;
        P0 = 0xFE;
        wela = 0;
        
        dula = 1;
        P0 = 0x06;
        dula = 0;
        while(1);
}

那么代码的第二行和第三行是什么意思呢?

让我们来观察下面的图:

我们可以发现锁存器上的LE分别是由P2.7和P2.6控制的。

下面是从0到9对应的16进制:

0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F

这是段选对应的数组:unsigned int code table[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,0x77,0x7c,0x39,0x5E,0x79,0x71,0x76,0x38,0x37,0x3E,0x40,0x00};

                        0  1  2    3   4  5    6    7  8  9   A     B    C  D   E  F  H       L  n  u  -  熄灭
这是位选对应的数组:unsigned int code duan[10] = {0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

下面是函数:对应的是(段选,位选)

void digitaltube(unsigned int du,unsigned int num)
{
    if(num == 0)
    {
        
        P0 = 0xFF;
        WE = 1;
        P0 = duan[du];
        WE = 0;
        
        DU = 1;
        P0 = table[0];
        DU = 0;
    }
    if(num == 1)
    {
        P0 = 0xFF;
        WE = 1;
        P0 = duan[du];
        WE = 0;
        
        DU = 1;
        P0 = table[1];
        DU = 0;
    }
    if(num == 2)
    {
        P0 = 0xFF;
        WE = 1;
        P0 = duan[du];
        WE = 0;
        
        DU = 1;
        P0 = table[2];
        DU = 0;
    }
    if(num == 3)
    {
        P0 = 0xFF;
        WE = 1;
        P0 = duan[du];
        WE = 0;
        
        DU = 1;
        P0 = table[3];
        DU = 0;
    }
    if(num == 4)
    {
        P0 = 0xFF;
        WE = 1;
        P0 = duan[du];
        WE = 0;
        
        DU = 1;
        P0 = table[4];
        DU = 0;
    }
    if(num == 5)
    {
        P0 = 0xFF;
        WE = 1;
        P0 = duan[du];
        WE = 0;
        
        DU = 1;
        P0 = table[5];
        DU = 0;
    }
    if(num ==6)
    {
        P0 = 0xFF;
        WE = 1;
        P0 = duan[du];
        WE = 0;
        
        DU = 1;
        P0 = table[6];
        DU = 0;
    }
    if(num == 7)
    {
        P0 = 0xFF;
        WE = 1;
        P0 = duan[du];
        WE = 0;
        
        DU = 1;
        P0 = table[7];
        DU = 0;
    }
    if(num == 8)
    {
        P0 = 0xFF;
        WE = 1;
        P0 = duan[du];
        WE = 0;
        
        DU = 1;
        P0 = table[8];
        DU = 0;
    }
    if(num == 9)
    {
        P0 = 0xFF;
        WE = 1;
        P0 = duan[du];
        WE = 0;
        
        DU = 1;
        P0 = table[9];
        DU = 0;
    }
}    

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM