静态数码管

介绍

数码管是一种简单的、廉价的显示器,由多个发光二极管封装在一起组装成的“8”字形器件。

数码管引脚定义

分为两种:共阴极和共阳极。

共阴极数码管

如下图,3,8口共同接低电平,剩下的端口当接高电平的时候LED会亮,否则LED不会亮。

image.png

共阳极数码管

如下图所示,3,8口接高电平,剩下的端口接低电平LED会亮,否则LED灭。

其实一般单片机中的LED用低电平点亮比较常见,因为低电平驱动能力比较强。你想想,如果每个管脚口都用高电平驱动,那么板子上电后的压力就比较大。但是你用低电平驱动,板子只要不供电对应管脚口就可以工作,这样操作是非常方便的。

image.png

一位数码管显示原理

下图为共阳极数码管的内部结构图。com表示共接的位置,要显示某段,首先要给公共端高电平,其次给对应管脚低电平俗称“段选”。比如我们要显示“6”,那么a,f,g,e,c,d需要点亮,即需要给他们低电平,其他管脚口不做处理。

image.png

下图是一个一位数码管 ,八个管脚控制,每个管脚控制一个LED。

image.png

多位数码管显示原理“位选”

image.png

这是一个多位数码管,由十二个管脚口控制,12,9,8,6四个管脚口控制数码管的选择,剩下的管脚口控制数码管所亮的段。

我们可以看到每个数码管的A都接到了11口,B接到了7口……以此类推,P接到了3口。

比如我们想要让第三个数码管显示7,那么我们需要给8口一个低电平,然后11,7,4(分别对用A,B,C,即就单个数码管显示7)口给高电平。这些都是数字逻辑电路里面的内容,我们这里简要提一下

这样的操作可以节省成本,我们现在操作的是四位数码管,那么还可以延伸到更多,十六位、三十二位……只需要八个管脚口控制数码管的段,剩下的管脚口来 “位选” 所需要亮的数码管。

这样的操作也是有缺点的,我们只能实现一个数码管亮数字,不能让两个或者三个亮不同的数字。如果遇到这样的情况,则需要加入译码器来控制。 这也是数电的知识

加入38译码器后

首先说明STC89C52单片机内的数码管采用共阳极,。高电平驱动对应管脚口。

image.png

U4这个元器件是74HC245,在百度上我们可以查到它的功能。它的名字叫做双向数据缓冲器,A0接B0,A1接B1……A7接B7。VCC就是高电平的意思。 DIR是direction的简称,1代表从左边向右边传送数据,0代表从右边往左边传送数据, 原理图显示接了VCC,那就代表着数据从左往右传 ,OE应该写成CE,是chip enable的简称,就是芯片使能端,接地后工作,原理图显示接GND,那就代表着已经使能过,可以正常使用

image.png

这是一个38译码器,名字叫做74HC138,数电里面会讲到它的使用方法,这里简要介绍一下。A、B、C口是输入端,Y0、Y1……Y7是输出端,G1,G2A,G2B是使能端(说人话就是一个电源开关,G1高电平,G2A、B接低电平才能打开,我们的原理显示已经按照要求接了,所以这个译码器相当于已经打开了, 可以正常使用)

A,B,C如果用二进制来表示,可以表示8个十(或者八)进制数。比如A,B,C输入为1,0,1,对应的十进制数就是5。那么八个输出口只需要第五个输出低电平就可以了。二进制和十进制转换如下图所示

image.png

写代码

让第七个数码管显示6

先建好工程,像以前一样。

先考虑如何显示6,我们需要让a,c,d,e,f亮,b和dp灭。由于我们是共阴极,所以高电平驱动灯亮,那么a,c,d,e,f就是1,剩下的就是0,则P00~P07就是1011 1110。

数据高位对应端口高位,P0可以直接赋值 0111 1101,对应十六进制就是7D

P0 = 0x7D;

image.png

接下来分析第六个数码管,代码如下

	 P2_2 = 0;
	 P2_3 = 1;
	 P2_4 = 1;
	 P0 = 0x7D;

image.png

完整程序如下

#include <REGX52.H>
 void main()
 {
	 P2_2 = 0;
	 P2_3 = 1;
	 P2_4 = 1;
	 P0 = 0x7D;
	while(1)
	{
        	}
 }

现象如下

image.png

设计函数和数组来简化我们的操作

数码管段码表

0 1 3 4 5 6 7 8 9

0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x6F,

A B C D E F 空

0x77, 0x7C, 0x39, 0x5E,0x79, 0x71,0x00,

工程代码

Nixie是数码的英文(这种表达挺少见的),我们把数码管的段码表写进数组NixieTable,然后通过下标来读取对应段码赋值给P0,就能显示对应数字。

用switch语句来选择数码管的位置。具体就不详细说了。

#include <REGX52.H>

unsigned char NixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, \
			0x6D, 0x7D, 0x07, 0x6F, 0x77, 0x7C, 0x39, 0x5E,0x79, 0x71,0x00};
//NixieTable这个数组存放着每个数字对应的数码管管脚值
			
			
void NixieTube(unsigned char Location,Number)
//Location代表所亮数码管的位置,Number代表数码管亮的数字
{
	switch(Location)
	{
		case 1:P2_4 = 1;P2_3 = 1;P2_2 = 1;break;
		case 2:P2_4 = 1;P2_3 = 1;P2_2 = 0;break;
		case 3:P2_4 = 1;P2_3 = 0;P2_2 = 1;break;
		case 4:P2_4 = 1;P2_3 = 0;P2_2 = 0;break;
		case 5:P2_4 = 0;P2_3 = 1;P2_2 = 1;break;
		case 6:P2_4 = 0;P2_3 = 1;P2_2 = 0;break;
		case 7:P2_4 = 0;P2_3 = 0;P2_2 = 1;break;
		case 8:P2_4 = 0;P2_3 = 0;P2_2 = 0;break;
	}
	P0 = NixieTable[Number];
}

 void main()
 {
	NixieTube(6,12);
	while(1)
	{
			
	}
 }

————————————————

版权声明:本文为CSDN博主「孤心亦暖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Destiny_Di/article/details/126825379