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