51单片机学习记录(四)数码管

1、数码管显示原理

数码管一般是由led组成的,常见的LED如下所示,我们通过搭接led就可以实现类似数码管的效果
在这里插入图片描述
数码管如下所示,一般的数码管都是8位的(7个数字位加上一个小数点的位就是8位):
在这里插入图片描述

1、单个数码管显示

可以看一个数码管的原理图,一共是十个引脚,其中有两个是一样的,实际上就是9个,一般那个引脚决定是共阳还是共阴极,如下所示:
在这里插入图片描述
那么这样我们来进行排序的话,按照上面提到的方式,如果是显示一个0的话,就是
在这里插入图片描述
那么对这8个io口就需要写入:0XFC
在这里插入图片描述
不过这里其实是高位在后,应该是:
在这里插入图片描述
如果对整段数码管赋值,就是:

unsigned char table[]={
    
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳极
unsigned char table[]={
    
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极

2、多个数码管显示

但是在实际情况下,如果一个数码管就要花掉8个IO口,那也太浪费了,所以一般使用多个数码管的时候,都是通过级联的方式来实现的,原理图如下所示:
在这里插入图片描述
上图中的led部分通过138译码器来连接实现,如下所示:
在这里插入图片描述
这里的数码管采用的共阴极的方式,阴极都连在LED的这个部分,通过138译码器来控制,其实138译码器也很好理解的,就是译码器的三个引脚的高低电平变化可以决定这8个位的状态变化,因为是三个,就是2^3=8中状态,就可以实现了。

2、静态数码管显示

1、138译码器

下面是138译码器的真值表,如下所示:
在这里插入图片描述
管脚定义如下所示:
在这里插入图片描述

根据普中教程,可以这样来设置我们要控制的引脚:

A0、 A1、 A2 输入就相当于 3 位 2 进制数, A0 是低位, A1 是次高位, A2 是高位。 而 Y0-Y7 具体哪一个输出有效电平, 就看输入二进制对应的十进制数值。 比如输入是 101(A2, A1, A0) , 其对应的十进制数是 5, 所以 Y5 输出有效电平(低电平) 。

因为单片机 IO 口外部都增加了外部上拉电阻,因此 P22、 P23、 P24 引脚默认就是高电平,这个时候默认情况下就是最后一个数码管被点亮了:

2、点亮数码管

所以编写程序如下所示:
在这里插入图片描述
其中数码管的数组这里贴一下:

u8 gsmg_code[17]={
    
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管0-f

下载,可以看到数码管被点亮
在这里插入图片描述

3、动态数码管显示

1、数码管动态显示

相信通过上面部分的了解,应该已经对数码管有了一定认识了,其实数码管就是通过我们使用138译码器来实现数码管的选择,然后在用事先准备好的电平来填充,这样就OK了。

编写数码管动态显示函数如下:
在这里插入图片描述
加入到主函数中来执行
在这里插入图片描述
下载到开发板,可以看到效果如下所示:
在这里插入图片描述
可以看到这里是一个个的执行的,我们如果想要数码管同时显示怎么办的,只要修改延时时间即可了,这里利用了人眼的视觉暂留作用来实现的,最终效果如下,可以看到基本看不出数码管的切换
在这里插入图片描述

2、编写自己的数码管驱动函数

根据前面提到的原理,可以设计自己的数码管函数如下所示,输入数码管位置还有数字
在这里插入图片描述
源码如下所示:

void smg_show(u8 num,u8 aaaa) 
{
    
    
	switch(num)//位选
	{
    
    
		case 0: LSC=1;LSB=1;LSA=1;break;
		case 1: LSC=1;LSB=1;LSA=0;break;
		case 2: LSC=1;LSB=0;LSA=1;break;
		case 3: LSC=1;LSB=0;LSA=0;break;
		case 4: LSC=0;LSB=1;LSA=1;break;
		case 5: LSC=0;LSB=1;LSA=0;break;
		case 6: LSC=0;LSB=0;LSA=1;break;
		case 7: LSC=0;LSB=0;LSA=0;break;
	}
	SMG_Port=gsmg_code[aaaa];
}

下载到开发板,最终显示效果如下所示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_51220742/article/details/125029159