静态数码管
介绍
数码管引脚定义
共阴极数码管
共阳极数码管
如下图所示,3,8口接高电平,剩下的端口接低电平LED会亮,否则LED灭。
其实一般单片机中的LED用低电平点亮比较常见,因为低电平驱动能力比较强。你想想,如果每个管脚口都用高电平驱动,那么板子上电后的压力就比较大。但是你用低电平驱动,板子只要不供电对应管脚口就可以工作,这样操作是非常方便的。
一位数码管显示原理
下图是一个一位数码管 ,八个管脚控制,每个管脚控制一个LED。
多位数码管显示原理“位选”
这是一个多位数码管,由十二个管脚口控制,12,9,8,6四个管脚口控制数码管的选择,剩下的管脚口控制数码管所亮的段。
我们可以看到每个数码管的A都接到了11口,B接到了7口……以此类推,P接到了3口。
比如我们想要让第三个数码管显示7,那么我们需要给8口一个低电平,然后11,7,4(分别对用A,B,C,即就单个数码管显示7)口给高电平。这些都是数字逻辑电路里面的内容,我们这里简要提一下
这样的操作可以节省成本,我们现在操作的是四位数码管,那么还可以延伸到更多,十六位、三十二位……只需要八个管脚口控制数码管的段,剩下的管脚口来 “位选” 所需要亮的数码管。
这样的操作也是有缺点的,我们只能实现一个数码管亮数字,不能让两个或者三个亮不同的数字。如果遇到这样的情况,则需要加入译码器来控制。 这也是数电的知识
加入38译码器后
首先说明STC89C52单片机内的数码管采用共阳极,。高电平驱动对应管脚口。
U4这个元器件是74HC245,在百度上我们可以查到它的功能。它的名字叫做双向数据缓冲器,A0接B0,A1接B1……A7接B7。VCC就是高电平的意思。 DIR是direction的简称,1代表从左边向右边传送数据,0代表从右边往左边传送数据, 原理图显示接了VCC,那就代表着数据从左往右传 ,OE应该写成CE,是chip enable的简称,就是芯片使能端,接地后工作,原理图显示接GND,那就代表着已经使能过,可以正常使用
这是一个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。那么八个输出口只需要第五个输出低电平就可以了。二进制和十进制转换如下图所示
写代码
让第七个数码管显示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;
P2_2 = 0; P2_3 = 1; P2_4 = 1; P0 = 0x7D;
#include <REGX52.H> void main() { P2_2 = 0; P2_3 = 1; P2_4 = 1; P0 = 0x7D; while(1) { } }
设计函数和数组来简化我们的操作
数码管段码表
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