03-数码管显示

发布时间 2023-12-07 20:36:49作者: 逸聆君

03-数码管显示

简介

数码管

  1. led数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件

    image-20231207145043836

  2. 数码管分为两种

    • 共阴极(下图上面一个电路图所示),共阴极情况下com端(也叫位选端)接低电平,段选段接高电平才会使二极管发光

    • 共阳极(下图下面一个电路图所示),共阳极情况下com端(也叫位选端)接高电平,段选段接低电平才会使二极管发光

      image-20231207145951640

  3. 四位一体的数码管原理图

    • 同一时刻,不可能显示多个不同数字,只能显示相同数字(因为段选端是合并的)
    • 数码管动态显示是利用人眼视觉暂留和数码管显示的余晖原理实现的

    image-20231207150758396

138译码器

74HC138,译码器的输出端连接着数码管的com端。该译码器可以使用3个端口控制8个端口的状态。

  • A,B,C是其输入端(C是最高位,A是最低位)
  • Y0~Y7是输出端
  • G1/G2A/G2B是使能端(相当于译码器的开关,G1接高电平,G2A/G2B接低电平才能使该译码器正常工作)
  • VCC电源正极(高电平),GND电源负极(低电平)

image-20231207152611534

245双向数据缓冲器

74HC245,双向数据缓冲器。作用是提高电平驱动能力。将输入的电平作为一种控制信号(控制信号可以很微弱),而新电平的驱动能力从VCC端获取。

使用该器件是因为单片机的高电平驱动能力有限,其输出的最大电流不能太大。低电平驱动能力强一些。而我们实验板上使用的是高电平驱动点亮数码管,如果不加双向数据缓冲器,电流会很小,导致灯发光比较暗。

  • A端和B端是对应相连的,如A0B0
  • DIR是方向控制端(接高电平,数据从A -> B;接低电平,数据从B -> A
  • OE是使能端(相当于双向数据缓冲器的开关,接低电平,才能使该器件正常工作)
  • VCC电源正极(高电平),GND电源负极(低电平)

image-20231207160134220

消影

数码管显示原理:先通过位选确定显示的位置,然后再通过段选确定显示的数字。但是由于单片机运行速度很快,当显示下一个数字时,位选变了,但是段选此时还没改变,就会发生数字串位。

image-20231207201555248

为了防止串位,我们可以在执行显示下一位数字时先将数码管段选清零

数码管驱动方式

  • 单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间(如:74HC595数码管
  • 专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么(如:TM1640

一、静态数据管显示

#include <REGX52.H>

void Nixie(unsigned char uchLocation, unsigned char uchNum)
{
    unsigned char aryNixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
    
    switch(uchLocation)
    {
        case 1:P2_2=0;P2_3=0;P2_4=0;break;
        case 2:P2_2=1;P2_3=0;P2_4=0;break;
        case 3:P2_2=0;P2_3=1;P2_4=0;break;
        case 4:P2_2=1;P2_3=1;P2_4=0;break;
        case 5:P2_2=0;P2_3=0;P2_4=1;break;
        case 6:P2_2=1;P2_3=0;P2_4=1;break;
        case 7:P2_2=0;P2_3=1;P2_4=1;break;
        case 8:P2_2=1;P2_3=1;P2_4=1;break;
    }
    
    P0 = aryNixieTable[uchNum];
}

void main()
{    
    while(1)
    {
        Nixie(2, 4);   
    }
}

二、动态数据管显示

#include <REGX52.H>

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;

    while(xms)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
        xms--;
    }
}

void Nixie(unsigned char uchLocation, unsigned char uchNum)
{
    unsigned char aryNixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
    
    switch(uchLocation)
    {
        case 1:P2_2=0;P2_3=0;P2_4=0;break;
        case 2:P2_2=1;P2_3=0;P2_4=0;break;
        case 3:P2_2=0;P2_3=1;P2_4=0;break;
        case 4:P2_2=1;P2_3=1;P2_4=0;break;
        case 5:P2_2=0;P2_3=0;P2_4=1;break;
        case 6:P2_2=1;P2_3=0;P2_4=1;break;
        case 7:P2_2=0;P2_3=1;P2_4=1;break;
        case 8:P2_2=1;P2_3=1;P2_4=1;break;
    }
    
    P0 = aryNixieTable[uchNum];
    
    Delay(1);
    P0 = 0;
}

void main()
{    
    while(1)
    {
        Nixie(1, 1);   
        Nixie(2, 2);   
        Nixie(3, 3);   
        Nixie(4, 4);    
        Nixie(5, 5);       
        Nixie(6, 6);       
        Nixie(7, 7);          
        Nixie(8, 8);   
    }
}