参考教程:[4-1] 静态数码管显示_哔哩哔哩_bilibili
一、数码管基础知识简介
1、数码管的组成
LED数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件,也就是说,数码管显示数字的原理,只是点亮LED灯原理的plus版而已
2、数码管的分类及显示原理
(1)数码管分为共阳极数码管和共阴极数码管,原理图如下所示。
(2)对于共阴极数码管,如果想让其显示数字,首先要将其公共阴极置为低电平(否则永远不可能产生正向电流),对于各个LED的阳极,需要点亮哪个LED灯,就将哪个LED灯的阳极置为高电平;对于共阳极数码管,如果想让其显示数字,首先要将其公共阳极置为高电平(否则永远不可能产生正向电流),对于各个LED的阴极,需要点亮哪个LED灯,就将哪个LED灯的阴极置为低电平。

3、数码管的驱动方式
(1)单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间。
(2)专用驱动芯片:芯片内部自带显存、扫描电路,单片机只需把显示需求发给驱动芯片,驱动芯片根据单片机需求驱动数码管。
二、开发板原理图中的数码管模块
1、动态数码管模块原理图
(1)开发板采用的是共阴极数码管,一共8个,每4个封装为1组。封装起来的4个数码管,其同样位置的LED阳极接的是同一条线(比如4个数码管的位置a的LED阳极,都连接SMG封装的11号引脚),也就是说,如果同时将4个数码管的公共阴极全部置为低电平,那么4个数码管将会显示同一个数字。
(2)74HC245用于提升高电平驱动的能力,它没有额外的逻辑,Ax端口的信息会原封不动地传到Bx端口。

2、开发板上的138译码器
如下图所示,138译码器左边有ABC三个输入,它们分别代表一位二进制数,译码器获取三位二进制数后,会将该二进制数转化为0~7的十进制数
138译码器根据转化而得的十进制数选择LED1~8其中一个引脚输出低电平(LED1~8就是动态数码管模块中8个数码管的公共阴极),由于对应的数码管公共阴极被置为低电平,该数码管可以显示数字,而其它数码管的公共阴极被置为高电平,不可以显示数字

三、数码管显示实验
1、静态数码管显示一个数字实验
(1)在main.c文件中输入以下代码,然后点击“编译”。
#include <REGX52.H>
unsigned char NixieTube[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00 };
//在全局定义数码管段码表(数组),从左往右依次是0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,无显示
void Nixie(unsigned char Location, Number) //Location是显示数字的数码管编号,Number是需要显示的数字(需要显示a则Number传入10,以此类推)
{
switch (Location)
{
case 1:
P2_4 = 1; P2_3 = 1; P2_2 = 1; break;
//选中LED8,左边第一个数码管显示数字
case 2:
P2_4 = 1; P2_3 = 1; P2_2 = 0; break;
//选中LED7,左边第二个数码管显示数字
case 3:
P2_4 = 1; P2_3 = 0; P2_2 = 1; break;
//选中LED6,左边第三个数码管显示数字
case 4:
P2_4 = 1; P2_3 = 0; P2_2 = 0; break;
//选中LED5,左边第四个数码管显示数字
case 5:
P2_4 = 0; P2_3 = 1; P2_2 = 1; break;
//选中LED4,左边第五个数码管显示数字
case 6:
P2_4 = 0; P2_3 = 1; P2_2 = 0; break;
//选中LED3,左边第六个数码管显示数字
case 7:
P2_4 = 0; P2_3 = 0; P2_2 = 1; break;
//选中LED2,左边第七个数码管显示数字
case 8:
P2_4 = 0; P2_3 = 0; P2_2 = 0; break;
//选中LED1,左边第八个数码管显示数字
}
P0 = NixieTube[Number]; //Number作为数组下标,自动匹配对应的段码
}
void main()
{
/*
P2_4 = 1;
P2_3 = 0;
P2_2 = 0; //这三个变量控制138译码器ABC三个引脚,0b100译码得4,会选中LED5
P0 = 0x7D; //P0寄存器的8位分别控制数码管的8个LED灯,0111 1101对应数字6
*/
Nixie(7, 2); //从左往右的第七个数码管显示数字2
while (1)
{
}
}
(2)将生成的.hex文件下载到开发板中,可以看到从左往右的第七个数码管显示数字2。
2、动态数码管显示“123”实验
(1)根据前面的讲述,看起来不能同时点亮多个数码管,更不能让它们同时显示不同的数字,但实际上并不是这样。共阴极数码管(共阳极数码管同理)被点亮后,即使阳极变为低电平或者公共阴极变为高电平,数码管也不会立刻熄灭,或者说人眼不能马上发现数码管熄灭,会有一个“视觉暂留”的现象,在人眼发现数码管熄灭之前可以先点亮其它数码管,接着再重新点亮熄灭的数码管,这个过程是非常迅速的,这样就可以实现多个数码管同时显示不同数字的效果。


(2)动态数码管显示消影:
①位选负责选择要被点亮的数码管,段选负责决定显示的内容,一个数码管的位选要在段选之前。
②数码管被点亮后不会立刻熄灭,如果在下一个数码管的位选完成后,上一个数码管的段选没有清零,那么上一个数码管的段选会直接被“继承”到下一个数码管,即使下一个数码管有自己的段选,但是数码管被上一个段选点亮后,在肉眼看来,被误点亮的LED不会立刻熄灭,这样一来视觉上看就会显示错误。



③为了解决以上问题,段选完成后,要将段选全部置为0,防止上一个数码管的段选被继承到下一个数码管。
④数码管被点亮后,即使阳极变为低电平,在肉眼看来,数码管也不会立刻熄灭(“视觉暂留”现象),所以P0全部清零不会让数码管立刻熄灭。
(3)在main.c文件中输入以下代码,然后点击“编译”。
#include <REGX52.H>
#include <INTRINS.H> //_nop_()需要这个头文件
void Delay(unsigned int xms)
{
while (xms--)
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
unsigned char NixieTube[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00 };
//在全局定义数码管段码表(数组),从左往右依次是0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,无显示
void Nixie(unsigned char Location, Number) //Location是显示数字的数码管,Number是需要显示的数字(需要显示a则Number传入10,以此类推)
{
switch (Location) //(位选)
{
case 1:
P2_4 = 1; P2_3 = 1; P2_2 = 1; break;
//选中LED8,左边第一个数码管显示数字
case 2:
P2_4 = 1; P2_3 = 1; P2_2 = 0; break;
//选中LED7,左边第二个数码管显示数字
case 3:
P2_4 = 1; P2_3 = 0; P2_2 = 1; break;
//选中LED6,左边第三个数码管显示数字
case 4:
P2_4 = 1; P2_3 = 0; P2_2 = 0; break;
//选中LED5,左边第四个数码管显示数字
case 5:
P2_4 = 0; P2_3 = 1; P2_2 = 1; break;
//选中LED4,左边第五个数码管显示数字
case 6:
P2_4 = 0; P2_3 = 1; P2_2 = 0; break;
//选中LED3,左边第六个数码管显示数字
case 7:
P2_4 = 0; P2_3 = 0; P2_2 = 1; break;
//选中LED2,左边第七个数码管显示数字
case 8:
P2_4 = 0; P2_3 = 0; P2_2 = 0; break;
//选中LED1,左边第八个数码管显示数字
}
P0 = NixieTube[Number]; //Number作为数组下标,自动匹配对应的段码(段选)
Delay(1);
P0 = 0x00; //消影
}
void main()
{
while (1)
{
Nixie(1, 1);
Delay(1);
Nixie(2, 2);
Delay(1);
Nixie(3, 3);
Delay(1);
//正是因为数码管不会立刻熄灭(视觉暂留)这一特性,让不同数码管分时段显示,就能达到看起来数码管同时显示不同数字的效果
}
}
(3)将生成的.hex文件下载到开发板中,可以看到左边开始数的三个数码管显示“123”。


本文详细介绍了LED数码管的工作原理,区分了共阳极和共阴极数码管,展示了静态和动态显示的方法,以及单片机驱动数码管的不同策略,包括直接扫描和专用驱动芯片的应用。
&spm=1001.2101.3001.5002&articleId=134620978&d=1&t=3&u=ed0232a47d2747e59ee54df7fdf77d40)
2万+

被折叠的 条评论
为什么被折叠?



