其实应该将独立的共阳极数码管和该节放在一起更加便于理解。
其实数码管的原理都是一样的,靠点亮内部的LED来发光。一位数码管的引脚有10个。显示一个8需要7个段,另外还有一个表示小数点的dp点,第3和第8引脚为公共端,连接在一起。四位数码管的引脚有12个,除了8个表示段的引脚外,还有就是4个公共端。LY-51S上采用的就是两个四位的数码管。共阳极的就是将阳极接在一起(Vcc),共阴极的就是将阴极接在一起(GND)。单个共阳和共阴极的原理图如下所示:
在实验板上,段锁存接P2^2,位锁存接P2^3。锁存器的锁存控制端置于高电平时,读进数据,然后置于低电,停止读取。因为数码管的段码和位码均为8位,且共用单片机的P0(有10KΩ的排阻,所以从电流方面考虑,74HC573锁存器应该也起到扩大电流驱动电路的作用,这里知识感觉到应该是这样,具体的也没有查清楚)口,所以,在使用时需分开送数。因为这一性质,所以数码管每次只能点亮一位,要实现多个数码管点亮就要用到动态扫面原理,即让需要被点亮的数码管在人眼所不能分辨的时间内切换点亮,人眼看到的就是同时几个一起被点亮。
因为51单片机I/O默认的均为高电平,所以只要将数码管和I/O口之间连接起来,板子一上电,P2口就默认为高电平1,所以,P2^2和P2^3就都为高电平,即段锁存和位锁存都被打开,考虑到这点,应该在点亮数码管的时候消除重影。有两种方法,一是从段选入手(P0=0),还有就是从位选入手(P0=0XFF),就是要么为打开了不显示任何东西,要么不管段码为何,不选任何位。
数码管这节,有一个别人的显示数码管的子函数(写程序的基本步骤应该是自己先根据题目写出现象,然后再看别人的程序,这样才能提高自己的程序编写能力),在我遇到的有关数码管显示的程序中都能用到,且工作的很完美,其中site开始显示的位(如为1,则表示从第二个数码管开始显示),digit为显示数字的位数(如3,表示要显示一个3位数):
void
display(unsigned char site,unsigned
char digit)
{
unsigned char dex;
for(dex=0;dex
{
LATCH1=1;
//清除数字变化对未点亮数码管产生交替重影
P0=0;
LATCH1=0;
LATCH2=1;
//锁存要显示的位码
P0=WM[dex+site];
LATCH2=0;
LATCH1=1;
//锁存要显示的段码
P0=temp[dex];
LATCH1=0;
delay(1);
//延时一小段时间,太长数字会闪烁,太短会重影(我测试1-3都可以)
}
}
void delay(uint time)
//自定义延时函数,这个可自己调试的写
{
uint
i,j;
for(i=time;i>0;i--)
for(j=110;j>0;j--);
}