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

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

由于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);
	}
}

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值