数码管介绍

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

数码管引脚定义

一个数码管

四位一体数码管:

138译码器

作用:使用3个io口控制8个输出端。

C是高位B是中间A是低位

数码管原理图

com公共端:

  • 共阴极

    • 给阳码:1亮0灭
  • 共阳极

    • 给阴码:1灭0亮

点亮数码管思路:

  1. 控制3个io口使某一个数码管选中。
  2. 给P0口断码数据

C语言知识点

  • 数组:把相同类型的一系列数据统一编制到某一个组别中,可以通过数组名+索引号简单快捷的操作大量数据。

int x[3]; //定义一组变量(3个)
int x[]={1,2,3}; //定义一组变量并初始化

x[0] //引用数组的第0个变量
x[1] //引用数组的第1个变量
x[2] //引用数组的第2个变量
引用x[3]时,数组越界,读出的数值不确定,应避免这种操作

  • 子函数:将完成某一种功能的程序代码单独抽取出来形成一个模块,在其它函数中可随时调用此模块,以达到代码的复用和优化程序结构的目的。

void Function(unsigned char x, y)
{

}

返回值 函数名(形参)
{
函数体
}

静态数码管显示

#include <REGX52.H>

unsigned char Nixietable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数组断码表
void Nixie(unsigned char Location,Number)
{
    switch(Location)
    {
        case 1:P2_4=1;P2_3=1;P2_2=1;break;
        case 2:P2_4=1;P2_3=1;P2_2=0;break;
        case 3:P2_4=1;P2_3=0;P2_2=1;break;
        case 4:P2_4=1;P2_3=0;P2_2=0;break;
        case 5:P2_4=0;P2_3=1;P2_2=1;break;
        case 6:P2_4=0;P2_3=1;P2_2=0;break;
        case 7:P2_4=0;P2_3=0;P2_2=1;break;
        case 8:P2_4=0;P2_3=0;P2_2=0;break;
    }//数码管位置
    P0=Nixietable[Number];//引用断码

}

void main()
{
    Nixie(7,4);//第7个数码管显示4
    while(1)
    {

    }

}

数码管断码表

0 1 2 3 4 5 6 7 8 9

0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,

A B C D E F 空
0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x00,

动态数码管显示

#include <REGX52.H>

unsigned char Nixietable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数组断码表
void Delay(unsigned int xms)        //@11.0592MHz
{
    unsigned char i, j;

    while(xms--)
    {

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

    }


void Nixie(unsigned char Location,Number)
{
    switch(Location)
    {
        case 1:P2_4=1;P2_3=1;P2_2=1;break;
        case 2:P2_4=1;P2_3=1;P2_2=0;break;
        case 3:P2_4=1;P2_3=0;P2_2=1;break;
      case 4:P2_4=1;P2_3=0;P2_2=0;break;
      case 5:P2_4=0;P2_3=1;P2_2=1;break;
        case 6:P2_4=0;P2_3=1;P2_2=0;break;
        case 7:P2_4=0;P2_3=0;P2_2=1;break;
        case 8:P2_4=0;P2_3=0;P2_2=0;break;
    }//数码管位置
    P0=Nixietable[Number];//引用断码
    Delay(1);
    P0=0x00;//清零防止显示数据串位

}

void main()
{

    while(1)
    {
        Nixie(1,1);
        //Delay(20);
        Nixie(2,2);
        //Delay(20);
        Nixie(3,3);
        //Delay(20);

    }

}

重点:

  • 重影和消影问题
  • 因为位选P2口和段选P0口并不是在同一时间赋值导致存在时差,量的累积最后达到质变(看见重影)
    所以需要通过代码 P0=0x00; 将段选清零(无显示)

位选 段选 (清零)位选 段选 (清零)位选 段选

  • 从一次实验结果可以看出实际上只要有代码Delay(1); 延时一毫秒实验就可以成功,亮度也很亮,但实际上这个位选和段选依然存在时差
  • 这个也有量的累积最后达到质变,但是相对于延时显示的1ms来说太短了,人眼无法捕捉
    所以没得重影

数码管驱动方式

参考资料

51单片机入门教程-2020版 程序全程纯手打 从零开始入门\_哔哩哔哩\_bilibili

最后修改:2023 年 10 月 21 日
如果觉得我的文章对你有用,请随意赞赏