【蓝桥杯笔记】数码管的静、动态扫描


数码管

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