开发板数码管模块电路图如下:

51单片机实验5:动态数码管_#define

由于74ls138译码器的特点,即只能是一个数码管的阴极电平为0,显然不能使多个数码管同时工作,若想要得到多个数码管同时工作的效果,只能采用动态扫描显示的方式。所谓动态扫描显示,就是利用发光管的余辉和人眼视觉暂留作用,使人感觉好像多个数码管在同时工作。

程序中digdisplay函数利用for循环和switch语句,不断扫描8个数码管,完成位选工作,并对P0口赋值实现段选功能。从而在8个数码管依次输出1~8,并利用延时函数控制输出间隔时间,实现动态输出的功能。

细节:(1)在每位数码管显示之后设置一定时间的延时。

           (2)P0口置0(P0=0x00),完成“消影”目的。

#include<reg52.h>
#define uc unsigned
sbit lsc=P2^2;
sbit lsb=P2^3;
sbit lsa=P2^4;
void delay(uc n)
{
uc i,j;
for(i=1;i<=n;i++)
for(j=110;j>=1;j--);
}
uc code x[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void digdisplay()
{
uc i;
for(i=1;i<=8;i++)
{
switch(i)
{
case (1): lsa=0,lsb=0;lsc=0;break;
case (2): lsa=0,lsb=0;lsc=1;break;
case (3): lsa=0,lsb=1;lsc=0;break;
case (4): lsa=0,lsb=1;lsc=1;break;
case (5): lsa=1,lsb=0;lsc=0;break;
case (6): lsa=1,lsb=0;lsc=1;break;
case (7): lsa=1,lsb=1;lsc=0;break;
case (8): lsa=1,lsb=1;lsc=1;break;
}
P0=x[i];
delay(1);
P0=0x00;
}
}
void main()
{

while(1)
{
digdisplay();
}
}

进阶:利用数码管间隔输出不同的数字组合。

#include<reg52.h>
#define uc unsigned char
sbit lsa=P2^2;
sbit lsb=P2^3;
sbit lsc=P2^4;
uc code x[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay1(uc n)
{
uc i,j;
for(i=1;i<=n;i++)
for(j=1;j<=110;j++);
}
void digdisplay(int n)
{
uc i;
if(n==1)
{
for(i=0;i<3;i++)
{
switch(i)
{
case(0): lsc=0;lsb=0;lsa=0; P0=x[0];break;
case(1): lsc=0;lsb=0;lsa=1; P0=x[2];break;
case(2): lsc=0;lsb=1;lsa=0; P0=x[5];break;
}
delay1(1);
}
}
else
{
for(i=0;i<4;i++)
{
switch(i)
{
case(0): lsc=0;lsb=0;lsa=0; P0=x[4];break;
case(1): lsc=0;lsb=0;lsa=1; P0=x[1];break;
case(2): lsc=0;lsb=1;lsa=0; P0=x[3];break;
case(3): lsc=0;lsb=1;lsa=1; P0=x[1];break;
}
delay1(1);
}
}
}
void delay2(uc n)
{
uc i,j;
for(i=1;i<=10;i++)
for(j=1;j<=110;j++)
digdisplay(n);
}
void main()
{
while(1)
{
delay2(1);
delay2(0);
}
}