为什么HC6800-MS开发板是共阴级数码管,但是我这个把P0口赋为高电平,反而可以显示?
#include <reg51.h>
#define DIG P0
sbit LSA=P1^0;
sbit LSB=P1^1;
sbit LSC=P1^2;
sbit LSD=P1^3;
unsigned char code NUM[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main()
{
LSA=0;
LSB=1;
LSC=1;
LSD=1;
DIG=NUM[0];
}
主函数里改这样:
void main()
{
while (1)
{
LSA = 0;
LSB = 1;
LSC = 1;
LSD = 1;
DIG = NUM[0];
}
}
多位数码管依然可以静态显示,但是显示时要么只显示一位数码管,要么多位同时显示相同内容。从上面图中得知,“位选(6/8/9/12)”是可独立控制的,而“段选(a-dp)”是连接在一起的,可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,送入所有数码管的段选信号都是相同的,所以它们显示的数字必定一样,数码管的这种显示方法叫做静态显示。
而动态显示,就是利用减少段选线,分开位选线,利用位选线不同时的通和断,改变段选数据来实现的。例如,在第一次位选中第一位数码管时,给段选数据 0, 下一次位选中第二位数码管时显示 1。为了在显示 1 的时候,0 不会消失(当然,实际上是消失了,因为此时第一位数码管的位选为1,即阴极为1),必须在人肉眼观察不到的时间里再次点亮第一次点亮的 0。 人的肉眼正常情况下只能分辨变化超过 24ms 间隔的运动, 也就是说,下一次点亮 0 这个数字的时间差不得大于 24ms。这时就会发现, 数码管点亮是在向右或者向左一位一位点亮,形成了动态效果。如果把间隔时间改长就能直接展现这一现象。
要使单片机能控制开发板上 2个四位一体的共阴数码管显示,仅靠单片机 IO 口来驱动是不行的,这时就需要增加外部驱动芯片。2 个 4 位一体的共阴数码管的位选线有 8 根, 直接让单片机 IO 口控制是没有任何问题的,但考虑到 51 单片机 IO 口资源的限制,通常会使用一种 IO 扩展芯片,比如 74HC138、74HC164、74HC595 芯片等,只需要很少的单片机 IO 口就可以扩展出 8 个控制口,通过级联方式甚至可扩展出更多的控制口(LED 点阵实验中会有详细介绍)。本文使用的开发板上是 74HC138 译码器芯片,只需单片机 3 个 IO 口就可以实现 8 个位选管脚的控制,节省了芯片的 IO 资源。