单片机入门第二篇—静态和动态数码管显示

        下面来介绍一下数码管

下面介绍数码管引脚的定义

      右上角的连接方式是共阴极的方式连接,这种方式我们公共端是要接地的。二极管中有竖线的一端是阴极,另外一段是阳极。这种连接方式在大学课程模拟电路中有讲过,具体的我们就补讨论了。在这种情况下我们想要点亮LED的话就要加高电平(1),熄灭状态的话就是低电频(0)

   LED数码管的标号对应左下角左边的图片,需要记忆。连接方式是就近原则,比如A号LED,连接在上面的7号引脚。D号LED连接在下面的2号引脚。要是我们想要点亮一个数字1,那我们就点亮B、C号LED。那么怎么点亮B C号LED呢,就是加高电平(1),其他的LED我们就加低电平(0)这样我们就可以得到一串数字  0110 0000 这就是点亮BC时的一个🐎,我们称之为段码,这样我们的数码管就可以显示一个数字1了。

若是我们的LED是以右下角的共阳极方式连接,那么所有的点亮方式都是和共阴极的相反。

上面是单位一体的数码管的工作原理,下面介绍多位一体的数码管的工作方式,以四位一体举例。

 四位一体也是分共阴极和共阳极这两种方式连接的。

        共阴极:每一个数码管都是共阴极,公共端都是单独引出来。多位一体的数码管的引脚位选端都是按同号的连接在一起的,比如A号引脚都是和A号引脚连在一起的,依次类推。如果我们现在想要在第三个数码管上显示一个数字1的话,我们首先将第三位的三极管接0(负极),其他的接1(正极),然后将数字一对应的LED点亮,即B、C号LED。B、C号给高电平1,其他位给低电平1。这样就得到一个数据 0110 0000。

        共阳极:与共阴极相反。

上面的是如何驱动数码管的过程,下面我们来学习原理上如何工作的。

四位一体的,共阳极给阴码(1灭0亮),共阴极给阳码(0亮1灭)

我们的大LED都是接在译码器上上面的

我们现在是想要译码器的其中一个输出端输出0,其他的输出1。并且还可以将8个端口变成3个端口控制的,即译码器左边的P22,P23,P24控制,分别对应三个输入端ABC。其中C是高位,B是中位,A是低位。我们给CBA一个数值,假如是000(二进制),这样经过编码,传到输出端的就是Y0,即Y0引脚输出零即低电平,亮起。

双向数据缓冲器:进行数据缓冲的,提高驱动能力。DIR:数据传送的,接高电平———将左边的数据送到右边。接低电平——将右边的数据送到左边。

以上是数码管的工作原理,其实我们大概了解一下就好了,做主要的还是知道怎么操作。

使用方法:1.用选中138译码器选中LED组号

                  2.给P0口一个断码

下面进行实际操作

        首先我们来使第编号位Y7对应LED8显示数字0,dp不亮

#include <REGX52.H>

void main()
{
	P2_4=1;
	P2_3=1;
	P2_2=1;//Y7 7对应的二进制是111,故三个P2口都给1
	P0=0x3F;//数字0对应的LED编号是a,b,c,d,e,f  所以我们给P0口0011 1111(高电平亮起即1)从下往上数
	while(1)
	{
		
	}
}	

这样我们就使得LED8显示0了。

但是当我们想要在其他数码管上面显示起码数字的时候就又要改代码,这样就很麻烦。

所以我们下面就写一个函数来执行这些操作。

#include <REGX52.H>

unsigned char shumaguan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//显示哪一个数字

void shuma(unsigned char Loc,Num)//选中数码管
{
	switch(Loc)
	{
		case 1:P2_4=0;P2_3=0;P2_2=0;break;
		case 2:P2_4=0;P2_3=0;P2_2=1;break;
		case 3:P2_4=0;P2_3=1;P2_2=0;break;
		case 4:P2_4=0;P2_3=1;P2_2=1;break;
		case 5:P2_4=1;P2_3=0;P2_2=0;break;
		case 6:P2_4=1;P2_3=0;P2_2=1;break;
		case 7:P2_4=1;P2_3=1;P2_2=0;break;
		case 8:P2_4=1;P2_3=1;P2_2=1;break;
	}
	
		P0=shumaguan[Num];
}

void main()
{
	shuma(1,0);//调用函数shuma
	while(1)
	{
		
	}
}	

我们调用函数的时候就可以选择让哪一个数码管亮起显示哪一个数字

下面我们来介绍动态数码管

动态数码管我们就是依次选自亮起的数码管就好了

比如我们想在数码管上从左到右依次显示123,那么我们就依次设置数码管的数字,之间穿插一个延时,下面是代码显示

void main()
{
    while(1)
    {
        shuma(8,1);
        Delay(500);
        shuma(7,2);
        Delay(500);
        shuma(6,3);
        Delay(500);
        
    }
}

 这样我们的数码管就是左边三个每隔500ms就显示一个数字,反复循环。

下面是练习:利用数码管依次显示女朋友的生日。没有女朋友的就显示自己的生日。

void main()
{
	int birthday[8]={1,9,9,9,0,9,2,4};//0 1 2 3 4 5 6 7到7一共8个
	int i=8,j;//i控制数码管,j控制显示数字
	while(1)
	{
		for(j=0;j<8;j++)
		{
			shuma(i,birthday[j]);
			Delay(500);
			i--;
			if(i==0)
				i=8;
			if(j==8)
				j=0;
		}
	}
}

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值