【藍橋杯筆記】數碼管的靜、動態掃描


數碼管

1、數碼管可以分為共陰極數碼管和共陽極數碼管

兩者區別為:共陰極數碼管,每個數碼管的陰極接到一起(共地),給某個LED燈信號為低電平0時,LED燈點亮。

      共陽極數碼管,每個數碼管的陽極接到一起,給某個LED燈信號為低電平0時,LED燈點亮。

本原理圖使用為共陽極數碼管。

2、段選和位選

(1)段選

  沒一位數碼管可有8個發光二極管組成,其中編號如下:

                               

 

  其中,a~g的7個發光二極管經過組合可以組成不同的數字,常用數字為0~9。而dp端可表示小數點。

  注:(十六進制,' - ',' .')  

    共陽極數碼管編碼表:unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};

    共陰極數碼管編碼表:unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80};

(2)位選

  如果說每一位數碼管經過段選,可以組成任一數字,那么如果要組成多位數字就需要進行位選操作。

  

  以上述為例,com1、com2、com3、com4分別為第一組4位數碼管的位選,當com1=1時,則最左邊的數碼管進行顯示,即位選高電平1有效。

 

原理圖

(位選鎖存器)

(段選鎖存器)

由原理圖可知,令Y6=0時,可操作P0組IO口對數碼管進行位選;令Y7=0時,可操作P0組IO口對數碼管進行段選(內容)。


 靜態數碼管顯示

靜態數碼管配置較為簡單。使用時,將段選與位選進行設置后,鎖存器會對數據進行鎖存。

有如下例子:

void showSMG(uchar dat,uchar pos)
{
    HC138(6);            //數碼管位選
    P0=0x01 << pos;    //位選左移,當令第3位數碼管亮時,賦值pos為2(編號從0開始
    HC138(7);            //數碼管段選
    P0=table[dat];
  
}
void main() { HC138(5); P0=0x00; showSMG(4,2);     //在第3位數碼管上靜態顯示4 while(1) { } }

使用時,可根據數碼管顯示位置和內容,更改dat和pos的值。


 動態數碼管顯示

動態數碼管顯示實質上就是輪流點亮單個數碼管,在視覺上實現多個數碼管同時點亮不同數字。

即:在配置時,令每個數碼管點亮時間為1~2ms,只要閃爍的速度足夠快, 就能給人一組穩定的顯示數據感受。

動態顯示作用:節約IO口。若使用靜態顯示4位數碼管,需要段選8*4+4個com端,共計36個;動態顯示,需8個段選+4個com端,共計12個。

配置:

按照正常靜態數碼管顯示配置,但是為使多位數碼管點亮不同數字,需要不斷改變數碼管的顯示

即:將第一位配置為一個數(位選第一位,令第一位顯示這個數),再關閉第一位位選,開啟第二位位選,配置第二位。一直循環重復,即可完成動態數碼管顯示。

注意每個顯示間隔可為1~2ms。

(1)靜態數碼管顯示基礎下,進行for循環

uchar t=0;
uchar show[8]={1,2,3,4,5,6,7,8};//內部元素可以更改更新 void main()
{
    while(1)
    {
        for(t=0;t<8;t++)//使用for循環,將show[]內元素依次顯示到數碼管1~8位上
        {
            ShowSMG(show[t],t);
            Delay2ms();
        }
    }
}

 (2)重復的循環顯示循環顯示

//動態數碼管顯示部分
void Show_calendar()
{
    ShowSMG(year/1000,0);
    Delay2ms();
    ShowSMG(year%1000/100,1);
    Delay2ms();
    ShowSMG(year%100/10,2);
    Delay2ms();
    ShowSMG(year%10,3);
    Delay2ms();
    ShowSMG(mon/10,4);
    Delay2ms();
    ShowSMG(mon%10,5);
    Delay2ms();
    ShowSMG(day/10,6);
    Delay2ms();
    ShowSMG(day%10,7);
    Delay2ms();
}

(3)放置於定時器服務函數下,在定時器內進行數碼管動態顯示

 優點:顯示穩定,主程序內各種代碼都不會影響數碼管顯示

 缺點:耗費定時器資源

void Timer2Init()        //2??@12.000MHz
{
    AUXR |= 0x04;        
    T2L = 0x40;        
    T2H = 0xa2;        
    AUXR |= 0x10;
    
    IE |= 0x40;
    EA = 1;
}
void SMG_Showing()//根據數碼管顯示要求不同,更改對應位的顯示值
{    
    switch(pos_bit)
    {    
        case 1:Display_bit =dat%1000/100;break;
        case 2:Display_bit = dat%100/10;break;
        case 3:Display_bit = dat%10;break;
                
        case 6:Display_bit = dat_AD/10;break;
        case 7:Display_bit = dat_AD%10;break;                                        
        default:Display_bit = 10;break;    
    }    
}
void Sever_Timer2() interrupt 12//數碼管顯示精度要求不高,也可以在里面進行一些簡單的計時
{
    SMG_Showing();        
    SMG_Show_com(pos_bit,Display_bit);    

    if(++pos_bit == 8)
        pos_bit = 0;
}

 

總結:

1、數碼管進行靜態、動態顯示需要控制相應的段選(亮什么)與位選(亮哪位);

2、位選時,需要令138譯碼器Y6=0;

3、段選時,需要令138譯碼器Y7=0;

4、數碼管動態顯示,還需要注意每一位的停留時間,建議為1~2ms;

5、可將數碼管動態顯示放入定時器內,使數碼管穩定顯示,而不會被主程序內的延時函數影響。


免責聲明!

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



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