数码管的静态显示和动态显示

一、数码管简介

    数码管也称LED数码管,不同行业人士对数码管的称呼不一样,其实都是同样的产品。

    按发光二极管单元连接方式可分为共阳极数码管共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

生活中常见的数码管主要有1位数码管,两位数码管,三位数码管,四位数码管,五位数码管,六位数码管,八位数码管。

 

 静态显示原理:LED显示器工作方式有两种:静态显示方式和动态显示方式。

 二、数码的静态显示

    静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于检测可控制。缺点是硬件电路比较复杂,成本较高。 

 下面是一位数码管静态显示的仿真电路图,由于本次演示的是共阴极数码管,所以数码管右端的公共引脚接地。左端的八个引脚分别对应数码管的A,B,C,D,E,F,G,H。与单片机的P0口相连接。

 

 下面的程序功能实现的是从0开始显示数字,每隔一秒切换一次,循环显示到F。

#include<reg51.h>//包含头文件
unsigned char code tabl[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};//定义数码管显示数字编码数组(这里采用的是共阴极数码管的编码)
void delayms(unsigned int xms){//延时函数
unsigned int i,j;
    for(i=xms;i>0;i--)
        for(j=110;j>0;j--)
            ;
}
void display(){//显示函数
    unsigned char i;
    for(i=0;i<16;i++){
        P0=tabl[i];//送入数码管需要显示的数字进行显示
        delayms(1000);//延时1秒
    }
}
void main(){//主函数

    while(1){//whlie大循环

        display();

    }
}

 仿真运行结果截图:

 

 

二、动态显示方式: 

    将所有的数码管的段选线并接在一起,用一个IO接口控制,公共端并不是直接接地(共阴极)或者电源(共阳极),而是通过相应的IO接口控制。以阴极为例假设4个数码管工作过程为:每个数码管的公共端与一根IO相连,第一步使最右边一个数码管的公共端为0,其余数码管公共端为1,同时在IO上 发送右边第一个数码管的字段码,这时候只有右边的第一个数码管显示,其余不显示;第二部使右边第二个数码管的公共端为0,其余的公共端为1,同时在上发送右边第二个数码管的字段码,这时候,只有右边第二个数码管显示,其余不显示,以此类推,直到最后一个,这样子4个数码管轮流显示相应的信息,一遍显示完毕,隔一段时间,又这样循环显示。从计算机角度,每个数码管隔一段时间才显示一次,但是由于人的视觉暂留效应,只要隔离时间足够短,循环的周期足够长,每秒达到24次以上,看起来数码管就一直稳定显示了,这就是动态显示原理。

 

 下面的程序功能是利用数码管的动态扫描,实现四位数码管显示1234这四个数字

#include<reg51.h>
sbit we1=P2^0;//定义数码管第一位的公共控制端,用来控制数码管的显示和关闭
sbit we2=P2^1;
sbit we3=P2^2;
sbit we4=P2^3;
unsigned char code tabl[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
void delayms(unsigned int xms){
    unsigned int i,j;
    for(i=xms;i>0;i--)
        for(j=110;j>0;j--)
            ;
}
void display(){
    we1=0;//给左边第一个数码管公共端一个低电平,使其进行显示
    P0=tabl[1];//送入数字1到数码管中
    delayms(5);//延时5ms 
    we1=1;//给第一个数码管的公共端一个高电平,使其关闭显示
    P0=0xff;//消影处理,(这里非常重要,如果不进行消影,会使下一个数码管显示不正确,出现乱码的情况)

    we2=0;//这里是进行第二个数码管显示,原理和第一个显示原理一样
    P0=tabl[2];
    delayms(5);
    we2=1;
    P0=0xff;

    we3=0;
    P0=tabl[3];
    delayms(5);
    we3=1;
    P0=0xff;

    we4=0;
    P0=tabl[4];
    delayms(5);
    we4=1;
    P0=0xff;

}
void main(){

    while(1){

        display();

    }
}

动态扫描显示仿真结果截图

 


版权声明:本文为weixin_46064201原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。