一、数码管简介
1. 数码管
数码管由七个LED(发光二极管)组成,可以显示0到9的数字以及一些字母和符号。每个数码管的七个LED分别代表不同的段,包括A、B、C、D、E、F和G段。通过控制每个段的亮灭状态,可以显示不同的字符。根据公共极所接的电平不同,可分为“共阴极数码管”和“共阳极数码管”。(由八个LED构成的数码管称为八段数码管,此处以七段数码管为例进行介绍。)
2. 四位一体的数码管(多位数码管)
四位一体的数码管由四个七段数码管组成。每个七段数码管由七个LED组成,四位一体的数码管可以同时显示四个字符,通常用于计时器、计数器、温度显示器等应用中。根据公共端不同,可分为“共阴极数码管”和“共阳极数码管”。
3. 静态数码管与动态数码管(显示数字的原理不同)
①静态数码管:
静态数码管是一种通过直接控制每个数字管的亮灭状态来实现多位数码管显示的方法。它也由多个共阳或共阴的LED数字管组成,但是每个数字管的亮灭状态是固定的,不需要进行快速切换。通过控制每个数字管的电平状态,就能够实现多位数码管的显示效果。
静态数码管的优点是控制简单,不需要高频率的刷新和精确的时间控制。但是,由于需要较多的引脚来控制多位数码管的显示,所以在硬件资源方面需要更多的开销。
②动态数码管:
动态数码管是一种通过快速切换数字显示的方式来实现多位数码管显示的方法。它由多个共阳(共阳极)或共阴(共阴极)的LED数字管组成。在动态数码管中,每个数字管的显示时间非常短暂,通过快速切换不同的数字管,就能够实现多位数码管的显示效果。这种切换速度非常快,人眼无法察觉到数字的变化,从而形成了连续的数字显示效果。
动态数码管的优点是可以通过较少的引脚来控制多位数码管的显示,节省了硬件资源。但是,由于需要不断地刷新显示,所以对控制器的要求较高,需要较高的刷新频率和精确的时间控制。
二、动态数码管的扫描原理:
动态数码管的扫描原理可以从“位选”和“段选”两方面来解释。“位选”和“段选”是实现动态数码管扫描的两个重要概念。
1. 位选:
位选可以通过“译码器”或“多路复用器(MUX)”来实现:
① 译码器(Decoder):译码器也可以用来实现位选。译码器可以将输入的二进制编码转换为对应的位选信号。例如,对于一个4位数码管,可以使用一个2进制-4线译码器,将一个2位的二进制选择信号转换为4个位选信号。译码器将每个输入编码映射到适当的输出,以选择相应的位。
- 确定需要选择位数的二进制编码输入信号。例如,对于4位数码管,需要使用2位的选择信号。可以使用2进制计数器或其他控制信号来产生这些二进制信号。
- 将二进制的位选信号连接到2进制-4线译码器的输入端。译码器的输入端通常标记为A和B。将每个位选信号连接到对应的输入线上。
- 译码器将输入信号的二进制编码转换为相应的位选信号,并通过开关切换将位选信号发送到相应的位。例如,当输入为00时,译码器的输出线会选择第一个位。当输入为01时,选择第二个位,依此类推。
② 多路复用器(MUX):多路复用器基于控制信号选择其中一个输入并将其作为输出。对于多位数码管,可以使用一个4位2选1的MUX来实现位选。MUX的4个输入对应4个位,而选择信号可以是一个二进制计数器或其他控制信号。MUX根据选择信号的变化,选择相应的位选信号发送给段选。
- 位选是指选择要操作的数码管的位,也称为行选。在多位数码管中,每个数字对应一个位,每个位上有多个段。例如,一个4位的动态数码管有4个位,每个位上有七段码。
- 为了扫描多个位,位选使用多路复用器(MUX)进行控制。MUX根据位选信号,选择要操作的位,并将相应的位选信号发送给段选。
- MUX根据控制信号,通过切换开关,使得位选信号依次选择每个位。每个位选信号在一个显示周期内只保持一段很短的时间,然后迅速切换到下一个位上。
2. 段选:
- 段选是指选择要显示的数字的各个段,也称为列选。每个段对应数字显示的一个部分。例如,一个共阳数码管的七个段分别是A,B,C,D,E,F和G。
- 段选使用时钟信号进行控制,该信号的频率决定了显示的刷新速率。时钟信号通过片上集成电路的开关,依次将高电平信号发送到对应的段。
- 当某一段接收到高电平信号时,液晶、LED等发光材料在相应的段上发光,显示出对应的数字。
通过位选和段选的配合,实现了动态数码管的扫描显示。在每个显示周期内,位选依次选择每一个位,然后通过段选控制信号实现对选定位上每个段的控制。这种切换速度非常快,超过了人眼的分辨能力,从而使得多个位和多个段的数字看起来同时发光。
三、动态数码管的消影
需要注意的是,位选和段选的切换速度和同步是关键因素。切换速度过慢会导致数字闪烁或模糊,而同步不准确会导致扫描不全或错位显示。
同步:位选1-段选1、位选2-段选2、位选3-段选3。。。
不同步:位选1-段选1、段选1-位选2、位选2-段选2、段选2-位选3、位选3-段选3。。。
动态数码管的消影就是为了解决数码管显示过程中可能出现的残影问题(数码管位选、段选扫描不同步造成的)。当切换一个数码管的数字时,由于刷新频率有限,数码管的液晶分子需要一定的时间来重新排列,这可能会导致前一个数码管数字的残影留在屏幕上。消影的作用是在切换每个数码管之前,通过使数码管显示所有段选线都为高电平或低电平(由数码管的驱动方式决定—共阳极/共阴极),使得数码管的液晶分子重新排列,以消除残影,从而得到清晰的显示。
#include <REGX52.H> //动态数码管的显示
void Delay1ms(unsigned int xms) //@12.000MHz 单位毫秒的延时函数
{
unsigned char i, j;
while(xms)
{ //_nop_();
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
unsigned char Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段码表
//Location决定那个数码管显示数字-位选 Number决定显示什么数字-段选
void INPUT(unsigned char Location,Number)
{
switch(Location)
{ //寄存器P1对数码管进行位选 我单片机上的位选模块是74HC138(3-8译码器)
case 1:P1_2=0;P1_1=0;P1_0=0;break;
case 2:P1_2=0;P1_1=0;P1_0=1;break;
case 3:P1_2=0;P1_1=1;P1_0=0;break;
case 4:P1_2=0;P1_1=1;P1_0=1;break;
case 5:P1_2=1;P1_1=0;P1_0=0;break;
case 6:P1_2=1;P1_1=0;P1_0=1;break;
case 7:P1_2=1;P1_1=1;P1_0=0;break;
case 8:P1_2=1;P1_1=1;P1_0=1;break;
}
P0=Table[Number]; //寄存器P0对数码管进行段选
Delay1ms(2); //防止段码清零过快导致显示的数字亮度较低
P0=0x00; //消影 段码清零
//我所用单片机上为共阴极数码管,进行“消影”时,在刷新周期内将所有数码管引脚置低电平
}
void main()
{
while(1)
{
INPUT(1,4); //第一个数码管显示数字4
INPUT(2,5); //第二个数码管显示数字5
INPUT(3,6); //第三个数码管显示数字6
}
}
①那么可能有人就要问了:“上述代码实现动态数码管的消影时,只使用延迟的方式也可以有效地减少或隐藏段码切换的瞬间亮灭,从而实现较为平滑的显示效果,那为什么还要进行段码清零呢?”
答:其实仔细观察就会发现,仅使用延迟的方式虽然能实现效果,但不该亮的断码管还是会有微弱的亮光的。但是由于期间只延迟了一段非常短的时间,超过了人眼的分辨能力,从而使得多个位和多个段的数字看起来同时发光,但并没有真正实现“消影”的效果。
②那么可能还有人要问:“上述代码实现动态数码管的消影时,只使用段码清零可不可以实现效果?”
答:当只使用段码清零时,会出现显示的数字亮度特别弱的情况,这还是由于代码执行过快导致的。
结论:想要实现动态数码管的“消影”,需要使用“延迟+断码清零”的组合。即“延迟+段码清零”或“延迟+段码清零+延迟”
附件: