数码管

*觉得有用有帮助的评论下,谢谢~

静态数码管

​ 静态数码管实则就与8个LED小灯一样,想要显示什么数值,点亮对应的段即可!

数码管_第1张图片

如图,(a)dp~a对应着从二进制的低位到高位,如若要显示0 ,则对应的管脚电平为0011 1111 (共阴)

​ (b) 则是数码管的两个类型,左侧的为共阴数码管,右侧的为共阳数码管

数码管表

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴

注:共阳的取反一下就好

程序

效果:依次显示0~F

#include 
#define u8  unsigned char

u8 code smg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴

void delay700ms(void);
int i;
void main()
{	
	//P0=~smg[9];  	//只显示一个数字
	//while(1);
	for(i=0;i<17;i++)	//依次显示0~F
	{
	   P0=~smg[i];
	   delay700ms();
	}
}

void delay700ms(void)   //误差 -0.000000000159us
{
    unsigned char a,b,c;
    for(c=173;c>0;c--)
        for(b=162;b>0;b--)
            for(a=10;a>0;a--);
}

动态数码管

​ 动态显示的特点是将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。

数码管_第2张图片

​ 通过控制 J16来控制8个数码管哪个亮哪个灭,在由IO口输给数码管位选,控制显示什么数值。

​ 若要8个数码管同时显示,可依次点亮八个数码管,数码管切换间用少许延时,利用视觉残留,来看起来是同时显示。

​ 用芯片控制COM口的电平,可更为简单的显示动态数码管,而这里就用到74HC138 (38译码器)

数码管_第3张图片

A、B、C 进行输入,控制输出端Y0~Y7 ,看图逻辑运算有点复杂,我们可直接看数据手册里的真值表,而我们的程序也是根据真值表来写的。

数码管_第4张图片

程序

效果:在8个数码管上显示0~7

#include "reg52.h"
#include "intrins.h"
#define  u8 unsigned char

sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

void delay1ms (void);
void Dtsmg()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)	 //位选,选择点亮的数码管,
		{
			case(0):
				LSA=0; LSB=0; LSC=0; break;//显示第0位
			case(1):
				LSA=1; LSB=0; LSC=0; break;//显示第1位
			case(2):
				LSA=0; LSB=1; LSC=0; break;//显示第2位
			case(3):
				LSA=1; LSB=1; LSC=0; break;//显示第3位
			case(4):
				LSA=0; LSB=0; LSC=1; break;//显示第4位
			case(5):
				LSA=1; LSB=0; LSC=1; break;//显示第5位
			case(6):
				LSA=0; LSB=1; LSC=1; break;//显示第6位
			case(7):
				LSA=1; LSB=1; LSC=1; break;//显示第7位	
		}  
		P0=smgduan[i];//给P0段码数据		
		delay1ms();   //延时,视觉残留		
		P0=0x00;			//对P0口清零,全灭消隐
	}
}
void main()
{
	while(1)
	{
		Dtsmg();	
	}
}
void delay1ms(void)   //误差 -0.651041666667us
{
    unsigned char a,b;
    for(b=102;b>0;b--)
        for(a=3;a>0;a--);
}

code 把数码管的段码储存在code中,可减小文件的大小,毕竟单片机的容量也才几K而已

要注意的是,一定要消影,下面就是有消影和无消影的效果

有消影

数码管_第5张图片

都正常显示,除数值外的数码管段位都是灭的

无消影

数码管_第6张图片

如图,除了数值显示外,其余的数码管段位也点亮了,只是比较暗

除此之外

我们也可以让数码管显示我们想要的数值

我们只要把数码管的段选值改成自己想显示的数值即可

u8 code smgduan[17]={0x6d,0x5b,0x3f,0x06,0x4f,0x06,0x66,0x00,
					 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//显示5201314

就像这样

数码管_第7张图片

没毛病,工科男的情调没人懂~~~

https://fxhao.github.io/
这是我的GitHub博客~

你可能感兴趣的:(数码管)