【藍橋杯單片機04】數碼管的動態顯示


【藍橋杯單片機04】數碼管的動態顯示

廣東職業技術學院  歐浩源

      在掌握數碼管靜態顯示的基本技術之后,再學習數碼管動態顯示的技能並不會有太大的技術障礙,只要把動態顯示技術的基本原理和程序設計思路弄清楚,就能夠很輕松的實現各種相關的應用了。

1、動態顯示的基本原理與實現思路
      動態顯示實質上就是輪流點亮單個數碼管實現多位數碼管整體顯示的效果。在輪流顯示過程中,每位數碼管點亮時間為1~2ms,由於人的視覺暫留現象及發光二極管的余輝效應,盡管實際上各位數碼管並非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示數據,不會有閃爍感,動態顯示的效果和靜態顯示是一樣的,能夠節省大量的I/O端口,而且功耗更低。
2、單元實訓題目

3、實現源碼參考

#include "reg52.h"  

sbit HC138_A = P2^5;    
sbit HC138_B = P2^6;    
sbit HC138_C = P2^7;    

//共陽4位數碼管的段碼數組
unsigned char code SMG_NoDot[18] = 
    {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};
unsigned char num = 1;
void DisplaySMG_Dynamic();     
         
void Delay(unsigned int time)
{
    while(time--)
    {
        DisplaySMG_Dynamic();
    }
}

void DelaySMG(unsigned int time)
{
    while(time--);
}

void Init74HC138(unsigned char n)
{
    switch(n)
    {
        case 4:
            HC138_A = 0;
            HC138_B = 0;
            HC138_C = 1;
            break;
        case 5:
            HC138_A = 1;
            HC138_B = 0;
            HC138_C = 1;
            break;
        case 6:
            HC138_A = 0;
            HC138_B = 1;
            HC138_C = 1;
            break;
        case 7:
            HC138_A = 1;
            HC138_B = 1;
            HC138_C = 1;
            break;
        case 8:
            HC138_A = 0;
            HC138_B = 0;
            HC138_C = 0;
            break;
    }
}

void DispaySMG_Bit(unsigned char value, unsigned char pos)
{
    Init74HC138(6);
    P0 = (0x01 << pos);
    Init74HC138(7);
    P0 = value;
}

void DisplaySMG_Dynamic()
{
    DispaySMG_Bit(SMG_NoDot[2],0);
    DelaySMG(500);
    DispaySMG_Bit(SMG_NoDot[0],1);
    DelaySMG(500);
    DispaySMG_Bit(SMG_NoDot[1],2);
    DelaySMG(500);
    DispaySMG_Bit(SMG_NoDot[8],3);
    DelaySMG(500);
    DispaySMG_Bit(SMG_NoDot[16],4);
    DelaySMG(500);
    DispaySMG_Bit(SMG_NoDot[16],5);
    DelaySMG(500);
    
    DispaySMG_Bit(SMG_NoDot[num/10],6);
    DelaySMG(500);
    DispaySMG_Bit(SMG_NoDot[num%10],7);
    DelaySMG(500);
}

main()
{
    while(1)
    {
        DisplaySMG_Dynamic();
        num++;
        if(num > 12)
        {
            num = 1;
        }
        Delay(100);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM