1. 程式人生 > >C51 動態數碼管 個人筆記

C51 動態數碼管 個人筆記

pla pre switch oid ++ efi 開發 led 數字

8段led管構成一個數字。
開發板上共有8個數字。
每個數字有一個使能端(段選引腳)
每個數字的位選端(選擇8段led管哪些亮,即構成什麽圖案)並聯在一起
輪流點亮不同數字,速度很快,視覺暫留,從而形成8個數字同時亮的效果

#include <reg51.h>
typedef unsigned int u16;        
typedef unsigned char u8;

#define DIG P0
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;


//共陰的表
u8 code ledSegment  [9] = { 0x3f , 0x06,   0x5b,   0x4f,   0x66,   0x6d, 0x7d,   0x07,  0xe6
                            };

void delay(u16 i)
{
    while(i--);
}

void DigDisplay()
{
    u8 i;
    
    for(i=0;i<8;i++)
    {
    //段選,使能8個數碼管中的某一個
    //38譯碼器輸出端和動態數碼管段選端短接
        switch(i)
        {
            case (0):       //段選選中第一個動態數碼管,(共陰,J16^1是公共陰極,輸出低電平)
                LSA = 0;     //J15(38譯碼器輸出)和J16(數碼管輸入)用短接片短接
                LSB = 0;     //故J15^1即38譯碼器輸出端Y0與J16^1相同,為低電平
                LSC = 0;    //因此38譯碼器輸入端為000(由真值表知A0是低位,A2是高位)
                break;
            case (1):   LSC = 0;LSB = 0;LSA = 1;break;
            case (2):   LSC = 0;LSB = 1;LSA = 0;break;
            case (3):   LSC = 0;LSB = 1;LSA = 1;break;
            case (4):   LSC = 1;LSB = 0;LSA = 0;break;
            case (5):   LSC = 1;LSB = 0;LSA = 1;break;
            case (6):   LSC = 1;LSB = 1;LSA = 0;break;
            case (7):   LSC = 1;LSB = 1;LSA = 1;break;
        }
    //--位選,選擇被使能的數碼管中,哪幾段點亮,(顯示什麽數字)
    //P0端口控制動態數碼管的8個位選引腳J12
        DIG = ledSegment[i];  //     共陰,高電平有效
        delay(200); //短暫延時1ms   (去掉或改變時間長度可能會變亮變暗)
        DIG = 0x00;
    }    
}
void main(void)
{  
    while(1)
    {
        DigDisplay();  
    }
}

C51 動態數碼管 個人筆記