相比前面我们使用过的单位数码管难点就是要通过片选来输出每一位数码管显示所需要的16进制代码信号。
我们知道,多位数码管(包括两位数码管)显示的原理就是,每位数码管在不同的时间获得端口输出的信号显示出来,利用人的视觉暂留特点,使观看这感觉是同时显示的。
当然,片选后的闪烁问题也是我们需要解决的难点。
效果如下
上图,我们使用了一个共阴的两位数码管,用P2口做片选,P1口输出显示信号。
代码:
#include <reg51.h>
#include <stdio.h>
unsigned char led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(unsigned int time);
void display(unsigned s0,unsigned s1);
sbit LS0=P2^0;
sbit LS1=P2^1;
void main(void)
{
// Write your code here
while (1)
display(6,10);
}
void delay(unsigned int time)
{
unsigned int j=0;
for(;time>0;time--)
for(j=0;j<125;j++);
}
void display(unsigned s0,unsigned s1)
{
unsigned int m,n,dly,i;
for(m=0;m<s0;m++)
for(n=0;n<s1;n++)
for(dly=0;dly<20;dly++) //让基本显示重复执行,以达到延时的效果
for(i=0;i<2;i++) //基本显示,也成为扫描显示(每次每一位都要显示)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LS0=0;LS1=1;
P1=led_mod[m];//发送段码
break;//显示第0位
case(1):
LS0=1;LS1=0;
P1=led_mod[n];//发送段码
break;//显示第1位
}
delay(30); //间隔一段时间扫描
P1=0x00;//消隐
}
}
这个程序所采用的参数是经过测试完全无闪烁的参数组合,需要提醒注意的是,如果delay所设的参数过大(一般不大于40)就会出现闪烁。要想最终显示中的数字视觉上刷新间隔拉长,那就只能通过dly参数增加。否则闪烁就会明显。